20 |
20 |
import re
|
21 |
21 |
import base64
|
22 |
22 |
import xml.etree.ElementTree as ET
|
|
23 |
import collections
|
23 |
24 |
|
24 |
25 |
from quixote import get_request, get_publisher
|
25 |
26 |
from quixote.html import htmltext, TemplateIO
|
... | ... | |
50 |
51 |
if kwargs.get('map'):
|
51 |
52 |
options = [('none', _('None')), ('geolocation', _('Geolocation')),]
|
52 |
53 |
|
53 |
|
self.add(SingleSelectWidget, 'type', options = options, value = value.get('type'))
|
|
54 |
self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'),
|
|
55 |
attrs={'data-dynamic-display-parent': 'true'})
|
54 |
56 |
|
55 |
57 |
self.parse()
|
56 |
58 |
if not self.value:
|
57 |
59 |
self.value = {}
|
58 |
60 |
|
59 |
|
if self.value.get('type') in ('string', 'formula'):
|
60 |
|
self.add(StringWidget, 'value', value = value.get('value'), size=80)
|
61 |
|
elif self.value.get('type') == 'user':
|
62 |
|
formdef = get_publisher().user_class.get_formdef()
|
63 |
|
users_cfg = get_cfg('users', {})
|
64 |
|
if formdef:
|
65 |
|
user_fields = []
|
66 |
|
for field in formdef.fields:
|
67 |
|
if field.label in [x[1] for x in user_fields]:
|
68 |
|
# do not allow duplicated field names
|
69 |
|
continue
|
70 |
|
user_fields.append((field.id, field.label))
|
71 |
|
if not users_cfg.get('field_email'):
|
72 |
|
user_fields.append(('email', _('Email (builtin)')))
|
73 |
|
else:
|
74 |
|
user_fields = [('name', _('Name')), ('email', _('Email'))]
|
|
61 |
prefill_types = collections.OrderedDict(options)
|
|
62 |
self.add(StringWidget, 'value_string', size=80,
|
|
63 |
value=value.get('value') if value.get('type') == 'string' else None,
|
|
64 |
attrs={'data-dynamic-display-child-of': 'prefill$type',
|
|
65 |
'data-dynamic-display-value': prefill_types.get('string')})
|
|
66 |
self.add(StringWidget, 'value_formula', size=80,
|
|
67 |
value=value.get('value') if value.get('type') == 'formula' else None,
|
|
68 |
attrs={'data-dynamic-display-child-of': 'prefill$type',
|
|
69 |
'data-dynamic-display-value': prefill_types.get('formula')})
|
|
70 |
|
|
71 |
formdef = get_publisher().user_class.get_formdef()
|
|
72 |
users_cfg = get_cfg('users', {})
|
|
73 |
if formdef:
|
|
74 |
user_fields = []
|
|
75 |
for field in formdef.fields:
|
|
76 |
if field.label in [x[1] for x in user_fields]:
|
|
77 |
# do not allow duplicated field names
|
|
78 |
continue
|
|
79 |
user_fields.append((field.id, field.label))
|
|
80 |
if not users_cfg.get('field_email'):
|
|
81 |
user_fields.append(('email', _('Email (builtin)')))
|
|
82 |
else:
|
|
83 |
user_fields = [('name', _('Name')), ('email', _('Email'))]
|
|
84 |
self.add(SingleSelectWidget, 'value_user',
|
|
85 |
value=value.get('value') if value.get('type') == 'user' else None,
|
|
86 |
options=user_fields,
|
|
87 |
attrs={'data-dynamic-display-child-of': 'prefill$type',
|
|
88 |
'data-dynamic-display-value': prefill_types.get('user')})
|
75 |
89 |
|
76 |
|
self.add(SingleSelectWidget, 'value', value = value.get('value'),
|
77 |
|
options = user_fields)
|
78 |
|
elif self.value.get('type') == 'geolocation':
|
79 |
|
if kwargs.get('map'):
|
80 |
|
geoloc_fields = [('position', _('Position'))]
|
81 |
|
else:
|
82 |
|
geoloc_fields = [
|
83 |
|
('house', _('Number')),
|
84 |
|
('road', _('Street')),
|
85 |
|
('number-and-street', _('Number and street')),
|
86 |
|
('postcode', _('Post Code')),
|
87 |
|
('city', _('City')),
|
88 |
|
('country', _('Country')),
|
89 |
|
]
|
90 |
|
self.add(SingleSelectWidget, 'value', value=value.get('value'),
|
91 |
|
options=geoloc_fields)
|
92 |
|
|
93 |
|
self.add(SubmitWidget, 'apply', value = _('Apply'))
|
|
90 |
if kwargs.get('map'):
|
|
91 |
geoloc_fields = [('position', _('Position'))]
|
|
92 |
else:
|
|
93 |
geoloc_fields = [
|
|
94 |
('house', _('Number')),
|
|
95 |
('road', _('Street')),
|
|
96 |
('number-and-street', _('Number and street')),
|
|
97 |
('postcode', _('Post Code')),
|
|
98 |
('city', _('City')),
|
|
99 |
('country', _('Country')),
|
|
100 |
]
|
|
101 |
self.add(SingleSelectWidget, 'value_geolocation',
|
|
102 |
value=value.get('value') if value.get('type') == 'geolocation' else None,
|
|
103 |
options=geoloc_fields,
|
|
104 |
attrs={'data-dynamic-display-child-of': 'prefill$type',
|
|
105 |
'data-dynamic-display-value': prefill_types.get('geolocation')})
|
94 |
106 |
|
95 |
107 |
self._parsed = False
|
96 |
108 |
|
97 |
109 |
|
98 |
110 |
def _parse(self, request):
|
99 |
111 |
values = {}
|
100 |
|
for name in ('type', 'value'):
|
101 |
|
value = self.get(name)
|
|
112 |
type_ = self.get('type')
|
|
113 |
if type_:
|
|
114 |
values['type'] = type_
|
|
115 |
value = self.get('value_%s' % type_)
|
102 |
116 |
if value:
|
103 |
|
values[name] = value
|
|
117 |
values['value'] = value
|
104 |
118 |
self.value = values or None
|
105 |
119 |
if values and values['type'] == 'formula' and values.get('value'):
|
106 |
120 |
try:
|