backoffice: allow {{form_user}} usage in live prefills during edition (#68379)

This commit is contained in:
Frédéric Péters 2022-08-27 17:58:02 +02:00
parent 6ecfd58a02
commit ca061dfac4
3 changed files with 56 additions and 0 deletions

View File

@ -1999,6 +1999,52 @@ def test_backoffice_wfedit_and_live_condition(pub):
assert live_resp.json['result']['2']['visible']
def test_backoffice_wfedit_and_prefill_with_user_variable(pub):
user = create_user(pub)
create_environment(pub)
formdef = FormDef.get_by_urlname('form-title')
formdef.fields[0].varname = 'foo'
formdef.fields[1].condition = {'type': 'django', 'value': 'form_var_foo == "test"'}
formdef.fields.append(
fields.StringField(
id='100',
label='user name',
type='string',
prefill={'type': 'string', 'value': 'a{{form_user_name}}b'},
)
)
formdef.store()
form_class = formdef.data_class()
second_user = pub.user_class(name='foobar')
second_user.store()
number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
number31.user_id = second_user.id
number31.store()
# attach a custom workflow
workflow = Workflow(name='wfedit')
st1 = workflow.add_status('Status1', number31.status.split('-')[1])
wfedit = st1.add_action('editable', id='_wfedit')
wfedit.by = [user.roles[0]]
workflow.store()
formdef.workflow_id = workflow.id
formdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
resp = resp.form.submit('button_wfedit').follow()
assert resp.form['f100'].value == 'afoobarb'
live_url = resp.html.find('form').attrs['data-live-url']
live_resp = app.post(live_url + '?prefilled_100=on', params=resp.form.submit_fields())
assert live_resp.json['result']['100']['content'] == 'afoobarb'
def test_global_listing(pub):
create_user(pub)
create_environment(pub)

View File

@ -2919,6 +2919,10 @@ class FormPage(Directory):
class FormBackofficeEditPage(FormFillPage):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.edit_mode = True
def create_form(self, *args, **kwargs):
form = super().create_form(*args, **kwargs)
form.attrs['data-live-url'] = self.formdef.get_url(backoffice=True) + 'live'

View File

@ -834,6 +834,11 @@ class FormPage(Directory, FormTemplateMixin):
computed_values = get_session().get_by_magictoken('%s-computed' % magictoken) or {}
formdata.data.update(computed_values)
if formdata.data.get('edited_formdata_id'):
# during editing (edited_formdata_id is set when starting edition,
# when there's no magictoken yet)
self.edited_data = self.formdef.data_class().get(formdata.data.get('edited_formdata_id'))
if self.edit_mode:
if magictoken is None:
# restore edited data early on as it may be required to
@ -1002,6 +1007,7 @@ class FormPage(Directory, FormTemplateMixin):
self.edited_data.feed_session()
token = randbytes(8)
get_request().form['magictoken'] = token
self.edited_data.data['edited_formdata_id'] = self.edited_data.id
session.add_magictoken(token, self.edited_data.data)
# and restore computed data