0001-general-add-a-NoneFieldVar-for-None-values-63889.patch
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 |
- |