misc: extend |getlist on blocks, for compatibility names (#89777)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-04-19 10:36:05 +02:00
parent 291fea5b8b
commit da1be3fd7f
2 changed files with 71 additions and 1 deletions

View File

@ -5155,6 +5155,73 @@ def test_getlist_of_lazyformdata_field(pub):
assert tmpl.render(context) == '1,2,3'
def test_getlist_of_relation_in_block_field(pub):
BlockDef.wipe()
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'Card'
carddef.fields = [
fields.StringField(id='1', label='string', varname='str'),
fields.NumericField(id='2', label='numeric', varname='num'),
]
carddef.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
block = BlockDef()
block.name = 'foobar'
block.fields = [
fields.ItemField(id='1', label='card', varname='card', data_source=ds),
]
block.store()
formdef = FormDef()
formdef.name = 'test form'
formdef.fields = [
fields.BlockField(id='1', label='test', block_slug='foobar', max_items=3, varname='block'),
]
formdef.store()
carddef.data_class().wipe()
formdef.data_class().wipe()
carddatas = []
for i in range(3):
carddata = carddef.data_class()()
carddata.data = {'1': str(i + 1), '2': i + 1}
carddata.just_created()
carddata.store()
carddatas.append(carddata)
formdata = formdef.data_class()()
formdata.data = {
'1': {
'data': [
{'1': carddatas[0].id, '1_display': 'card'},
{'1': carddatas[1].id, '1_display': 'card'},
{'1': carddatas[2].id, '1_display': 'card'},
{'1': carddatas[0].id, '1_display': 'card'},
],
'schema': {'1': 'item'},
},
}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{ form_var_block|getlist:"card_live_var_str"|sum }}')
assert tmpl.render(context) == '7'
tmpl = Template('{{ form_var_block|getlist:"card_live_var_num"|sum }}')
assert tmpl.render(context) == '7'
with pytest.raises(AttributeError):
tmpl = Template('{{ form_var_block|getlist:"card_live_var_plop"|sum }}')
tmpl.render(context)
def test_items_field_contains(pub):
NamedDataSource.wipe()
data_source = NamedDataSource(name='foobar')

View File

@ -1903,7 +1903,10 @@ class LazyFieldVarBlock(LazyFieldVar):
if field.varname == key:
break
else:
raise AttributeError('No such attribute %r' % key)
value = [CompatibilityNamesDict({'X': x}).get(f'X_{key}') for x in self]
if all(x is None for x in value):
raise AttributeError('No such attribute %r' % key)
return value
return [data.get(field.id) for data in self._formdata.data.get(self._field.id)['data']]
def getlistdict(self, keys):