Projet

Général

Profil

0001-formdef-make-get_data-raise-on-error-if-necessary-56.patch

Benjamin Dauvergne, 09 novembre 2021 23:23

Télécharger (7,93 ko)

Voir les différences:

Subject: [PATCH 1/2] formdef: make get_data raise on error if necessary
 (#56824)

 wcs/data_sources.py | 12 +++++++++---
 wcs/fields.py       | 35 ++++++++++++++++++++++++++---------
 wcs/formdef.py      |  8 ++++----
 3 files changed, 39 insertions(+), 16 deletions(-)
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
822 822
                    widget.live_condition_fields = live_condition_fields[field.varname]
823 823

  
824 824
    @classmethod
825
    def get_field_data(cls, field, widget):
825
    def get_field_data(cls, field, widget, raise_on_error=False):
826 826
        d = {}
827 827
        d[field.id] = widget.parse()
828 828
        if d.get(field.id) is not None and field.convert_value_from_str:
829 829
            d[field.id] = field.convert_value_from_str(d[field.id])
830
        field.set_value(d, d[field.id])
830
        field.set_value(d, d[field.id], raise_on_error=raise_on_error)
831 831
        if getattr(widget, 'cleanup', None):
832 832
            widget.cleanup()
833 833
        return d
834 834

  
835
    def get_data(self, form):
835
    def get_data(self, form, raise_on_error=False):
836 836
        d = {}
837 837
        for field in self.fields:
838 838
            widget = form.get_widget('f%s' % field.id)
839 839
            if widget:
840
                d.update(self.get_field_data(field, widget))
840
                d.update(self.get_field_data(field, widget, raise_on_error=raise_on_error))
841 841
        return d
842 842

  
843 843
    def export_to_json(self, include_id=False, indent=None):
844
-