Projet

Général

Profil

0002-misc-add-parent-variable-to-lazy-formdata-39803.patch

Benjamin Dauvergne, 31 mars 2020 18:34

Télécharger (7,07 ko)

Voir les différences:

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(-)
tests/test_backoffice_pages.py
5975 5975
    get_publisher().substitutions.feed(formdata)
5976 5976
    substvars = get_publisher().substitutions.get_context_variables(mode='lazy')
5977 5977
    assert str(substvars['form_links_resubmitted_form_var_foo_string']) == 'coucou'
5978
    assert 'form_links_resubmitted_form_var_foo_string' in substvars.get_flat_keys()
5978
    assert 'form_links_resubmitted' in substvars.get_flat_keys()
5979
    assert 'form_links_resubmitted_form_var_foo_string' not in substvars.get_flat_keys()
5979 5980

  
5980 5981

  
5981 5982
def test_backoffice_create_formdata_map_fields_by_varname(create_formdata):
tests/test_formdata.py
1867 1867
    assert formdef.data_class().get(formdata.id).user_id is None
1868 1868
    assert formdef.data_class().get(formdata.id).user_label == 'blah xxx'
1869 1869
    assert formdef.data_class().get(formdata.id).get_user_label() == 'blah xxx'
1870

  
1871

  
1872
def test_form_parent(pub):
1873
    formdef = FormDef()
1874
    formdef.name = 'foobar'
1875
    formdef.fields = [fields.StringField(id='0', label='foo', varname='foo')]
1876
    formdef.store()
1877

  
1878
    parent = formdef.data_class()()
1879
    parent.data = {'0': 'hello'}
1880
    parent.store()
1881

  
1882
    child = formdef.data_class()()
1883
    child.data = {'0': 'world'}
1884
    child.submission_context = {
1885
        'orig_formdef_id': formdef.id,
1886
        'orig_formdata_id': parent.id,
1887
    }
1888
    variables = parent.get_substitution_variables()
1889
    assert variables.get('form_var_foo') == 'hello'
1890
    assert variables.get('form_parent') is None
1891

  
1892
    assert str(variables['form'].var.foo) == 'hello'
1893
    assert variables['form'].parent is None
1894

  
1895
    variables = child.get_substitution_variables()
1896
    assert variables.get('form_var_foo') == 'world'
1897
    assert variables.get('form_parent_form_var_foo') == 'hello'
1898
    assert variables.get('form_parent') is not None
1899

  
1900
    assert str(variables['form'].var.foo) == 'world'
1901
    assert str(variables['form'].parent['form'].var.foo) == 'hello'
1902
    assert variables['form'].parent is not None
wcs/backoffice/management.py
2661 2661
                r += htmltext('  <div class="value"><span>%s</span>') % v
2662 2662
            elif isinstance(v, (types.FunctionType, types.MethodType)):
2663 2663
                continue
2664
            elif hasattr(v, 'inspect_url') and getattr(v, '_formdata', None) != self.filled:
2665
                html = v.inspect_url()
2666
                if html:
2667
                    r += htmltext('<li><code title="%s">%s</code>') % (k, k)
2668
                    r += htmltext('  <div class="value"><span>%s</span>') % html
2664 2669
            elif hasattr(v, 'inspect_keys') or isinstance(v, dict):
2665 2670
                # skip expanded
2666 2671
                continue
wcs/qommon/substitution.py
217 217
        except KeyError:
218 218
            return False
219 219
        return True
220

  
221
    def inspect_url(self):
222
        if 'form' in self and hasattr(self['form'], 'inspect_url'):
223
            return self['form'].inspect_url()
224
        return None
wcs/variables.py
21 21
from django.utils.functional import SimpleLazyObject
22 22

  
23 23
from quixote import get_publisher, get_request
24
from quixote.html import htmltext
24 25

  
25 26
from pyproj import Geod
26 27

  
......
29 30
from .qommon.templatetags.qommon import parse_datetime
30 31
from .qommon.storage import (Or, Equal, NotEqual)
31 32

  
33
from .formdef import FormDef
34

  
32 35

  
33 36
class LazyFormDefObjectsManager(object):
34 37
    def __init__(self, formdef, formdata=None, criterias=None, order_by=None):
......
211 214
            if key[0] == '_' or key in blacklist:
212 215
                continue
213 216
            if key == 'parent':
214
                yield key, False  # = recurse
217
                if self.parent:  # hide parent when it's None
218
                    yield key, False  # = do not recurse
215 219
            else:
216 220
                yield key
217 221

  
......
441 445

  
442 446
        return LazyFormDataLinks(self._formdata)
443 447

  
448
    @property
449
    def parent(self):
450
        if not self._formdata.submission_context:
451
            return None
452
        if 'orig_formdef_id' not in self._formdata.submission_context:
453
            return None
454
        if 'orig_formdata_id' not in self._formdata.submission_context:
455
            return None
456
        formdef = FormDef.get(self._formdata.submission_context['orig_formdef_id'], ignore_errors=True)
457
        if formdef is None:
458
            return None
459
        formdata = formdef.data_class().get(self._formdata.submission_context['orig_formdata_id'], ignore_errors=True)
460
        if formdata is None:
461
            return None
462
        return formdata.get_substitution_variables()
463

  
444 464
    def export_to_json(self, include_files=True):
445 465
        # this gets used to generate an email attachment :/
446 466
        return self._formdata.export_to_json(include_files=include_files)
......
455 475
                        return self._formdata.data.get(field.id)
456 476
            raise
457 477

  
478
    def inspect_url(self):
479
        return htmltext('<a href="%sinspect">%s</a>') % (self.backoffice_url, self.display_name)
480

  
458 481

  
459 482
class LazyFormDataVar(object):
460 483
    def __init__(self, fields, data, formdata=None):
wcs/wf/create_formdata.py
182 182
    def inspect_keys(self):
183 183
        for part in self._formdata.iter_evolution_parts():
184 184
            if isinstance(part, LinkedFormdataEvolutionPart) and part.varname:
185
                yield part.varname
185
                yield part.varname, False  # = do not recurse
186 186

  
187 187

  
188 188
class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
189
-