From 30cc4b2de0de6df6759136b79d4586c38daa9667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 6 Dec 2018 12:34:57 +0100 Subject: [PATCH 2/2] misc: add custom lazy field for map variables, for string compat (#28193) --- tests/test_formdata.py | 20 ++++++++++++++------ wcs/variables.py | 9 +++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/test_formdata.py b/tests/test_formdata.py index a6dd7a57e..d7ad16553 100644 --- a/tests/test_formdata.py +++ b/tests/test_formdata.py @@ -671,12 +671,17 @@ def test_lazy_variables_missing(pub, variable_test_data): def test_lazy_map_variable(pub, variable_test_data): formdef = FormDef.select()[0] formdata = formdef.data_class().select()[0] - pub.substitutions.reset() - pub.substitutions.feed(formdef) - pub.substitutions.feed(formdata) for mode in (None, 'lazy'): - assert WorkflowStatusItem.compute('=form_var_map') == '2;4' - assert WorkflowStatusItem.compute('=form_var_map.split(";")[0]') == '2' + pub.substitutions.reset() + pub.substitutions.feed(formdef) + with pub.substitutions.temporary_feed(formdata, force_mode=mode): + assert WorkflowStatusItem.compute('=form_var_map', raises=True) == '2;4' + assert WorkflowStatusItem.compute('{{ form_var_map }}', raises=True) == '2;4' + assert WorkflowStatusItem.compute('=form_var_map.split(";")[0]', raises=True) == '2' + assert WorkflowStatusItem.compute('=form_var_map_lat', raises=True) == 2 + assert WorkflowStatusItem.compute('{{ form_var_map_lat }}', raises=True) == '2.0' + assert WorkflowStatusItem.compute('=form_var_map_lon', raises=True) == 4 + assert WorkflowStatusItem.compute('{{ form_var_map_lon }}', raises=True) == '4.0' formdata.data['7'] = None formdata.store() @@ -684,7 +689,10 @@ def test_lazy_map_variable(pub, variable_test_data): pub.substitutions.feed(formdef) pub.substitutions.feed(formdata) for mode in (None, 'lazy'): - assert WorkflowStatusItem.compute('=form_var_map') is None + pub.substitutions.reset() + pub.substitutions.feed(formdef) + with pub.substitutions.temporary_feed(formdata, force_mode=mode): + assert WorkflowStatusItem.compute('=form_var_map', raises=True) is None def test_lazy_conditions(pub, variable_test_data): condition = Condition({'type': 'django', 'value': 'form_var_foo_foo == "bar"'}) diff --git a/wcs/variables.py b/wcs/variables.py index 80b01a539..b155b2833 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -307,6 +307,8 @@ class LazyFormDataVar(object): if field.key == 'date': return LazyFieldVarDate(self.data, field, self.formdata) + if field.key == 'map': + return LazyFieldVarMap(self.data, field, self.formdata) return LazyFieldVar(self.data, field, self.formdata) @@ -438,6 +440,13 @@ class LazyFieldVarDate(LazyFieldVar): return self.get_raw().tm_yday +class LazyFieldVarMap(LazyFieldVar): + def split(self, *args, **kwargs): + # Compatibility with usage of map variable as a string. It is + # recommended to use lat/lon properties instead. + return self.data.get(self.field.id).split(*args, **kwargs) + + class LazyUser(object): def __init__(self, user): self.user = user -- 2.20.0.rc2