diff --git a/tabellio/searchform/docsearch.pt b/tabellio/searchform/docsearch.pt index 22b20cf..ead9ea1 100644 --- a/tabellio/searchform/docsearch.pt +++ b/tabellio/searchform/docsearch.pt @@ -186,6 +186,7 @@ + diff --git a/tabellio/searchform/droppable-checkbox-widget-input.pt b/tabellio/searchform/droppable-checkbox-widget-input.pt new file mode 100644 index 0000000..29d4032 --- /dev/null +++ b/tabellio/searchform/droppable-checkbox-widget-input.pt @@ -0,0 +1,75 @@ + +
+ + + + +
+ + diff --git a/tabellio/searchform/form.py b/tabellio/searchform/form.py index 4896df4..9099cbb 100644 --- a/tabellio/searchform/form.py +++ b/tabellio/searchform/form.py @@ -16,7 +16,7 @@ from z3c.form.ptcompat import ViewPageTemplateFile import z3c.form.interfaces from z3c.form.browser import text from z3c.form import widget -from z3c.form.interfaces import ITextWidget +from z3c.form.interfaces import ITextWidget, ICheckBoxWidget from z3c.form.browser.checkbox import CheckBoxWidget from z3c.form.browser.radio import RadioWidget @@ -183,15 +183,27 @@ def FieldPolgroupsWidget(field, request): class ITopicsWidget(ITextWidget): pass +class IDroppableCheckBoxWidget(ICheckBoxWidget): + pass + class TopicsWidget(text.TextWidget): implements(ITopicsWidget) klass = u'topics' +class DroppableCheckBoxWidget(CheckBoxWidget): + implements(IDroppableCheckBoxWidget) + input_template = ViewPageTemplateFile('droppable-checkbox-widget-input.pt') + + def render(self): + if self.mode == z3c.form.interfaces.INPUT_MODE: + return self.input_template(self) + return CheckBoxWidget.render(self) + def FieldTopicsWidget(field, request): return widget.FieldWidget(field, TopicsWidget(request)) def FieldDroppedCheckboxWidget(field, request): - return widget.FieldWidget(field, CheckBoxWidget(request)) + return widget.FieldWidget(field, DroppableCheckBoxWidget(request)) def FieldRadioboxesWidget(field, request): return widget.FieldWidget(field, RadioWidget(request)) @@ -228,7 +240,8 @@ def get_docdos_type_id(context, type_id): catalog = getToolByName(context, 'portal_catalog') possible_doctypes = catalog.uniqueValuesFor('doctype') possible_dostypes = catalog.uniqueValuesFor('dostype') - for iter_type_id in (possible_dostypes + possible_doctypes): + possible_questypes = catalog.uniqueValuesFor('questype') + for iter_type_id in (possible_dostypes + possible_doctypes + possible_questypes): if iter_type_id is None: continue rep_id = iter_type_id.encode('ascii', 'replace') @@ -275,8 +288,6 @@ def possible_sessions(context): @grok.provider(IContextSourceBinder) def possible_polgroups(context): - terms = [] - current = getToolByName(context, 'portal_url').getPortalObject() settings = component.getUtility(IRegistry).forInterface(ITabellioSettings, False) for part in settings.polgroupsPath.split('/'): @@ -284,13 +295,20 @@ def possible_polgroups(context): continue current = getattr(current, part) + active_groups = [] + inactive_groups = [] for object in current.objectValues(): if object.portal_type != 'themis.datatypes.polgroup': continue polgroup_id = object.id polgroup_str = object.Title() - terms.append(SimpleVocabulary.createTerm(polgroup_id, polgroup_id, polgroup_str)) - return SimpleVocabulary(terms) + if object.active: + active_groups.append(SimpleVocabulary.createTerm(polgroup_id, polgroup_id, polgroup_str)) + else: + inactive_groups.append(SimpleVocabulary.createTerm(polgroup_id, polgroup_id, polgroup_str)) + # keep active groups ordered by their position + inactive_groups.sort(cmp_term) + return SimpleVocabulary(active_groups + inactive_groups) @grok.provider(IContextSourceBinder) def possible_active_polgroups(context): @@ -330,12 +348,15 @@ class IDocumentSearch(interface.Interface): search_type_is_document = schema.TextLine(title=u'Search Type', default=u'1', required=False) nodoc = schema.TextLine(title=_(u'Document Number'), required=False) nosuite = schema.TextLine(title=_(u'Suite Number'), required=False) - doctype = schema.Choice(title=_(u'Document Type'), required=False, - source=possible_document_types) + l_doctypes = schema.List(title=_(u'Document Type'), required=False, + value_type=schema.Choice(title=_(u'Type'), required=False, + source=possible_document_types)) 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 = schema.TextLine(title=_(u'Political Groups'), required=False) + l_polgroups = schema.List(title=_(u'Political Groups'), required=False, + value_type=schema.Choice(title=_(u'Political Group'), + required=False, source=possible_polgroups)) topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) @@ -352,8 +373,9 @@ class DocumentSearchForm(form.Form): prefix = 'document' fields = field.Fields(IDocumentSearch) fields['authors'].widgetFactory = FieldAuthorsWidget - fields['polgroups'].widgetFactory = FieldPolgroupsWidget fields['topics'].widgetFactory = FieldTopicsWidget + fields['l_doctypes'].widgetFactory = FieldDroppedCheckboxWidget + fields['l_polgroups'].widgetFactory = FieldDroppedCheckboxWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_form.pt') @@ -370,11 +392,14 @@ class IDossierSearch(interface.Interface): search_type_is_dossier = schema.TextLine(title=u'Search Type', default=u'1', required=False) nodos = schema.TextLine(title=_(u'Dossier Number'), required=False) - dostype = schema.Choice(title=_(u'Dossier Type'), required=False, - source=possible_dossier_types) + l_dostypes = schema.List(title=_(u'Dossier Type'), required=False, + value_type=schema.Choice(title=_(u'Type'), required=False, + source=possible_dossier_types)) ttitle = schema.TextLine(title=_(u'Title'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + l_polgroups = schema.List(title=_(u'Political Groups'), required=False, + value_type=schema.Choice(title=_(u'Political Group'), + required=False, source=possible_polgroups)) participants = schema.TextLine(title=_(u'Participants'), required=False) topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, @@ -395,7 +420,8 @@ class DossierSearchForm(form.Form): fields = field.Fields(IDossierSearch) fields['authors'].widgetFactory = FieldAuthorsWidget fields['participants'].widgetFactory = FieldAuthorsWidget - fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['l_dostypes'].widgetFactory = FieldDroppedCheckboxWidget + fields['l_polgroups'].widgetFactory = FieldDroppedCheckboxWidget fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_form.pt') @@ -412,11 +438,14 @@ class DossierSearchForm(form.Form): class IQuestionSearch(interface.Interface): search_type_is_question = schema.TextLine(title=u'Search Type', default=u'1', required=False) - questype = schema.Choice(title=_(u'Question Type'), required=False, - source=possible_question_types) + l_questypes = schema.List(title=_(u'Question Type'), required=False, + value_type=schema.Choice(title=_(u'Type'), required=False, + source=possible_question_types)) ttitle = schema.TextLine(title=_(u'Title'), required=False) authors = schema.TextLine(title=_(u'Authors'), required=False) - polgroups = schema.TextLine(title=_(u'Political Groups'), required=False) + l_polgroups = schema.List(title=_(u'Political Groups'), required=False, + value_type=schema.Choice(title=_(u'Political Group'), + required=False, source=possible_polgroups)) topics = schema.TextLine(title=_(u'Topics'), required=False) session = schema.Choice(title=_(u'Legislature / Session'), required=False, source=possible_sessions) @@ -432,7 +461,8 @@ class QuestionSearchForm(form.Form): prefix = 'question' fields = field.Fields(IQuestionSearch) fields['authors'].widgetFactory = FieldAuthorsWidget - fields['polgroups'].widgetFactory = FieldPolgroupsWidget + fields['l_polgroups'].widgetFactory = FieldDroppedCheckboxWidget + fields['l_questypes'].widgetFactory = FieldDroppedCheckboxWidget fields['topics'].widgetFactory = FieldTopicsWidget ignoreContext = True template = ViewPageTemplateFile('form_templates/view_form.pt') @@ -448,6 +478,8 @@ class QuestionSearchForm(form.Form): class QuestionPfbSearchForm(QuestionSearchForm): fields = field.Fields(IQuestionSearch) fields['authors'].title = _(u'Author(s)') + del fields['l_polgroups'] + fields['l_questypes'].widgetFactory = FieldDroppedCheckboxWidget @button.buttonAndHandler(_(u'Submit')) def handleApply(self, action): @@ -627,6 +659,12 @@ class IGlobalSearchForm(interface.Interface): l_doctypes = schema.List(title=_(u'Types'), required=False, value_type=schema.Choice(title=_(u'Type'), required=False, source=possible_document_types)) + l_dostypes = schema.List(title=_(u'Types'), required=False, + value_type=schema.Choice(title=_(u'Type'), required=False, + source=possible_dossier_types)) + l_questypes = schema.List(title=_(u'Types'), required=False, + value_type=schema.Choice(title=_(u'Type'), required=False, + source=possible_question_types)) l_polgroups = schema.List(title=_(u'Political Groups'), required=False, value_type=schema.Choice(title=_(u'Political Group'), required=False, source=possible_polgroups)) @@ -724,8 +762,14 @@ class SearchView(BrowserView): kw['doctype'] = get_docdos_type_id(self.context, data.get('doctype')) if data.get('dostype'): kw['dostype'] = get_docdos_type_id(self.context, data.get('dostype')) + if data.get('questype'): + kw['questype'] = get_docdos_type_id(self.context, data.get('questype')) if data.get('l_doctypes'): - kw['doctype'] = [get_docdos_type_id(self.context, x) for x in data.get('l_doctypes')] + kw['doctype'] = [get_docdos_type_id(self.context, x) for x in data.get('l_doctypes')] + if data.get('l_dostypes'): + kw['dostype'] = [get_docdos_type_id(self.context, x) for x in data.get('l_dostypes')] + if data.get('l_questypes'): + kw['questype'] = [get_docdos_type_id(self.context, x) for x in data.get('l_questypes')] if data.get('start') and data.get('end'): kw['dateDoc'] = {'query': [data.get('start'), data.get('end')], 'range': 'minmax'} diff --git a/tabellio/searchform/js_macros.pt b/tabellio/searchform/js_macros.pt index dcfaa76..c8d82cd 100644 --- a/tabellio/searchform/js_macros.pt +++ b/tabellio/searchform/js_macros.pt @@ -97,7 +97,7 @@ function load_results(elem) })(jQuery); - + +