misc: add prefill option for whole block (#73993) #90

Merged
fpeters merged 1 commits from wip/73993-whole-block-prefill into main 2023-02-10 09:15:30 +01:00
4 changed files with 85 additions and 3 deletions

View File

@ -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 ?

2_display ?

En effet, et j'ai adapté pour correspondre au digest_template ajouté via l'autre commentaire.

En effet, et j'ai adapté pour correspondre au digest_template ajouté via l'autre commentaire.
'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

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 ?

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',
}

View File

@ -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

View File

@ -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',

View File

@ -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.