forked from eea/eea.facetednavigation
/
widget.py
108 lines (89 loc) · 3.16 KB
/
widget.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
""" Text widget
"""
import logging
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from Products.Archetypes.public import Schema
from Products.Archetypes.public import StringField
from Products.Archetypes.public import StringWidget
from Products.Archetypes.public import SelectionWidget
from eea.facetednavigation.widgets.widget import Widget as AbstractWidget
from eea.facetednavigation import EEAMessageFactory as _
from Products.CMFCore.utils import getToolByName
logger = logging.getLogger('eea.facetednavigation.widgets.range')
EditSchema = Schema((
StringField('index',
schemata="default",
required=True,
vocabulary_factory='eea.faceted.vocabularies.RangeCatalogIndexes',
widget=SelectionWidget(
format='select',
label=_(u'faceted_criteria_index',
default=u'Catalog index'),
description=_(u'help_faceted_criteria_index',
default=u'Catalog index to use for search'),
i18n_domain="eea"
)
),
StringField('default',
schemata="default",
widget=StringWidget(
size=25,
label=_('faceted_criteria_default',
default='Default value'),
description=_(u'help_faceted_criteria_range_default',
default=u'Default range (e.g. "1 => 3")'),
i18n_domain="eea"
)
),
))
class Widget(AbstractWidget):
""" Widget
"""
# Widget properties
widget_type = 'range'
widget_label = _('Range')
view_js = '++resource++eea.facetednavigation.widgets.range.view.js'
edit_js = '++resource++eea.facetednavigation.widgets.range.edit.js'
view_css = '++resource++eea.facetednavigation.widgets.range.view.css'
edit_css = '++resource++eea.facetednavigation.widgets.range.edit.css'
index = ViewPageTemplateFile('widget.pt')
edit_schema = AbstractWidget.edit_schema.copy() + EditSchema
@property
def default(self):
""" Return default
"""
default = self.data.get('default', '')
if not default:
return ('', '')
default = default.split('=>')
if len(default) != 2:
return ('', '')
start, end = default
return (start, end)
def query(self, form):
""" Get value from form and return a catalog dict query
"""
query = {}
index = self.data.get('index', '')
index = index.encode('utf-8', 'replace')
if not index:
return query
if self.hidden:
start, end = self.default
else:
value = form.get(self.data.getId(), ())
if not value or len(value)!=2:
return query
start, end = value
if not (start and end):
return query
# let the field be integer if integer:
catalog = getToolByName(self.context, 'portal_catalog')
evalues = catalog.uniqueValuesFor(index)
if True in [isinstance(v, int) for v in evalues]:
start, end = int(start), int(end)
query[index] = {
'query': (start, end),
'range': 'min:max'
}
return query