Projet

Général

Profil

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

Benjamin Dauvergne, 10 avril 2020 14:17

Télécharger (5,4 ko)

Voir les différences:

Subject: [PATCH 2/2] misc: add parent variable to lazy formdata (#39803)

 tests/test_formdata.py       | 33 +++++++++++++++++++++++++++++++++
 wcs/backoffice/management.py |  8 ++++++++
 wcs/variables.py             | 25 ++++++++++++++++++++++++-
 3 files changed, 65 insertions(+), 1 deletion(-)
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 k.endswith('form_parent') and isinstance(v, CompatibilityNamesDict) and 'form' in v:
2665
                r += htmltext('<li><code title="%s">%s_…</code>') % (k, k)
2666
                r += htmltext('  <div class="value"><span>%(caption)s '
2667
                              '(<a href="%(inspect_url)s">%(display_name)s)</a></span>') % {
2668
                    'caption': htmltext(_('<var>/variables from parent\'s request/</var>')),
2669
                    'inspect_url': v['form'].get_inspect_url(),
2670
                    'display_name': v['form_display_name'],
2671
                }
2664 2672
            elif hasattr(v, 'inspect_keys') or isinstance(v, dict):
2665 2673
                # skip expanded
2666 2674
                continue
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 get_inspect_url(self):
479
        return '%sinspect' % self.backoffice_url
480

  
458 481

  
459 482
class LazyFormDataVar(object):
460 483
    def __init__(self, fields, data, formdata=None):
461
-