--- 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