misc: add prefill option for whole block (#73993) #90
|
@ -4,6 +4,7 @@ from webtest import Upload
|
|||
|
||||
from wcs import fields
|
||||
from wcs.blocks import BlockDef
|
||||
from wcs.carddef import CardDef
|
||||
from wcs.categories import Category
|
||||
from wcs.data_sources import NamedDataSource
|
||||
from wcs.formdef import FormDef
|
||||
|
@ -2126,3 +2127,82 @@ def test_formdata_page_with_block_bad_value(pub):
|
|||
login(app, username='foo', password='foo')
|
||||
resp = app.get(formdata.get_url())
|
||||
assert resp.pyquery('div.field-type-block div.value').text() == ''
|
||||
|
||||
|
||||
def test_block_prefill_full_block(pub):
|
||||
FormDef.wipe()
|
||||
BlockDef.wipe()
|
||||
CardDef.wipe()
|
||||
|
||||
block = BlockDef()
|
||||
block.name = 'foobar'
|
||||
block.fields = [
|
||||
fields.StringField(id='123', required=True, label='Test', type='string', varname='plop'),
|
||||
]
|
||||
block.digest_template = '{{block_var_plop}}'
|
||||
block.store()
|
||||
|
||||
carddef = CardDef()
|
||||
carddef.name = 'card title'
|
||||
carddef.fields = [
|
||||
fields.BlockField(id='2', label='test', type='block:foobar', varname='foo', max_items=5),
|
||||
]
|
||||
carddef.store()
|
||||
carddef.data_class().wipe()
|
||||
|
||||
carddata = carddef.data_class()()
|
||||
carddata.data = {
|
||||
'2': {
|
||||
'data': [{'123': 'foo'}, {'123': 'bar'}],
|
||||
'schema': {'123': 'string'},
|
||||
},
|
||||
lguerin marked this conversation as resolved
Outdated
|
||||
'2_display': 'foo, bar',
|
||||
}
|
||||
carddata.just_created()
|
||||
carddata.store()
|
||||
|
||||
# get block value from an existing block value
|
||||
formdef = FormDef()
|
||||
formdef.name = 'form title'
|
||||
formdef.fields = [
|
||||
fields.BlockField(
|
||||
id='1',
|
||||
label='test',
|
||||
type='block:foobar',
|
||||
max_items=5,
|
||||
prefill={'type': 'string', 'value': '{{cards|objects:"card-title"|first|get:"form_var_foo"}}'},
|
||||
)
|
||||
]
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
|
||||
app = get_app(pub)
|
||||
resp = app.get(formdef.get_url())
|
||||
assert resp.form['f1$element0$f123'].value == 'foo'
|
||||
assert resp.form['f1$element1$f123'].value == 'bar'
|
||||
resp = resp.form.submit('submit') # validation
|
||||
resp = resp.form.submit('submit') # done
|
||||
assert formdef.data_class().select()[0].data == {
|
||||
'1': {
|
||||
'data': [{'123': 'foo'}, {'123': 'bar'}],
|
||||
'schema': {'123': 'string'},
|
||||
},
|
||||
lguerin marked this conversation as resolved
Outdated
lguerin
commented
le block n'a pas de digest_template, d'où vient cette valeur ? le block n'a pas de digest_template, d'où vient cette valeur ?
fpeters
commented
Quand il n'y a pas de digest c'est le nom du bloc qui est pris; j'ai ajouté un digest_template pour rendre ça plus clair. Quand il n'y a pas de digest c'est le nom du bloc qui est pris; j'ai ajouté un digest_template pour rendre ça plus clair.
|
||||
'1_display': 'foo, bar',
|
||||
}
|
||||
|
||||
# create a new block value
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields[0].prefill['value'] = '{% block_value plop="toto" %}'
|
||||
formdef.store()
|
||||
|
||||
resp = app.get(formdef.get_url())
|
||||
assert resp.form['f1$element0$f123'].value == 'toto'
|
||||
resp = resp.form.submit('submit') # validation
|
||||
resp = resp.form.submit('submit') # done
|
||||
assert formdef.data_class().select()[0].data == {
|
||||
'1': {
|
||||
'data': [{'123': 'toto'}],
|
||||
'schema': {'123': 'string'},
|
||||
},
|
||||
'1_display': 'toto',
|
||||
}
|
||||
|
|
|
@ -395,6 +395,8 @@ class BlockWidget(WidgetList):
|
|||
)
|
||||
|
||||
def set_value(self, value):
|
||||
if isinstance(value, fields.BlockRowValue):
|
||||
value = value.make_value(block=self.block, field=self.field, data={})
|
||||
super().set_value(value['data'] if value else None)
|
||||
self.value = value
|
||||
|
||||
|
|
|
@ -3855,8 +3855,6 @@ class BlockField(WidgetField):
|
|||
|
||||
def fill_admin_form(self, form):
|
||||
super().fill_admin_form(form)
|
||||
if form.get_widget('prefill'):
|
||||
form.remove('prefill')
|
||||
form.add(
|
||||
IntWidget,
|
||||
'default_items_count',
|
||||
|
|
|
@ -432,7 +432,9 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
prefill_user = get_request().user
|
||||
if get_request().is_in_backoffice():
|
||||
prefill_user = get_publisher().substitutions.get_context_variables().get('form_user')
|
||||
v, locked = field.get_prefill_value(user=prefill_user)
|
||||
v, locked = field.get_prefill_value(
|
||||
user=prefill_user, force_string=bool(field.key != 'block')
|
||||
)
|
||||
|
||||
# always set additional attributes as they will be used for
|
||||
# "live prefill", regardless of existing data.
|
||||
|
|
Loading…
Reference in New Issue
2_display ?
En effet, et j'ai adapté pour correspondre au digest_template ajouté via l'autre commentaire.