misc: always set empty display/structured when there is no value (#66609) #469
|
@ -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()
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
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):
|
||||
|
|
Loading…
Reference in New Issue
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.