0001-formdef-make-get_data-raise-on-error-if-necessary-56.patch
wcs/data_sources.py | ||
---|---|---|
40 | 40 |
data_source_functions = {} |
41 | 41 | |
42 | 42 | |
43 |
class DataSourceError(Exception): |
|
44 |
pass |
|
45 | ||
46 | ||
43 | 47 |
def register_data_source_function(function, function_name=None): |
44 | 48 |
if not function_name: |
45 | 49 |
function_name = function.__name__ |
... | ... | |
264 | 268 |
return items |
265 | 269 | |
266 | 270 | |
267 |
def get_structured_items(data_source, mode=None, include_disabled=True): |
|
268 |
items = _get_structured_items(data_source, mode=mode) |
|
271 |
def get_structured_items(data_source, mode=None, include_disabled=True, raise_on_error=False):
|
|
272 |
items = _get_structured_items(data_source, mode=mode, raise_on_error=raise_on_error)
|
|
269 | 273 |
if not include_disabled: |
270 | 274 |
items = [i for i in items if not i.get('disabled')] |
271 | 275 |
return items |
272 | 276 | |
273 | 277 | |
274 |
def _get_structured_items(data_source, mode=None): |
|
278 |
def _get_structured_items(data_source, mode=None, raise_on_error=False):
|
|
275 | 279 |
cache_duration = 0 |
276 | 280 | |
277 | 281 |
if data_source.get('type') and data_source.get('type').startswith('carddef:'): |
... | ... | |
379 | 383 |
else: |
380 | 384 |
items = request_json_items(url, data_source) |
381 | 385 |
if items is None: |
386 |
if raise_on_error: |
|
387 |
raise DataSourceError('datasource %s is unavailable' % url) |
|
382 | 388 |
return [] |
383 | 389 |
if hasattr(request, 'datasources_cache'): |
384 | 390 |
request.datasources_cache[url] = items |
wcs/fields.py | ||
---|---|---|
87 | 87 |
from .sessions import BasicSession |
88 | 88 | |
89 | 89 | |
90 |
class SetValueError(Exception): |
|
91 |
pass |
|
92 | ||
93 | ||
90 | 94 |
class PrefillSelectionWidget(CompositeWidget): |
91 | 95 |
def __init__(self, name, value=None, field=None, **kwargs): |
92 | 96 |
CompositeWidget.__init__(self, name, value, **kwargs) |
... | ... | |
618 | 622 |
return value |
619 | 623 |
return str(value) |
620 | 624 | |
621 |
def set_value(self, data, value): |
|
625 |
def set_value(self, data, value, raise_on_error=False):
|
|
622 | 626 |
data['%s' % self.id] = value |
623 | 627 |
if self.store_display_value: |
624 | 628 |
display_value = self.store_display_value(data, self.id) |
629 |
if raise_on_error and display_value is None: |
|
630 |
raise SetValueError('a datasource is unavailable') |
|
625 | 631 |
if display_value: |
626 | 632 |
data['%s_display' % self.id] = display_value |
627 | 633 |
elif '%s_display' % self.id in data: |
628 | 634 |
del data['%s_display' % self.id] |
629 | 635 |
if self.store_structured_value and value: |
630 |
structured_value = self.store_structured_value(data, self.id) |
|
636 |
structured_value = self.store_structured_value(data, self.id, raise_on_error=raise_on_error)
|
|
631 | 637 |
if structured_value: |
632 | 638 |
if isinstance(structured_value, dict) and structured_value.get('id'): |
633 | 639 |
# in case of list field, override id |
... | ... | |
2053 | 2059 |
else: |
2054 | 2060 |
widget.extra_css_class = self.extra_css_class |
2055 | 2061 | |
2056 |
def store_display_value(self, data, field_id): |
|
2062 |
def store_display_value(self, data, field_id, raise_on_error=False):
|
|
2057 | 2063 |
value = data.get(field_id) |
2058 | 2064 |
if not value: |
2059 | 2065 |
return '' |
... | ... | |
2077 | 2083 |
return display_value |
2078 | 2084 |
return self.get_display_value(value) |
2079 | 2085 | |
2080 |
def store_structured_value(self, data, field_id): |
|
2086 |
def store_structured_value(self, data, field_id, raise_on_error=False):
|
|
2081 | 2087 |
data_source = data_sources.get_object(self.data_source) |
2082 | 2088 |
if data_source is None: |
2083 | 2089 |
return |
... | ... | |
2086 | 2092 |
return |
2087 | 2093 | |
2088 | 2094 |
value = data_source.get_structured_value(data.get(field_id)) |
2095 |
if value is None and raise_on_error: |
|
2096 |
raise SetValueError('a datasource is unavailable') |
|
2097 | ||
2089 | 2098 |
if value is None or set(value.keys()) == {'id', 'text'}: |
2090 | 2099 |
return |
2091 | 2100 |
return value |
... | ... | |
2409 | 2418 |
values.extend([''] * (nb_columns - len(values))) |
2410 | 2419 |
return values |
2411 | 2420 | |
2412 |
def store_display_value(self, data, field_id): |
|
2421 |
def store_display_value(self, data, field_id, raise_on_error=False):
|
|
2413 | 2422 |
options = self.get_options() |
2414 | 2423 |
if not options: |
2415 | 2424 |
return '' |
... | ... | |
2428 | 2437 |
if str(key) == str(choice): |
2429 | 2438 |
choices.append(option_value) |
2430 | 2439 |
break |
2440 |
else: |
|
2441 |
if raise_on_error: |
|
2442 |
raise SetValueError('datasource is unavailable') |
|
2431 | 2443 |
return ', '.join(choices) |
2432 | 2444 | |
2433 |
def store_structured_value(self, data, field_id): |
|
2445 |
def store_structured_value(self, data, field_id, raise_on_error=False):
|
|
2434 | 2446 |
if not self.data_source: |
2435 | 2447 |
return |
2436 |
structured_options = data_sources.get_structured_items(self.data_source) |
|
2448 |
try: |
|
2449 |
structured_options = data_sources.get_structured_items( |
|
2450 |
self.data_source, raise_on_error=raise_on_error |
|
2451 |
) |
|
2452 |
except data_sources.DataSourceError as e: |
|
2453 |
raise SetValueError(str(e)) |
|
2437 | 2454 |
if not structured_options: |
2438 | 2455 |
return |
2439 | 2456 |
structured_value = [] |
... | ... | |
3120 | 3137 |
def get_structured_value(self, data): |
3121 | 3138 |
return self.get_json_value(data.get(self.id)) |
3122 | 3139 | |
3123 |
def set_value(self, data, value): |
|
3140 |
def set_value(self, data, value, raise_on_error=False):
|
|
3124 | 3141 |
if value and ';' not in value: |
3125 | 3142 |
raise Exception('invalid coordinates %r (missing ;)' % value) |
3126 | 3143 |
super().set_value(data, value) |
... | ... | |
3372 | 3389 |
'remove_button', |
3373 | 3390 |
] |
3374 | 3391 | |
3375 |
def store_display_value(self, data, field_id): |
|
3392 |
def store_display_value(self, data, field_id, raise_on_error=False):
|
|
3376 | 3393 |
value = data.get(field_id) |
3377 | 3394 |
parts = [] |
3378 | 3395 |
if value and value.get('data'): |
wcs/formdef.py | ||
---|---|---|
839 | 839 |
widget.live_condition_fields = live_condition_fields[field.varname] |
840 | 840 | |
841 | 841 |
@classmethod |
842 |
def get_field_data(cls, field, widget): |
|
842 |
def get_field_data(cls, field, widget, raise_on_error=False):
|
|
843 | 843 |
d = {} |
844 | 844 |
d[field.id] = widget.parse() |
845 | 845 |
if d.get(field.id) is not None and field.convert_value_from_str: |
846 | 846 |
d[field.id] = field.convert_value_from_str(d[field.id]) |
847 |
field.set_value(d, d[field.id]) |
|
847 |
field.set_value(d, d[field.id], raise_on_error=raise_on_error)
|
|
848 | 848 |
if getattr(widget, 'cleanup', None): |
849 | 849 |
widget.cleanup() |
850 | 850 |
return d |
851 | 851 | |
852 |
def get_data(self, form): |
|
852 |
def get_data(self, form, raise_on_error=False):
|
|
853 | 853 |
d = {} |
854 | 854 |
for field in self.fields: |
855 | 855 |
widget = form.get_widget('f%s' % field.id) |
856 | 856 |
if widget: |
857 |
d.update(self.get_field_data(field, widget)) |
|
857 |
d.update(self.get_field_data(field, widget, raise_on_error=raise_on_error))
|
|
858 | 858 |
return d |
859 | 859 | |
860 | 860 |
def export_to_json(self, include_id=False, indent=None): |
861 |
- |