Projet

Général

Profil

0001-general-add-a-NoneFieldVar-for-None-values-63889.patch

Lauréline Guérin, 10 octobre 2022 15:50

Télécharger (7,28 ko)

Voir les différences:

Subject: [PATCH] general: add a NoneFieldVar for None values (#63889)

 tests/backoffice_pages/test_form_inspect.py |  7 +++++++
 tests/test_formdata.py                      | 16 +++++++++++-----
 wcs/backoffice/management.py                |  4 +++-
 wcs/qommon/templatetags/qommon.py           |  4 ++--
 wcs/variables.py                            |  7 ++++++-
 5 files changed, 29 insertions(+), 9 deletions(-)
tests/backoffice_pages/test_form_inspect.py
70 70
        fields.ItemField(id='3', label='3rd field', type='item', data_source=datasource, varname='foo'),
71 71
        fields.FileField(id='4', label='file field', type='file', varname='file'),
72 72
        fields.BlockField(id='5', label='Block Data', varname='blockdata', type='block:foobar', max_items=3),
73
        fields.StringField(id='6', label='Empty', varname='empty', type='string'),
73 74
    ]
74 75
    formdef.workflow_roles = {'_receiver': 1}
75 76
    formdef.store()
......
105 106
            ],
106 107
            'schema': {},  # not important here
107 108
        },
109
        '6': None,
108 110
        '0_display': 'plop poulpe',
109 111
    }
110 112
    formdata.jump_status('new')
......
182 184
        pq('[title="form_var_blockdata_1_string"]').children('a').attr('href')
183 185
        == 'http://example.net/backoffice/forms/blocks/%s/1/' % block.id
184 186
    )
187
    assert pq('[title="form_var_empty"]').children('a').attr('title') == 'Empty'
188
    assert (
189
        pq('[title="form_var_empty"]').children('a').attr('href')
190
        == 'http://example.net/backoffice/forms/%s/fields/6/' % formdef.id
191
    )
185 192

  
186 193
    # don't show «unusable» variables
187 194
    assert 'form_f1' not in resp.text
tests/test_formdata.py
25 25
from wcs.qommon.substitution import CompatibilityNamesDict
26 26
from wcs.qommon.template import Template
27 27
from wcs.qommon.upload_storage import PicklableUpload
28
from wcs.variables import LazyFormData
28
from wcs.variables import LazyFormData, NoneFieldVar
29 29
from wcs.wf.register_comment import JournalEvolutionPart
30 30
from wcs.wf.wscall import JournalWsCallErrorPart
31 31
from wcs.workflows import (
......
207 207

  
208 208
    formdata.data = {'0': None}
209 209
    substvars = formdata.get_substitution_variables()
210
    assert substvars['form_var_foo'] is None
210
    assert isinstance(substvars['form_var_foo'], NoneFieldVar)
211 211
    assert substvars['form_var_foo_raw'] is None
212 212
    assert substvars['form_var_foo_url'] is None
213 213

  
214 214
    formdata.data = {}
215 215
    substvars = formdata.get_substitution_variables()
216
    assert substvars['form_var_foo'] is None
216
    assert isinstance(substvars['form_var_foo'], NoneFieldVar)
217 217
    assert substvars['form_var_foo_raw'] is None
218 218
    assert substvars['form_var_foo_url'] is None
219 219

  
......
1912 1912
    pub.substitutions.feed(formdata)
1913 1913
    for mode in (None, 'lazy'):
1914 1914
        context = pub.substitutions.get_context_variables(mode=mode)
1915
        assert context['form_var_foo_foo_baz_baz'] is None
1915
        if mode == 'lazy':
1916
            assert isinstance(context['form_var_foo_foo_baz_baz'], NoneFieldVar)
1917
        else:
1918
            assert context['form_var_foo_foo_baz_baz'] is None
1916 1919
        assert context['form_var_foo_foo'] == 'bar'
1917 1920
        with pytest.raises(KeyError):
1918 1921
            assert context['form_var_foo_foo_xxx'] == 'bar'
......
1996 1999
        pub.substitutions.reset()
1997 2000
        pub.substitutions.feed(formdef)
1998 2001
        with pub.substitutions.temporary_feed(formdata, force_mode=mode):
1999
            assert WorkflowStatusItem.compute('=form_var_map', raises=True) is None
2002
            if mode == 'lazy':
2003
                assert isinstance(WorkflowStatusItem.compute('=form_var_map', raises=True), NoneFieldVar)
2004
            else:
2005
                assert WorkflowStatusItem.compute('=form_var_map', raises=True) is None
2000 2006
            assert (
2001 2007
                WorkflowStatusItem.compute('{{ form_var_map|distance:"1;2"|floatformat }}', raises=True) == ''
2002 2008
            )
wcs/backoffice/management.py
43 43
from wcs.forms.backoffice import FormDefUI
44 44
from wcs.forms.common import FormStatusPage
45 45
from wcs.roles import logged_users_role
46
from wcs.variables import LazyFieldVar, LazyList
46
from wcs.variables import LazyFieldVar, LazyList, NoneFieldVar
47 47
from wcs.workflows import ActionsTracingEvolutionPart, WorkflowStatusItem, item_classes, template_on_formdata
48 48

  
49 49
from ..qommon import _, errors, ezt, force_str, get_cfg, misc, ngettext, ods, pgettext_lazy, template
......
3634 3634
                        r += htmltext(' <a title="%s" href="%s"></a>' % (v._field.label, field_url))
3635 3635
                r += htmltext('</code>')
3636 3636
                r += htmltext('  <div class="value"><span>%s</span>') % v
3637
                if isinstance(v, NoneFieldVar):
3638
                    r += htmltext(' <span class="type">(%s)</span>') % _('no value')
3637 3639
            elif isinstance(v, (types.FunctionType, types.MethodType)):
3638 3640
                continue
3639 3641
            elif k.endswith('form_parent') and isinstance(v, CompatibilityNamesDict) and ('form' in v):
wcs/qommon/templatetags/qommon.py
547 547
    '''replace the "add" native django filter'''
548 548

  
549 549
    # consider None content as the empty string
550
    if term1 is None:
550
    if unlazy(term1) is None:
551 551
        term1 = ''
552
    if term2 is None:
552
    if unlazy(term2) is None:
553 553
        term2 = ''
554 554

  
555 555
    # return available number if the other term is the empty string
wcs/variables.py
887 887
        # let boolean pass through, to get None handled as False
888 888
        if field.type != 'bool':
889 889
            if self._data.get(field.id) is None:
890
                return None
890
                return NoneFieldVar(**self.get_field_kwargs(field))
891 891

  
892 892
            if str(field.id) not in self._data:
893 893
                raise KeyError(key)
......
1004 1004
        raise AssertionError('lazy cannot be pickled')
1005 1005

  
1006 1006

  
1007
class NoneFieldVar(LazyFieldVar):
1008
    def get_value(self):
1009
        return None
1010

  
1011

  
1007 1012
class LazyFieldVarComplex(LazyFieldVar):
1008 1013
    def has_live_data_source(self):
1009 1014
        real_data_source = self._field.get_real_data_source()
1010
-