first step of title search in list of records
authorcavaliet
Wed, 28 Aug 2013 13:36:31 +0200
changeset 4 047675624f45
parent 3 63c5437a9b7d
child 5 62e97cd13730
first step of title search in list of records
src/p4l/forms.py
src/p4l/models/data.py
src/p4l/static/p4l/css/p4l.css
src/p4l/templates/p4l/p4l_base.html
src/p4l/templates/p4l/p4l_home.html
src/p4l/templatetags/__init__.py
src/p4l/templatetags/p4lstringfilters.py
src/p4l/views.py
--- a/src/p4l/forms.py	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/forms.py	Wed Aug 28 13:36:31 2013 +0200
@@ -9,8 +9,10 @@
 from django.contrib.auth.forms import (UserChangeForm as AuthUserChangeForm, 
     UserCreationForm as AuthUserCreationForm)
 from django.core.exceptions import ValidationError
-from django.forms.fields import ChoiceField
+from django.forms import Form
+from django.forms.fields import ChoiceField, CharField
 from django.utils.translation import ugettext as _
+from .models import Record
 
 
 User = get_user_model()
@@ -34,3 +36,15 @@
     language = ChoiceField(label=_("language"), choices=[(k,_(v)) for k,v in settings.LANGUAGES], initial=settings.LANGUAGE_CODE[:2])
     class Meta:
         model = User
+
+
+class RecordFilterForm(Form):
+    title = CharField(required=True, min_length=1)
+    def get_filter_qs(self, qs=None):
+        if qs is None:
+            qs = Record.objects.select_related("language").prefetch_related('titles')  # @UndefinedVariable
+        t = self.cleaned_data.get('title',None)
+        if t:
+            qs = qs.filter(titles__title__icontains=t)
+        return qs
+
--- a/src/p4l/models/data.py	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/models/data.py	Wed Aug 28 13:36:31 2013 +0200
@@ -162,16 +162,16 @@
 
 class Record(P4lModel):
     uri = models.URLField(max_length=2048, unique=True, db_index=True) #subject
-    subjects = models.ManyToManyField('p4l.Subject') #dct:subject
-    themes = models.ManyToManyField('p4l.Theme') #iiep:theme
-    countries = models.ManyToManyField('p4l.Country') #iiep:country
+    subjects = models.ManyToManyField('p4l.Subject') #dct:subject                                                       # Thesaurus with no country
+    themes = models.ManyToManyField('p4l.Theme') #iiep:theme                                                            # Theme
+    countries = models.ManyToManyField('p4l.Country') #iiep:country                                                     # Thesaurus filtered with country only
     identifier = models.CharField(max_length=128, unique=True, db_index=True) #dct:identifier    
     notes = models.TextField(blank=True, null=True) #iiep:notes    
     #issns foreign key from Isbn #iiep:issn
     #isbns foreign key from Isbn #iiep:isbn
     #documentCodes foreign key from Isbn #iiep:documentCode
-    language = models.ForeignKey('p4l.Language', blank=True, null=True) #dct:language
-    otherLanguages = models.ManyToManyField('p4l.Language', related_name='otherLanguage_record') #iiep:otherLanguage
+    language = models.ForeignKey('p4l.Language', blank=True, null=True) #dct:language                                    # Language
+    otherLanguages = models.ManyToManyField('p4l.Language', related_name='otherLanguage_record') #iiep:otherLanguage     # Language
     #titles foreign Key from Title #dct:title
     #addedTitles foreign Key from AddedTitle #iiep:addedTitle
     #titlesMainDocument foreign Key from TitleMainDocument #iiep:titleMainDocument
@@ -185,9 +185,9 @@
     series = models.ManyToManyField('p4l.Serie', through='p4l.RecordSerie')  #iiep:serie
     authors = models.ManyToManyField('p4l.Author') #iiep:author
     subjectPersons = models.ManyToManyField('p4l.SubjectPerson') #iiep:subjectPerson
