Projet

Général

Profil

0001-datasources-avoid-raising-on-lost-datasource-18431.patch

Nicolas Roche, 11 octobre 2019 13:10

Télécharger (3,24 ko)

Voir les différences:

Subject: [PATCH] datasources: avoid raising on lost datasource (#18431)

 tests/test_form_pages.py | 19 +++++++++++++++++++
 wcs/data_sources.py      |  9 ++++++++-
 wcs/formdef.py           |  5 ++---
 3 files changed, 29 insertions(+), 4 deletions(-)
tests/test_form_pages.py
4238 4238
    resp = resp.forms[0].submit('submit')
4239 4239
    assert 'Check values then click submit.' in resp.body
4240 4240

  
4241
def test_unknown_datasource(pub):
4242
    formdef = create_formdef()
4243
    formdef.fields = [
4244
        fields.StringField(id='1', label='string',
4245
                varname='string', required=False, data_source={'type': 'foobar'}),
4246
        fields.ItemField(id='2', label='item',
4247
                varname='item', required=False, data_source={'type': 'foobar'}),
4248
        fields.ItemsField(id='3', label='items',
4249
                varname='items', required=False, data_source={'type': 'foobar'}),
4250
    ]
4251

  
4252
    formdef.store()
4253
    data_class = formdef.data_class()
4254
    data_class.wipe()
4255
    resp = get_app(pub).get('/test/')
4256
    formdef.data_class().wipe()
4257
    resp = resp.forms[0].submit('submit') # should go straight to validation
4258
    assert 'Check values then click submit.' in resp.body
4259

  
4241 4260
def test_form_items_datasource(pub):
4242 4261
    formdef = create_formdef()
4243 4262
    formdef.fields = [fields.ItemsField(id='1', label='items',
wcs/data_sources.py
249 249
    return NamedDataSource.get_by_slug(ds_type)
250 250

  
251 251

  
252
class StubNamedDataSource(object):
253
    type = 'formula'
254
    data_source = {'type': 'formula', 'value': []}
255
    cache_duration = None
256

  
257

  
252 258
class NamedDataSource(XmlStorableObject):
253 259
    _names = 'datasources'
254 260
    _xml_tagname = 'datasources'
......
330 336
        objects = [x for x in cls.select() if x.slug == slug]
331 337
        if objects:
332 338
            return objects[0]
333
        raise KeyError("data source '%s' does not exist" % slug)
339
        get_logger().warn("data source '%s' does not exist" % slug)
340
        return StubNamedDataSource()
334 341

  
335 342
    def get_json_query_url(self):
336 343
        url = self.data_source.get('value').strip()
wcs/formdef.py
1010 1010
        for field in formdef.fields:
1011 1011
            data_source = getattr(field, 'data_source', None)
1012 1012
            if data_source:
1013
                try:
1014
                    data_sources.get_real(data_source)
1015
                except KeyError:
1013
                if isinstance(data_sources.get_object(data_source),
1014
                              data_sources.StubNamedDataSource):
1016 1015
                    unknown_datasources.add(data_source.get('type'))
1017 1016
        if unknown_datasources:
1018 1017
            raise FormdefImportError(N_('Unknown datasources'),
1019
-