diff --git a/tabellio/searchform/configure.zcml b/tabellio/searchform/configure.zcml index 51eaaf2..e5f9b93 100644 --- a/tabellio/searchform/configure.zcml +++ b/tabellio/searchform/configure.zcml @@ -26,6 +26,18 @@ class=".form.ListAuthorsView" permission="zope2.View"/> + + + + + + + diff --git a/tabellio/searchform/docsearch.pt b/tabellio/searchform/docsearch.pt index ab9431f..a183fd2 100644 --- a/tabellio/searchform/docsearch.pt +++ b/tabellio/searchform/docsearch.pt @@ -126,7 +126,7 @@
diff --git a/tabellio/searchform/form.py b/tabellio/searchform/form.py index 66a877e..f7ad29f 100644 --- a/tabellio/searchform/form.py +++ b/tabellio/searchform/form.py @@ -61,6 +61,57 @@ class ListAuthorsView(BrowserView): s.append(object) return '\n'.join(['%s|%s' % (x.Title(), x.id) for x in s]) +class ListPolgroupsView(BrowserView): + def get_folder_at_path(self, path): + current = self.portal + for part in path.split('/'): + if not part: + continue + current = getattr(current, part) + return current + + _polgroups_folder = None + def polgroups_folder(self): + if self._polgroups_folder: + return self._polgroups_folder + path = self.settings.polgroupsPath + self._polgroups_folder = self.get_folder_at_path(path) + return self._polgroups_folder + polgroups_folder = property(polgroups_folder) + + def __call__(self): + self.portal = getToolByName(self.context, 'portal_url').getPortalObject() + self.settings = component.getUtility(IRegistry).forInterface(ITabellioSettings, False) + + self.request.response.setHeader('Content-type', 'text/plain') + s = [] + q = self.request.form.get('q').lower() + for object in self.polgroups_folder.objectValues(): + if object.portal_type != 'themis.datatypes.polgroup': + continue + if q in object.id or q in object.Title().lower(): + s.append(object) + return '\n'.join(['%s|%s' % (x.Title(), x.id) for x in s]) + + +class ListTopicsView(BrowserView): + def __call__(self): + from plone.i18n.normalizer.fr import normalizer + query_terms = [normalizer.normalize(x).lower() for x in self.request.form.get('q').split()] + topics = tabellio.config.utils.get_topics_dict() + self.request.response.setHeader('Content-type', 'text/plain') + r = [] + for key, value in topics.items(): + for term in query_terms: + if not term in value[1]: + break + else: + r.append('%s|%s' % (value[0], key)) + if len(r) > 30: + break + return '\n'.join(sorted(r)) + + class IAuthorsWidget(ITextWidget): pass @@ -68,10 +119,28 @@ class AuthorsWidget(text.TextWidget): implements(IAuthorsWidget) klass = u'authors' - def FieldAuthorsWidget(field, request): return widget.FieldWidget(field, AuthorsWidget(request)) +class IPolgroupsWidget(ITextWidget): + pass + +class PolgroupsWidget(text.TextWidget): + implements(IPolgroupsWidget) + klass = u'polgroups' + +def FieldPolgroupsWidget(field, request): + return widget.FieldWidget(field, PolgroupsWidget(request)) + +class ITopicsWidget(ITextWidget): + pass + +class TopicsWidget(text.TextWidget): + implements(ITopicsWidget) + klass = u'topics' + +def FieldTopicsWidget(field, request): + return widget.FieldWidget(field, TopicsWidget(request)) class IFolderWithDocuments(interface.Interface): pass @@ -130,12 +199,11 @@ class IDocumentSearch(interface.Interface): nosuite = schema.TextLine(title=_(u'Suite Number'), required=False) doctype = schema.Choice(title=_(u'Type'), required=False, source=possible_document_types) - #subjects = ttitle = schema.TextLine(title=_(u'Title'), required=False) text = schema.TextLine(title=_(u'Text'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - - # polgroups + polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) start = schema.Date(title=_(u'Start'), required=False) @@ -147,6 +215,8 @@ class DocumentSearchForm(form.Form): prefix = 'document' fields = field.Fields(IDocumentSearch) fields['authors'].widgetFactory = FieldAuthorsWidget + fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_effectivesearch.pt') @@ -170,10 +240,10 @@ class IDossierSearch(interface.Interface): nodos = schema.TextLine(title=_(u'Dossier Number'), required=False) dostype = schema.Choice(title=_(u'Type'), required=False, source=possible_dossier_types) - #subjects = ttitle = schema.TextLine(title=_(u'Title'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - # polgroups + polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) start = schema.Date(title=_(u'Start'), required=False) @@ -185,6 +255,8 @@ class DossierSearchForm(form.Form): method = 'get' fields = field.Fields(IDossierSearch) fields['authors'].widgetFactory = FieldAuthorsWidget + fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_dossier_search.pt') @@ -207,10 +279,10 @@ class IQuestionSearch(interface.Interface): questype = schema.Choice(title=_(u'Type'), required=False, source=possible_question_types) - #subjects = ttitle = schema.TextLine(title=_(u'Title'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - # polgroups + polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) start = schema.Date(title=_(u'Start'), required=False) @@ -221,6 +293,8 @@ class QuestionSearchForm(form.Form): prefix = 'question' fields = field.Fields(IQuestionSearch) fields['authors'].widgetFactory = FieldAuthorsWidget + fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_question_search.pt') @@ -244,11 +318,11 @@ class IDocumentPfbSearch(interface.Interface): nodoc = schema.TextLine(title=_(u'Document Number'), required=False) doctype = schema.Choice(title=_(u'Type'), required=False, source=possible_document_types) - #subjects = ttitle = schema.TextLine(title=_(u'Title'), required=False) text = schema.TextLine(title=_(u'Text'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - # polgroups + polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) start = schema.Date(title=_(u'Start'), required=False) @@ -260,8 +334,11 @@ class IDocumentPfbSearch(interface.Interface): class DocumentPfbSearchForm(form.Form): method = 'get' + prefix = 'document' fields = field.Fields(IDocumentPfbSearch) fields['authors'].widgetFactory = FieldAuthorsWidget + fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_pfbdocsearch.pt') @@ -296,11 +373,11 @@ class IGlobalSearchForm(interface.Interface): questype = schema.Choice(title=_(u'Type'), required=False, source=possible_question_types) - #subjects = ttitle = schema.TextLine(title=_(u'Title'), required=False) text = schema.TextLine(title=_(u'Text'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - # polgroups + polgroups = schema.TextLine(title=_(u'Poltical Groups'), required=False) + topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) start = schema.Date(title=_(u'Start'), required=False) @@ -315,7 +392,7 @@ class SearchView(BrowserView): batch_macros = ViewPageTemplateFile('batch_macros.pt') def search_results(self, search_type): - + print 'search type:', search_type if self.request.form.get('document.widgets.search_type_is_document'): GlobalSearchForm.prefix = 'document' elif self.request.form.get('dossier.widgets.search_type_is_dossier'): @@ -327,12 +404,14 @@ class SearchView(BrowserView): f.update() data, errors = f.extractData() + print 'got data:', data kw = {} print 'data:', data if not data.get('search_type_is_%s' % search_type): + print ' stopping here' return None if data.get('ttitle'): @@ -367,7 +446,12 @@ class SearchView(BrowserView): 'operator': 'and'} if data.get('polgroups'): - pass # XXX : kw['polgroupsDoc'] = {'query': ['ps', 'ecolo'], 'operator': 'and'} + kw['polgroupsDoc'] = {'query': data.get('polgroups').strip().split(), + 'operator': 'and'} + + if data.get('topics'): + kw['topics'] = {'query': data.get('topics').strip().split(), + 'operator': 'and'} if data.get('sort_on') == 'Type': kw['sort_on'] = 'doctype' diff --git a/tabellio/searchform/polgroups_input.pt b/tabellio/searchform/polgroups_input.pt new file mode 100644 index 0000000..f0e7bfc --- /dev/null +++ b/tabellio/searchform/polgroups_input.pt @@ -0,0 +1,6 @@ + + + + diff --git a/tabellio/searchform/topics_input.pt b/tabellio/searchform/topics_input.pt new file mode 100644 index 0000000..7e71909 --- /dev/null +++ b/tabellio/searchform/topics_input.pt @@ -0,0 +1,6 @@ + + + +