cards: do not let id/text fields overwrite native values (#60101)

This commit is contained in:
Frédéric Péters 2021-12-27 13:06:35 +01:00
parent 997bfc5898
commit d6128fa526
2 changed files with 45 additions and 1 deletions

View File

@ -5452,6 +5452,50 @@ def test_item_field_from_cards(pub):
assert formdef.data_class().select()[0].data['0_structured']['name'] == 'bar'
def test_item_field_from_cards_id_identifier(pub):
create_user(pub)
formdef = create_formdef()
formdef.data_class().wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.digest_templates = {'default': '{{form_var_name}}'}
carddef.fields = [
fields.StringField(id='0', label='string', varname='name'),
fields.StringField(id='1', label='string', varname='id'),
]
carddef.store()
carddef.data_class().wipe()
for i, value in enumerate(['foo', 'bar', 'baz']):
carddata = carddef.data_class()()
carddata.data = {
'0': value,
'1': 'attr%s' % i,
}
carddata.just_created()
carddata.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
formdef.fields = [
fields.ItemField(id='0', label='string', type='item', data_source=ds, display_disabled_items=True)
]
formdef.store()
resp = get_app(pub).get('/test/')
assert resp.form['f0'].options == [
('2', False, 'bar'),
('3', False, 'baz'),
('1', False, 'foo'),
]
resp.form['f0'] = '2'
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().select()[0].data['0'] == '2'
assert formdef.data_class().select()[0].data['0_display'] == 'bar'
assert formdef.data_class().select()[0].data['0_structured']['name'] == 'bar'
def test_item_field_from_cards_then_comment_related_card(pub):
# https://dev.entrouvert.org/issues/58292
create_user(pub)

View File

@ -49,7 +49,7 @@ class CardData(FormData):
'text': (self.digests or {}).get(digest_key) or '',
}
for field in self.formdef.get_all_fields():
if not field.varname:
if not field.varname or field.varname in ('id', 'text'):
continue
value = self.data and self.data.get(field.id)
if isinstance(value, str):