misc: always set empty display/structured when there is no value (#66609) #469

Merged
fpeters merged 2 commits from wip/66609-conditional-checkboxes into main 2023-07-14 09:04:18 +02:00
4 changed files with 90 additions and 11 deletions

View File

@ -1712,3 +1712,42 @@ def test_carddata_with_file(pub):
resp = resp.form.submit('button_editable')
resp = resp.follow()
assert resp.click('test.txt').body == b'hello world' # check tempfile is ok
def test_carddata_edit_items_display(pub):
CardDef.wipe()
user = create_user(pub)
data_source = {
'type': 'jsonvalue',
'value': json.dumps(
[{'id': '1', 'text': 'un', 'more': 'foo'}, {'id': '2', 'text': 'deux', 'more': 'bar'}]
),
}
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
fields.ItemsField(
id='1', label='Test', varname='foo', data_source=data_source, required=False, max_choice=3
),
]
carddef.backoffice_submission_roles = user.roles
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.store()
carddef.data_class().wipe()
app = login(get_app(pub))
resp = app.get('/backoffice/data/foo/add/')
resp.forms[0]['f1$element1'].checked = True
resp.forms[0]['f1$element2'].checked = True
resp = resp.forms[0].submit('submit')
resp = resp.follow()
assert resp.pyquery('#sect-dataview').text() == 'Test\nun\ndeux'
resp = resp.form.submit('button_editable')
resp = resp.follow()
resp.forms[0]['f1$element1'].checked = False
resp.forms[0]['f1$element2'].checked = False
resp = resp.forms[0].submit('submit')
assert resp.status_int == 302
resp = resp.follow()
assert not resp.pyquery('#sect-dataview').text()

View File

@ -1341,8 +1341,8 @@ def test_block_digest_item(pub):
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().select()[0].data['1']['data'] == [
{'123': 'foo', '234': '1', '234_display': 'un'},
{'123': 'foo2', '234': '2', '234_display': 'deux'},
{'123': 'foo', '234': '1', '234_display': 'un', '234_structured': None},
{'123': 'foo2', '234': '2', '234_display': 'deux', '234_structured': None},
]
# by default it gets the type of object
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar'
@ -1363,8 +1363,8 @@ def test_block_digest_item(pub):
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().select()[0].data['1']['data'] == [
{'123': 'foo', '234': '1', '234_display': 'un'},
{'123': 'foo2', '234': '2', '234_display': 'deux'},
{'123': 'foo', '234': '1', '234_display': 'un', '234_structured': None},
{'123': 'foo2', '234': '2', '234_display': 'deux', '234_structured': None},
]
assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY'

View File

@ -219,6 +219,49 @@ def test_live_field_condition_on_required_field(pub):
assert 'HELLO' not in resp.text
def test_field_live_items_condition_next_previous_page(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'Foo'
formdef.fields = [
fields.PageField(id='0', label='page1'),
fields.ItemsField(id='1', label='Bar', items=['a', 'b'], varname='bar', required=False),
fields.StringField(
id='2',
label='Foo',
size='40',
required=False,
varname='foo',
condition={'type': 'django', 'value': 'form_var_bar'},
),
fields.PageField(id='3', label='page2'),
]
formdef.store()
create_user(pub)
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/foo/')
assert 'f1$element0' in resp.form.fields
assert 'f1$element1' in resp.form.fields
assert 'f2' in resp.form.fields
assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
assert resp.html.find('div', {'data-field-id': '2'}).attrs.get('style') == 'display: none'
live_resp = app.post('/foo/live', params=resp.form.submit_fields())
assert not live_resp.json['result']['2']['visible']
resp.form['f1$element0'].checked = True
app.post('/foo/autosave', params=resp.form.submit_fields())
live_resp = app.post('/foo/live', params=resp.form.submit_fields())
assert live_resp.json['result']['2']['visible']
resp = resp.form.submit('submit') # to page 2
resp = resp.form.submit('previous') # back to page 1
live_resp = app.post('/foo/live', params=resp.form.submit_fields())
assert live_resp.json['result']['2']['visible']
resp.form['f1$element0'].checked = False
live_resp = app.post('/foo/live?modified_field_id=1', params=resp.form.submit_fields())
assert not live_resp.json['result']['2']['visible']
def test_field_live_condition_multipages(pub):
FormDef.wipe()
formdef = FormDef()

View File

@ -687,10 +687,7 @@ class Field:
display_value = self.store_display_value(data, self.id)
if raise_on_error and display_value is None:
raise SetValueError('a datasource is unavailable (field id: %s)' % self.id)
if display_value:
data['%s_display' % self.id] = display_value
elif '%s_display' % self.id in data:
del data['%s_display' % self.id]
data['%s_display' % self.id] = display_value or None

Cette manière de supprimer du dictionnaire plutôt que mettre une valeur vide date de l'introduction des sources de données (et des valeurs ..._display) (#1459), "évidemment" il n'y a pas d'explication particulière sur le sujet mais ça fonctionne très bien en mettant simplement None.

Cette manière de supprimer du dictionnaire plutôt que mettre une valeur vide date de l'introduction des sources de données (et des valeurs `..._display`) (#1459), "évidemment" il n'y a pas d'explication particulière sur le sujet mais ça fonctionne très bien en mettant simplement None.
if self.store_structured_value and value:
structured_value = self.store_structured_value(data, self.id, raise_on_error=raise_on_error)
if structured_value:
@ -698,10 +695,10 @@ class Field:
# in case of list field, override id
data['%s' % self.id] = str(structured_value.get('id'))
data['%s_structured' % self.id] = structured_value
elif '%s_structured' % self.id in data:
del data['%s_structured' % self.id]
else:
data['%s_structured' % self.id] = None
elif self.store_structured_value and '%s_structured' % self.id in data:
del data['%s_structured' % self.id]
data['%s_structured' % self.id] = None
def get_dependencies(self):
if getattr(self, 'data_source', None):