This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.searchform/tabellio/searchform/form.py

290 lines
11 KiB
Python

from five import grok
from zope import interface, schema
from z3c.form import form, field, button
from plone.z3cform.layout import wrap_form
from Products.CMFCore.utils import getToolByName
from z3c.form.ptcompat import ViewPageTemplateFile
import z3c.form.interfaces
from z3c.relationfield.schema import RelationChoice, RelationList
from plone.formwidget.contenttree import ObjPathSourceBinder
from tabellio.searchform.interfaces import MessageFactory as _
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
class IFolderWithDocuments(interface.Interface):
pass
class IFolderWithPfbDocuments(interface.Interface):
pass
@grok.provider(IContextSourceBinder)
def possible_document_types(context):
catalog = getToolByName(context, 'portal_catalog')
possible_doctypes = catalog.uniqueValuesFor('doctype')
terms = []
for doctype in possible_doctypes:
doctype_id = doctype.encode('ascii', 'replace')
terms.append(SimpleVocabulary.createTerm(doctype_id, doctype_id, doctype))
return SimpleVocabulary(terms)
@grok.provider(IContextSourceBinder)
def possible_dossier_types(context):
catalog = getToolByName(context, 'portal_catalog')
possible_dostypes = catalog.uniqueValuesFor('dostype')
terms = []
for dostype in possible_dostypes:
dostype_id = dostype.encode('ascii', 'replace')
terms.append(SimpleVocabulary.createTerm(dostype_id, dostype_id, dostype))
return SimpleVocabulary(terms)
def get_catalog_kwargs(context, data):
kw = {}
return kw
class IDocumentSearch(interface.Interface):
search_type = schema.TextLine(title=u'Search Type', default=u'document')
nodoc = schema.TextLine(title=_(u'Document Number'), required=False)
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 = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder(
portal_type=['themis.datatypes.deputy'])))
# polgroups
# session
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
class DocumentSearchForm(form.Form):
method = 'get'
fields = field.Fields(IDocumentSearch)
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_effectivesearch.pt')
def updateWidgets(self):
super(DocumentSearchForm, self).updateWidgets()
self.widgets['search_type'].mode = z3c.form.interfaces.HIDDEN_MODE
@button.buttonAndHandler(_(u'Search'))
def handleApply(self, action):
data, errors = self.extractData()
if not errors and False:
plone_utils = getToolByName(self.context.context, 'plone_utils')
plone_utils.addPortalMessage(_('Your search has been completed!'))
return self.request.response.redirect('./')
return
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 = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder(
portal_type=['themis.datatypes.deputy'])))
# polgroups
# session
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
class DossierSearchForm(form.Form):
method = 'get'
fields = field.Fields(IDossierSearch)
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_dossier_search.pt')
@button.buttonAndHandler(_(u'Search'))
def handleApply(self, action):
data, errors = self.extractData()
if not errors and False:
plone_utils = getToolByName(self.context.context, 'plone_utils')
plone_utils.addPortalMessage(_('Your search has been completed!'))
return self.request.response.redirect('./')
return
class IQuestionSearch(interface.Interface):
nodos = schema.TextLine(title=_(u'Question Number'), required=False)
dostype = schema.Set(title=_(u'Type'), required=False,
value_type=schema.Choice(values=[_(u'Lorem'), _(u'Ipsum')]))
#subjects =
ttitle = schema.TextLine(title=_(u'Title'), required=False)
authors = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder(
portal_type=['themis.datatypes.deputy'])))
# polgroups
# session
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
class QuestionSearchForm(form.Form):
fields = field.Fields(IQuestionSearch)
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_question_search.pt')
@button.buttonAndHandler(_(u'Search'))
def handleApply(self, action):
data, errors = self.extractData()
if not errors and False:
plone_utils = getToolByName(self.context.context, 'plone_utils')
plone_utils.addPortalMessage(_('Your search has been completed!'))
return self.request.response.redirect('./')
return
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 = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder(
portal_type=['themis.datatypes.deputy'])))
# polgroups
# session
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,
values=[_(u'Type'), _(u'Number'), _(u'Session')])
class DocumentPfbSearchForm(form.Form):
method = 'get'
fields = field.Fields(IDocumentPfbSearch)
ignoreContext = True
template = ViewPageTemplateFile('form_templates/view_pfbdocsearch.pt')
@button.buttonAndHandler(_(u'Search'))
def handleApply(self, action):
data, errors = self.extractData()
if not errors and False:
plone_utils = getToolByName(self.context.context, 'plone_utils')
plone_utils.addPortalMessage(_('Your search has been completed!'))
return self.request.response.redirect('./')
return
class IGlobalSearchForm(interface.Interface):
search_type = schema.TextLine(title=u'Search Type')
nodoc = schema.TextLine(title=_(u'Document Number'), required=False)
nosuite = schema.TextLine(title=_(u'Suite Number'), required=False)
doctype = schema.Choice(title=_(u'Type'), required=False,
source=possible_document_types)
nodos = schema.TextLine(title=_(u'Dossier Number'), required=False)
dostype = schema.Choice(title=_(u'Type'), required=False,
source=possible_dossier_types)
#subjects =
#subjects =
ttitle = schema.TextLine(title=_(u'Title'), required=False)
text = schema.TextLine(title=_(u'Text'), required=False)
authors = RelationList(title=_(u'Authors'), default=[], required=False,
value_type=RelationChoice(title=_(u'Author'),
source=ObjPathSourceBinder(
portal_type=['themis.datatypes.deputy'])))
# polgroups
# session
start = schema.Date(title=_(u'Start'), required=False)
end = schema.Date(title=_(u'End'), required=False)
class GlobalSearchForm(form.Form):
fields = field.Fields(IGlobalSearchForm)
ignoreContext = True
class SearchView(BrowserView):
def search_results(self):
f = GlobalSearchForm(self.context, self.request)
f.update()
data, errors = f.extractData()
kw = {}
if data.get('search_type') == 'document':
kw['portal_type'] = 'tabellio.documents.document'
elif data.get('search_type') == 'dossier':
kw['portal_type'] = 'tabellio.documents.dossier'
if data.get('ttitle'):
kw['Title'] = data.get('ttitle')
if data.get('nodoc'):
kw['nodoc'] = data.get('nodoc')
if data.get('nodos'):
kw['nodos'] = data.get('nodos')
if data.get('doctype'):
kw['doctype'] = possible_document_types(self.context).getTermByToken(data.get('doctype')).title
if data.get('dostype'):
kw['dostype'] = possible_dossier_types(self.context).getTermByToken(data.get('doctype')).title
if data.get('start') and data.get('end'):
kw['dateDoc'] = {'query': [data.get('start'), data.get('end')], 'range': 'minmax'}
elif data.get('start'):
kw['dateDoc'] = {'query': data.get('start'), 'range': 'min'}
elif data.get('end'):
kw['dateDoc'] = {'query': data.get('end'), 'range': 'max'}
kw['sort_on'] = 'dateDoc'
kw['sort_order'] = 'descending'
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'
if not kw:
return []
catalog = getToolByName(self.context, 'portal_catalog')
return catalog(**kw)
def document_pfb_search_form(self):
f = DocumentPfbSearchForm(self.context, self.request)
f.update()
return f.render()
def document_search_form(self):
f = DocumentSearchForm(self.context, self.request)
f.update()
return f.render()
def dossier_search_form(self):
f = DossierSearchForm(self.context, self.request)
f.update()
return f.render()
def question_search_form(self):
f = QuestionSearchForm(self.context, self.request)
f.update()
return f.render()