Projet

Général

Profil

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

Frédéric Péters, 25 mai 2018 14:25

Télécharger (4,1 ko)

Voir les différences:

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

 tests/test_form_pages.py | 19 +++++++++++++++++++
 wcs/fields.py            | 16 +++++++++++++++-
 wcs/forms/root.py        |  5 ++++-
 3 files changed, 38 insertions(+), 2 deletions(-)
tests/test_form_pages.py
3226 3226
    data = formdef.data_class().get(data_id)
3227 3227
    assert data.data == {'1': 'bla', '0': '1.234;-1.234'}
3228 3228

  
3229
def test_form_map_field_prefill_address(pub):
3230
    formdef = create_formdef()
3231
    formdef.fields = [
3232
        fields.PageField(id='0', label='1st page', type='page'),
3233
        fields.StringField(id='1', label='address', required=True, varname='address'),
3234
        fields.PageField(id='2', label='2nd page', type='page'),
3235
        fields.MapField(id='3', label='map',
3236
            prefill={'type': 'string', 'value': '{{ form_var_address }}'}),
3237
    ]
3238
    formdef.store()
3239
    resp = get_app(pub).get('/test/')
3240
    formdef.data_class().wipe()
3241
    resp.form['f1'] = '169 rue du chateau, paris'
3242
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3243
        http_get_page.return_value = (None, 200,
3244
                json.dumps([{'lat':'48.8337085','lon':'2.3233693'}]), None)
3245
        resp = resp.form.submit('submit')
3246
        assert resp.form['f3$latlng'].value == '48.8337085;2.3233693'
3247

  
3229 3248
def test_form_map_multi_page(pub):
3230 3249
    formdef = create_formdef()
3231 3250
    formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
wcs/fields.py
60 60
            options = [x for x in options if x[0] in ('none', 'formula')]
61 61
        elif field and field.type == 'map':
62 62
            # limit choices to geolocation
63
            options = [x for x in options if x[0] in ('none', 'geolocation')]
63
            options = [x for x in options if x[0] in ('none', 'string', 'geolocation')]
64 64

  
65 65
        self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'),
66 66
                 attrs={'data-dynamic-display-parent': 'true'})
......
1976 1976
                'min_zoom', 'max_zoom', 'default_position',
1977 1977
                'init_with_geoloc']
1978 1978

  
1979
    def get_prefill_value(self, user=None, force_string=True):
1980
        if self.prefill.get('type') != 'string' or not self.prefill.get('value'):
1981
            return (None, False)
1982
        # string is actually interpreted as a template of a string that will be
1983
        # geocoded
1984
        from wcs.wf.geolocate import GeolocateWorkflowStatusItem
1985
        geolocate = GeolocateWorkflowStatusItem()
1986
        geolocate.method = 'address_string'
1987
        geolocate.address_string = self.prefill.get('value')
1988
        coords = geolocate.geolocate_address_string(None)
1989
        if not coords:
1990
            return (None, False)
1991
        return ('%(lat)s;%(lon)s' % coords, False)
1992

  
1979 1993
    def get_view_value(self, value):
1980 1994
        widget = self.widget_class('x%s' % random.random(), value, readonly=True)
1981 1995
        return widget.render_widget_content()
wcs/forms/root.py
382 382
                    if verified:
383 383
                        form.get_widget('f%s' % k).readonly = 'readonly'
384 384
                        form.get_widget('f%s' % k).attrs['readonly'] = 'readonly'
385
                    req.form['f%s' % k] = v
385
                    if field.key == 'map':
386
                        req.form['f%s$latlng' % k] = v
387
                    else:
388
                        req.form['f%s' % k] = v
386 389
                    one = True
387 390

  
388 391
            if not one:
389
-