-    subjectCorporateBodies = models.ManyToManyField('p4l.CorporateBody') #iiep:subjectCorporateBody
+    subjectCorporateBodies = models.ManyToManyField('p4l.CorporateBody') #iiep:subjectCorporateBody                       # Organisation ?
     subjectMeetings = models.ManyToManyField('p4l.SubjectMeeting') #iiep:subjectMeeting
-    corporateAuthors = models.ManyToManyField('p4l.CorporateAuthor') #iiep:corporateAuthor
+    corporateAuthors = models.ManyToManyField('p4l.CorporateAuthor') #iiep:corporateAuthor                                # Organisation ?
     #urls foreign Key from Url #iiep:url
     recordType = models.URLField(max_length=2048) #dct:type
     isDocumentPart = models.BooleanField() #iiep:isDocumentPart
--- a/src/p4l/static/p4l/css/p4l.css	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/static/p4l/css/p4l.css	Wed Aug 28 13:36:31 2013 +0200
@@ -6,3 +6,6 @@
   margin: 0 auto;
   width: 950px;
 }
+.table thead td:first-letter {
+    text-transform: uppercase;
+}
--- a/src/p4l/templates/p4l/p4l_base.html	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/templates/p4l/p4l_base.html	Wed Aug 28 13:36:31 2013 +0200
@@ -34,7 +34,7 @@
     {% endblock %}
 	</div>
     {% block js_common %}
-    <script type="text/javascript" src="{% static 'p4l/js/bootstrap.min.js' %}"></script>
+    <!--script type="text/javascript" src="{% static 'p4l/js/bootstrap.min.js' %}"></script-->
     {% endblock %}
     {% block js_page %}
     {% endblock %}
--- a/src/p4l/templates/p4l/p4l_home.html	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/templates/p4l/p4l_home.html	Wed Aug 28 13:36:31 2013 +0200
@@ -1,6 +1,7 @@
 {% extends "p4l/p4l_base.html" %}
 {% load static %}
 {% load i18n %}
+{% load p4lstringfilters %}
 
 {% block content %}
 <h3>{% trans 'Record List' %}</h3>
@@ -8,26 +9,30 @@
 <div class="pagination pull-right">
     <span class="page-links">
         {% if page_obj.has_previous %}
-            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
+            <a href="?page={{ page_obj.previous_page_number }}{% for k,v in filter_params.items %}&{{k}}={{v}}{% endfor %}">previous</a>
         {% endif %}
         <span class="page-current">
             Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
         </span>
         {% if page_obj.has_next %}
-            <a href="?page={{ page_obj.next_page_number }}">next</a>
+            <a href="?page={{ page_obj.next_page_number }}{% for k,v in filter_params.items %}&{{k}}={{v}}{% endfor %}">next</a>
         {% endif %}
     </span>
 </div>
 {% endif %}
 <table class="table">
   <thead>
-    <tr><td>#</td><td>URI</td></tr>
+    <tr><td>URI</td><td>lang.</td><td>{% trans 'title' %}</td><td>{% trans 'actions' %}</td></tr>
   </thead>
   <tbody>
   {% for record in object_list %}
     <tr>
-      <td>{{ forloop.counter }}</td>
-      <td>{{ record.uri }}</td>
+      <td title="{{ record.uri }}">{{ record.uri|reduce:"4,13" }}</td>
+      <td title="{{ record.language.language }}">{{ record.language.language|reduce:"0,3" }}</td>
+      <td><ul>{% for t in record.titles.all %}
+          <li>{{ t.title }}</li>
+          {% endfor %}</ul></td>
+      <td><a class="btn btn-default" href="#"><i class="glyphicon glyphicon-eye-open"></i></a><a class="btn btn-default" href="#"><i class="glyphicon glyphicon-pencil"></i></a></td>
     </tr>
   {% empty %}
     <tr><td>{% trans 'No record' %}</td></tr>
@@ -36,17 +41,26 @@
 </table>
 {% if is_paginated %}
 <div class="pagination pull-right">
+    {{filter_params}}
     <span class="page-links">
         {% if page_obj.has_previous %}
-            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
+            <a href="?page={{ page_obj.previous_page_number }}{% for k,v in filter_params.items %}&{{k}}={{v}}{% endfor %}">previous</a>
         {% endif %}
         <span class="page-current">
             Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
         </span>
         {% if page_obj.has_next %}
