From f32e548d2b242baacf302bae8e5c6008edd0806c Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 12 Feb 2020 19:48:49 +0100 Subject: [PATCH 2/2] misc: add parent variable to lazy formdata (#39803) --- tests/test_backoffice_pages.py | 3 ++- tests/test_formdata.py | 33 +++++++++++++++++++++++++++++++++ wcs/backoffice/management.py | 5 +++++ wcs/qommon/substitution.py | 5 +++++ wcs/variables.py | 25 ++++++++++++++++++++++++- wcs/wf/create_formdata.py | 2 +- 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 7c70a0e6..e9e91f6e 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -5975,7 +5975,8 @@ def test_linked_forms_variables(create_formdata): get_publisher().substitutions.feed(formdata) substvars = get_publisher().substitutions.get_context_variables(mode='lazy') assert str(substvars['form_links_resubmitted_form_var_foo_string']) == 'coucou' - assert 'form_links_resubmitted_form_var_foo_string' in substvars.get_flat_keys() + assert 'form_links_resubmitted' in substvars.get_flat_keys() + assert 'form_links_resubmitted_form_var_foo_string' not in substvars.get_flat_keys() def test_backoffice_create_formdata_map_fields_by_varname(create_formdata): diff --git a/tests/test_formdata.py b/tests/test_formdata.py index 6f56083e..61ddb40c 100644 --- a/tests/test_formdata.py +++ b/tests/test_formdata.py @@ -1867,3 +1867,36 @@ def test_user_label(pub): assert formdef.data_class().get(formdata.id).user_id is None assert formdef.data_class().get(formdata.id).user_label == 'blah xxx' assert formdef.data_class().get(formdata.id).get_user_label() == 'blah xxx' + + +def test_form_parent(pub): + formdef = FormDef() + formdef.name = 'foobar' + formdef.fields = [fields.StringField(id='0', label='foo', varname='foo')] + formdef.store() + + parent = formdef.data_class()() + parent.data = {'0': 'hello'} + parent.store() + + child = formdef.data_class()() + child.data = {'0': 'world'} + child.submission_context = { + 'orig_formdef_id': formdef.id, + 'orig_formdata_id': parent.id, + } + variables = parent.get_substitution_variables() + assert variables.get('form_var_foo') == 'hello' + assert variables.get('form_parent') is None + + assert str(variables['form'].var.foo) == 'hello' + assert variables['form'].parent is None + + variables = child.get_substitution_variables() + assert variables.get('form_var_foo') == 'world' + assert variables.get('form_parent_form_var_foo') == 'hello' + assert variables.get('form_parent') is not None + + assert str(variables['form'].var.foo) == 'world' + assert str(variables['form'].parent['form'].var.foo) == 'hello' + assert variables['form'].parent is not None diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index a07283cb..cd71d3e3 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -2661,6 +2661,11 @@ class FormBackOfficeStatusPage(FormStatusPage): r += htmltext('
%s') % v elif isinstance(v, (types.FunctionType, types.MethodType)): continue + elif hasattr(v, 'inspect_url') and getattr(v, '_formdata', None) != self.filled: + html = v.inspect_url() + if html: + r += htmltext('
  • %s') % (k, k) + r += htmltext('
    %s') % html elif hasattr(v, 'inspect_keys') or isinstance(v, dict): # skip expanded continue diff --git a/wcs/qommon/substitution.py b/wcs/qommon/substitution.py index cccb15b5..2cf748ee 100644 --- a/wcs/qommon/substitution.py +++ b/wcs/qommon/substitution.py @@ -217,3 +217,8 @@ class CompatibilityNamesDict(dict): except KeyError: return False return True + + def inspect_url(self): + if 'form' in self and hasattr(self['form'], 'inspect_url'): + return self['form'].inspect_url() + return None diff --git a/wcs/variables.py b/wcs/variables.py index aa9b6daa..7ac82a6c 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -21,6 +21,7 @@ from django.utils.encoding import force_text from django.utils.functional import SimpleLazyObject from quixote import get_publisher, get_request +from quixote.html import htmltext from pyproj import Geod @@ -29,6 +30,8 @@ from .qommon.evalutils import make_datetime from .qommon.templatetags.qommon import parse_datetime from .qommon.storage import (Or, Equal, NotEqual) +from .formdef import FormDef + class LazyFormDefObjectsManager(object): def __init__(self, formdef, formdata=None, criterias=None, order_by=None): @@ -211,7 +214,8 @@ class LazyFormData(LazyFormDef): if key[0] == '_' or key in blacklist: continue if key == 'parent': - yield key, False # = recurse + if self.parent: # hide parent when it's None + yield key, False # = do not recurse else: yield key @@ -441,6 +445,22 @@ class LazyFormData(LazyFormDef): return LazyFormDataLinks(self._formdata) + @property + def parent(self): + if not self._formdata.submission_context: + return None + if 'orig_formdef_id' not in self._formdata.submission_context: + return None + if 'orig_formdata_id' not in self._formdata.submission_context: + return None + formdef = FormDef.get(self._formdata.submission_context['orig_formdef_id'], ignore_errors=True) + if formdef is None: + return None + formdata = formdef.data_class().get(self._formdata.submission_context['orig_formdata_id'], ignore_errors=True) + if formdata is None: + return None + return formdata.get_substitution_variables() + def export_to_json(self, include_files=True): # this gets used to generate an email attachment :/ return self._formdata.export_to_json(include_files=include_files) @@ -455,6 +475,9 @@ class LazyFormData(LazyFormDef): return self._formdata.data.get(field.id) raise + def inspect_url(self): + return htmltext('%s') % (self.backoffice_url, self.display_name) + class LazyFormDataVar(object): def __init__(self, fields, data, formdata=None): diff --git a/wcs/wf/create_formdata.py b/wcs/wf/create_formdata.py index 2d9a70b1..a4bc04fb 100644 --- a/wcs/wf/create_formdata.py +++ b/wcs/wf/create_formdata.py @@ -182,7 +182,7 @@ class LazyFormDataLinks(object): def inspect_keys(self): for part in self._formdata.iter_evolution_parts(): if isinstance(part, LinkedFormdataEvolutionPart) and part.varname: - yield part.varname + yield part.varname, False # = do not recurse class CreateFormdataWorkflowStatusItem(WorkflowStatusItem): -- 2.24.0