From e89a590de4dbf147ecf869bd619b7e84779c77dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 25 May 2018 14:24:16 +0200 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(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 631bf902..eeb93707 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -3419,6 +3419,26 @@ def test_form_map_field_back_and_submit(pub): data = formdef.data_class().get(data_id) assert data.data == {'1': 'bla', '0': '1.234;-1.234'} +def test_form_map_field_prefill_address(pub): + formdef = create_formdef() + formdef.fields = [ + fields.PageField(id='0', label='1st page', type='page'), + fields.StringField(id='1', label='address', required=True, varname='address'), + fields.PageField(id='2', label='2nd page', type='page'), + fields.MapField(id='3', label='map', + prefill={'type': 'string', 'value': '{{ form_var_address }}'}), + ] + formdef.store() + resp = get_app(pub).get('/test/') + formdef.data_class().wipe() + resp.form['f1'] = '169 rue du chateau, paris' + with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page: + http_get_page.return_value = (None, 200, + json.dumps([{'lat':'48.8337085','lon':'2.3233693'}]), None) + resp = resp.form.submit('submit') + assert resp.form['f3$latlng'].value == '48.8337085;2.3233693' + assert 'chateau' in http_get_page.call_args[0][0] + def test_form_map_multi_page(pub): formdef = create_formdef() formdef.fields = [fields.PageField(id='0', label='1st page', type='page'), diff --git a/wcs/fields.py b/wcs/fields.py index 4c5467d2..a9360158 100644 --- a/wcs/fields.py +++ b/wcs/fields.py @@ -61,7 +61,7 @@ class PrefillSelectionWidget(CompositeWidget): options = [x for x in options if x[0] in ('none', 'formula')] elif field and field.type == 'map': # limit choices to geolocation - options = [x for x in options if x[0] in ('none', 'geolocation')] + options = [x for x in options if x[0] in ('none', 'string', 'geolocation')] self.add(SingleSelectWidget, 'type', options=options, value=value.get('type'), attrs={'data-dynamic-display-parent': 'true'}) @@ -1993,6 +1993,20 @@ class MapField(WidgetField): 'min_zoom', 'max_zoom', 'default_position', 'init_with_geoloc'] + def get_prefill_value(self, user=None, force_string=True): + if self.prefill.get('type') != 'string' or not self.prefill.get('value'): + return (None, False) + # string is actually interpreted as a template of a string that will be + # geocoded + from wcs.wf.geolocate import GeolocateWorkflowStatusItem + geolocate = GeolocateWorkflowStatusItem() + geolocate.method = 'address_string' + geolocate.address_string = self.prefill.get('value') + coords = geolocate.geolocate_address_string(None) + if not coords: + return (None, False) + return ('%(lat)s;%(lon)s' % coords, False) + def get_view_value(self, value): widget = self.widget_class('x%s' % random.random(), value, readonly=True) return widget.render_widget_content() diff --git a/wcs/forms/root.py b/wcs/forms/root.py index adbb0ce2..ca1755dd 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -376,7 +376,10 @@ class FormPage(Directory, FormTemplateMixin): if verified: form.get_widget('f%s' % k).readonly = 'readonly' form.get_widget('f%s' % k).attrs['readonly'] = 'readonly' - req.form['f%s' % k] = v + if field.key == 'map': + req.form['f%s$latlng' % k] = v + else: + req.form['f%s' % k] = v one = True if not one: -- 2.17.1