Projet

Général

Profil

0001-forms-allow-prefilling-a-map-field-with-an-address-2.patch

Frédéric Péters, 11 juin 2018 12:12

Télécharger (4,16 ko)

Voir les différences:

Subject: [PATCH] forms: allow prefilling a map field with an address (#23293)

 tests/test_form_pages.py | 20 ++++++++++++++++++++
 wcs/fields.py            | 16 +++++++++++++++-
 wcs/forms/root.py        |  5 ++++-
 3 files changed, 39 insertions(+), 2 deletions(-)
tests/test_form_pages.py
3419 3419
    data = formdef.data_class().get(data_id)
3420 3420
    assert data.data == {'1': 'bla', '0': '1.234;-1.234'}
3421 3421

  
3422
def test_form_map_field_prefill_address(pub):
3423
    formdef = create_formdef()
3424
    formdef.fields = [
3425
        fields.PageField(id='0', label='1st page', type='page'),
3426
        fields.StringField(id='1', label='address', required=True, varname='address'),
3427
        fields.PageField(id='2', label='2nd page', type='page'),
3428
        fields.MapField(id='3', label='map',
3429
            prefill={'type': 'string', 'value': '{{ form_var_address }}'}),
3430
    ]
3431
    formdef.store()
3432
    resp = get_app(pub).get('/test/')
3433
    formdef.data_class().wipe()
3434
    resp.form['f1'] = '169 rue du chateau, paris'
3435
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3436
        http_get_page.return_value = (None, 200,
3437
                json.dumps([{'lat':'48.8337085','lon':'2.3233693'}]), None)
3438
        resp = resp.form.submit('submit')
3439
        assert resp.form['f3$latlng'].value == '48.8337085;2.3233693'
3440
        assert 'chateau' in http_get_page.call_args[0][0]
3441

  
3422 3442
def test_form_map_multi_page(pub):
3423 3443
    formdef = create_formdef()
3424 3444
    formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
wcs/fields.py
61 61
            options = [x for x in options if x[0] in ('none', 'formula')]
62 62
        elif field and field.type == 'map':
63 63
            # limit choices to geolocation
64
            options = [x for x in options if x[0] in ('none', 'geolocation')]
64
            options = [x for x in options if x[0] in ('none', 'string', 'geolocation')]
65 65

  
66 66
        self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'),
67 67
                 attrs={'data-dynamic-display-parent': 'true'})
......
1993 1993
                'min_zoom', 'max_zoom', 'default_position',
1994 1994
                'init_with_geoloc']
1995 1995

  
1996
    def get_prefill_value(self, user=None, force_string=True):
1997
        if self.prefill.get('type') != 'string' or not self.prefill.get('value'):
1998
            return (None, False)
1999
        # string is actually interpreted as a template of a string that will be
2000
        # geocoded
2001
        from wcs.wf.geolocate import GeolocateWorkflowStatusItem
2002
        geolocate = GeolocateWorkflowStatusItem()
2003
        geolocate.method = 'address_string'
2004
        geolocate.address_string = self.prefill.get('value')
2005
        coords = geolocate.geolocate_address_string(None)
2006
        if not coords:
2007
            return (None, False)
2008
        return ('%(lat)s;%(lon)s' % coords, False)
2009

  
1996 2010
    def get_view_value(self, value):
1997 2011
        widget = self.widget_class('x%s' % random.random(), value, readonly=True)
1998 2012
        return widget.render_widget_content()
wcs/forms/root.py
376 376
                    if verified:
377 377
                        form.get_widget('f%s' % k).readonly = 'readonly'
378 378
                        form.get_widget('f%s' % k).attrs['readonly'] = 'readonly'
379
                    req.form['f%s' % k] = v
379
                    if field.key == 'map':
380
                        req.form['f%s$latlng' % k] = v
381
                    else:
382
                        req.form['f%s' % k] = v
380 383
                    one = True
381 384

  
382 385
            if not one:
383
-