add sorting options to documents/dossiers searches (#931)

This commit is contained in:
Frédéric Péters 2011-11-22 12:34:50 +01:00
parent ee9030f5fc
commit 0ddc19292e
1 changed files with 102 additions and 18 deletions

View File

@ -25,6 +25,8 @@ from plone.formwidget.contenttree import ObjPathSourceBinder
from tabellio.searchform.interfaces import MessageFactory as _
import Missing
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.schema.interfaces import IContextSourceBinder
@ -188,6 +190,10 @@ class IFolderWithDocuments(interface.Interface):
class IFolderWithPfbDocuments(interface.Interface):
pass
def cmp_term(x, y):
from plone.i18n.normalizer.fr import normalizer
return cmp(normalizer.normalize(x.title), normalizer.normalize(y.title))
@grok.provider(IContextSourceBinder)
def possible_document_types(context):
catalog = getToolByName(context, 'portal_catalog')
@ -199,6 +205,7 @@ def possible_document_types(context):
doctype_id = doctype.encode('ascii', 'replace')
doctype_str = MAPPING.get(doctype, doctype)
terms.append(SimpleVocabulary.createTerm(doctype_id, doctype_id, doctype_str))
terms.sort(cmp_term)
return SimpleVocabulary(terms)
def get_docdos_type_id(context, type_id):
@ -227,6 +234,7 @@ def possible_dossier_types(context):
dostype_id = dostype.encode('ascii', 'replace')
dostype_str = MAPPING.get(dostype, dostype)
terms.append(SimpleVocabulary.createTerm(dostype_id, dostype_id, dostype_str))
terms.sort(cmp_term)
return SimpleVocabulary(terms)
@grok.provider(IContextSourceBinder)
@ -240,6 +248,7 @@ def possible_question_types(context):
questype_id = questype.encode('ascii', 'replace')
questype_str = MAPPING.get(questype, questype)
terms.append(SimpleVocabulary.createTerm(questype_id, questype_id, questype_str))
terms.sort(cmp_term)
return SimpleVocabulary(terms)
@grok.provider(IContextSourceBinder)
@ -297,6 +306,10 @@ class IDocumentSearch(interface.Interface):
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
sort_on = schema.Choice(title=_(u'Sort By'), required=True,
default=_(u'Session'),
values=[_(u'Session'), _(u'Type'), _(u'Number')])
class DocumentSearchForm(form.Form):
method = 'get'
@ -305,6 +318,7 @@ class DocumentSearchForm(form.Form):
fields['authors'].widgetFactory = FieldAuthorsWidget
fields['polgroups'].widgetFactory = FieldPolgroupsWidget
fields['topics'].widgetFactory = FieldTopicsWidget
fields['sort_on'].widgetFactory = FieldRadioboxesWidget
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_effectivesearch.pt')
@ -340,6 +354,10 @@ class IDossierSearch(interface.Interface):
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
sort_on = schema.Choice(title=_(u'Sort By'), required=True,
default=_(u'Session'),
values=[_(u'Session'), _(u'Type'), _(u'Number')])
class DossierSearchForm(form.Form):
prefix = 'dossier'
@ -349,6 +367,7 @@ class DossierSearchForm(form.Form):
fields['participants'].widgetFactory = FieldAuthorsWidget
fields['polgroups'].widgetFactory = FieldPolgroupsWidget
fields['topics'].widgetFactory = FieldTopicsWidget
fields['sort_on'].widgetFactory = FieldRadioboxesWidget
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_dossier_search.pt')
@ -380,6 +399,10 @@ class IQuestionSearch(interface.Interface):
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
sort_on = schema.Choice(title=_(u'Sort By'), required=True,
default=_(u'Session'),
values=[_(u'Session'), _(u'Type')])
class QuestionSearchForm(form.Form):
prefix = 'question'
@ -387,6 +410,7 @@ class QuestionSearchForm(form.Form):
fields['authors'].widgetFactory = FieldAuthorsWidget
fields['polgroups'].widgetFactory = FieldPolgroupsWidget
fields['topics'].widgetFactory = FieldTopicsWidget
fields['sort_on'].widgetFactory = FieldRadioboxesWidget
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_question_search.pt')
@ -426,8 +450,8 @@ class IDocumentPfbSearch(interface.Interface):
end = schema.Date(title=_(u'End'), required=False)
sort_on = schema.Choice(title=_(u'Sort By'), required=True,
default=_(u'Type'),
values=[_(u'Type'), _(u'Number'), _(u'Session')])
default=_(u'Session'),
values=[_(u'Session'), _(u'Type'), _(u'Number')])
class DocumentPfbSearchForm(form.Form):
@ -684,16 +708,6 @@ class SearchView(BrowserView):
if data.get('decreted'):
kw['decreted'] = data.get('decreted')
if data.get('sort_on') == 'Type':
kw['sort_on'] = 'doctype'
kw['sort_order'] = 'ascending'
elif data.get('sort_on') == 'Number':
kw['sort_on'] = 'no'
kw['sort_order'] = 'ascending'
elif data.get('sort_on') == 'Session':
kw['sort_on'] = 'session'
kw['sort_order'] = 'descending'
if not kw and not data.get('text'):
return []
@ -708,15 +722,85 @@ class SearchView(BrowserView):
elif data.get('search_type_is_question'):
kw['portal_type'] = 'tabellio.documents.question'
if not kw.get('sort_on'):
kw['sort_on'] = 'dateDoc'
kw['sort_order'] = 'descending'
from plone.i18n.normalizer.fr import normalizer
def cmp_doctype(x, y):
if not (x.doctype is None or y.doctype is None or
x.doctype is Missing.Value or y.doctype is Missing.Value):
type_x = normalizer.normalize(MAPPING.get(x.doctype, x.doctype))
type_y = normalizer.normalize(MAPPING.get(y.doctype, y.doctype))
t = cmp(type_x, type_y)
else:
t = -cmp(x.doctype, y.doctype)
if t == 0:
t = -cmp(x.session, y.session)
if t == 0:
t = -cmp(x.no, y.no)
if t == 0:
t = cmp(x.nodoc, y.nodoc)
return t
print 'kw:', kw
print '--'
def get_no_as_int(i):
if i:
return int(i.split('-')[0])
return 0
def cmp_dostype(x, y):
if not (x.dostype is None or y.dostype is None or
x.dostype is Missing.Value or y.dostype is Missing.Value):
type_x = normalizer.normalize(MAPPING.get(x.dostype, x.dostype))
type_y = normalizer.normalize(MAPPING.get(y.dostype, y.dostype))
else:
t = -cmp(x.dostype, y.dostype)
t = cmp(type_x, type_y)
if t == 0:
t = -cmp(x.session, y.session)
if t == 0:
t = -cmp(x.no, y.no)
return t
def cmp_questype(x, y):
if not (x.questype is None or y.questype is None or
x.questype is Missing.Value or y.questype is Missing.Value):
type_x = normalizer.normalize(MAPPING.get(x.questype, x.questype))
type_y = normalizer.normalize(MAPPING.get(y.questype, y.questype))
else:
t = -cmp(x.questype, y.questype)
t = cmp(type_x, type_y)
if t == 0:
t = -cmp(x.session, y.session)
if t == 0:
t = -cmp(x.dateDoc, y.dateDoc)
return t
def cmp_number(x, y):
t = -cmp(get_no_as_int(x.no), get_no_as_int(y.no))
if t == 0:
t = -cmp(x.session, y.session)
if t == 0:
t = cmp(x.nodoc, y.nodoc)
return t
def cmp_session(x, y):
t = -cmp(x.session, y.session)
if t == 0:
t = -cmp(get_no_as_int(x.no), get_no_as_int(y.no))
return t
cmp_function = None
if data.get('sort_on') == 'Type':
if data.get('search_type_is_document'):
cmp_function = cmp_doctype
elif data.get('search_type_is_dossier'):
cmp_function = cmp_dostype
elif data.get('search_type_is_question'):
cmp_function = cmp_questype
elif data.get('sort_on') == 'Number':
cmp_function = cmp_number
elif data.get('sort_on') == 'Session':
cmp_function = cmp_session
catalog = getToolByName(self.context, 'portal_catalog')
return catalog(**kw)
return sorted(catalog(**kw), cmp_function)
def deputy_search_form(self):
f = DeputySearchForm(self.context, self.request)