formdata: add live view of item field linked card data (#45094)
This commit is contained in:
parent
27f3db832b
commit
ae4ce9768b
|
@ -16,6 +16,7 @@ from wcs.qommon.form import PicklableUpload
|
|||
from wcs.qommon.http_request import HTTPRequest
|
||||
from wcs import fields, formdef
|
||||
from wcs.blocks import BlockDef
|
||||
from wcs.carddef import CardDef
|
||||
from wcs.categories import Category
|
||||
from wcs.conditions import Condition
|
||||
from wcs.formdef import FormDef
|
||||
|
@ -783,6 +784,52 @@ def test_lazy_formdata_duplicated_varname(pub, variable_test_data):
|
|||
assert lazy_formdata.var.foo_foo == 'baz' # 2nd value
|
||||
|
||||
|
||||
def test_lazy_formdata_live_item(pub):
|
||||
CardDef.wipe()
|
||||
carddef = CardDef()
|
||||
carddef.name = 'items'
|
||||
carddef.digest_template = '{{form_var_name}}'
|
||||
carddef.fields = [
|
||||
fields.StringField(id='0', label='string', varname='name'),
|
||||
fields.StringField(id='1', label='string', varname='attr'),
|
||||
]
|
||||
carddef.store()
|
||||
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 = FormDef()
|
||||
formdef.name = 'foobar'
|
||||
formdef.fields = [fields.ItemField(id='0', label='string', type='item',
|
||||
varname='foo', data_source=ds, display_disabled_items=True)]
|
||||
formdef.store()
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {
|
||||
'0': str(carddata.id),
|
||||
}
|
||||
pub.substitutions.feed(pub)
|
||||
pub.substitutions.feed(formdef)
|
||||
pub.substitutions.feed(formdata)
|
||||
|
||||
context = pub.substitutions.get_context_variables(mode='lazy')
|
||||
assert context['form_var_foo_live_name'] == 'items'
|
||||
assert context['form_var_foo_live_number'] == carddata.get_display_id()
|
||||
assert context['form_var_foo_live_var_name'] == 'baz'
|
||||
assert context['form_var_foo_live_var_attr'] == 'attr2'
|
||||
|
||||
CardDef.wipe()
|
||||
context = pub.substitutions.get_context_variables(mode='lazy')
|
||||
with pytest.raises(KeyError):
|
||||
context['form_var_foo_live_name']
|
||||
|
||||
|
||||
def test_lazy_formdata_queryset(pub, variable_test_data):
|
||||
lazy_formdata = variable_test_data
|
||||
data_class = lazy_formdata._formdef.data_class()
|
||||
|
|
|
@ -642,6 +642,8 @@ class LazyFieldVarStructured(LazyFieldVar):
|
|||
return ['raw']
|
||||
|
||||
keys = ['raw', 'structured']
|
||||
if self._field.data_source and self._field.data_source.get('type', '').startswith('carddef:'):
|
||||
keys.append('live')
|
||||
|
||||
def walk(base, value):
|
||||
if isinstance(value, dict):
|
||||
|
@ -667,6 +669,18 @@ class LazyFieldVarStructured(LazyFieldVar):
|
|||
def structured(self):
|
||||
return self._field.get_structured_value(self._data)
|
||||
|
||||
@property
|
||||
def live(self):
|
||||
if not (self._field.data_source and self._field.data_source.get('type', '').startswith('carddef:')):
|
||||
raise AttributeError('live')
|
||||
from wcs.carddef import CardDef
|
||||
try:
|
||||
carddef = CardDef.get_by_urlname(self._field.data_source['type'][8:])
|
||||
carddata = carddef.data_class().get(self.raw)
|
||||
except KeyError:
|
||||
raise AttributeError('live')
|
||||
return LazyFormData(carddata)
|
||||
|
||||
def __getitem__(self, key):
|
||||
try:
|
||||
return super(LazyFieldVarStructured, self).__getitem__(key)
|
||||
|
|
Loading…
Reference in New Issue