-            <a href="?page={{ page_obj.next_page_number }}">next</a>
+            <a href="?page={{ page_obj.next_page_number }}{% for k,v in filter_params.items %}&{{k}}={{v}}{% endfor %}">next</a>
         {% endif %}
     </span>
 </div>
 {% endif %}
+<div>
+  <form method="GET">
+    <ul id='term-filter-field-list'>
+      {{ filter_form.as_ul }}
+      <li><input type="submit" value="{% trans 'Search' %}" /></li>
+    </ul>
+  </form>
+</div>
 {% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/p4l/templatetags/p4lstringfilters.py	Wed Aug 28 13:36:31 2013 +0200
@@ -0,0 +1,19 @@
+from django.template import Library
+from django.template.defaultfilters import stringfilter
+from django.utils.safestring import SafeData
+
+register = Library()
+
+
+@register.filter(is_safe=True, needs_autoescape=True)
+@stringfilter
+def reduce(value, nbs, autoescape=None):
+    """
+    Replace a string by "..." and its last characters. Usefull to display strings where end matters
+    """
+    autoescape = autoescape and not isinstance(value, SafeData)
+    # nbs is "nb_char_start,nb_char_end"
+    a = nbs.split(",")
+    nb_start = int(a[0])
+    nb_end = int(a[1])
+    return value[:nb_start] + "..." + value[-nb_end:]
--- a/src/p4l/views.py	Wed Aug 28 11:16:03 2013 +0200
+++ b/src/p4l/views.py	Wed Aug 28 13:36:31 2013 +0200
@@ -12,37 +12,33 @@
 from django.views.generic import ListView#, DetailView, View
 #from django.views.generic.list import MultipleObjectMixin
 from .models import Record
+from .forms import RecordFilterForm
 import logging
 
 logger = logging.getLogger(__name__)
 
 class RecordListView(ListView):
     
-    queryset = Record.objects.select_related()  # @UndefinedVariable
+    queryset = Record.objects.select_related("language").prefetch_related('titles')  # @UndefinedVariable
     paginate_by = settings.NB_RECORDS_BY_PAGE
-    #paginator_class = JocondePaginator
     template_name = "p4l/p4l_home.html"
-    #filter_form_class = TermFilterForm
+    form_class = RecordFilterForm
+    
     
-#    def get_filter_form(self):
-#        initial = { 'order_by':'label',
-#                    'order_dir': 'asc',
-#                    'thesaurus': None,
-#                    'label': None,
-#                    'link_status': -1,
-#                    'validated': None}
-#        return self.filter_form_class(self.request.GET, initial=initial, auto_id=True)
-#    
-#    def get_context_data(self, **kwargs):
-#        context = ListView.get_context_data(self, **kwargs)
-#        context['filter_form'] = self.get_filter_form()
-#        context['term_tree_valid_thesaurus'] = json.dumps([entry['thesaurus__id'] for entry in Term.objects.root_nodes().values('thesaurus__id').annotate(root_nodes_count=Count('thesaurus__id')).order_by().filter(root_nodes_count__lt=settings.JOCONDE_TERM_TREE_MAX_ROOT_NODE)])  # @UndefinedVariable
-#        return context
-#    
-#    def get_queryset(self):
-#        qs = super(TermListView, self).get_queryset()
-#        filter_form = self.get_filter_form()
-#        if filter_form.is_valid():
-#            return filter_form.get_filter_qs(qs)
-#        else:
-#            return None
+    def get_context_data(self, **kwargs):
+        context = ListView.get_context_data(self, **kwargs)
+        context['filter_form'] = self.form_class()
+        # Add filter params from GET params
+        filter_params = {}
+        if 'title' in self.request.GET:
+            filter_params['title'] = self.request.GET['title']
+        context['filter_params'] = filter_params
+        return context
+    
+    def get_queryset(self):
+        qs = super(RecordListView, self).get_queryset()
+        filter_form = self.form_class(self.request.GET)
+        if filter_form.is_valid():
+            return filter_form.get_filter_qs(qs)
+        else:
+            return qs