forms: add support for computed fields in edit action (#55355)
This commit is contained in:
parent
0c11395af5
commit
e190a2a27f
|
@ -7,6 +7,7 @@ from django.utils.timezone import make_aware
|
|||
from wcs import fields
|
||||
from wcs.formdef import FormDef
|
||||
from wcs.qommon.substitution import CompatibilityNamesDict
|
||||
from wcs.workflows import EditableWorkflowStatusItem, Workflow
|
||||
from wcs.wscalls import NamedWsCall
|
||||
|
||||
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
|
||||
|
@ -410,3 +411,69 @@ def test_computed_field_inspect_keys(pub):
|
|||
formdata.data = {'1': {'foo': 'bar'}}
|
||||
assert 'form_var_computed_foo' in substvars.get_flat_keys()
|
||||
assert substvars['form_var_computed_foo'] == 'bar'
|
||||
|
||||
|
||||
def test_computed_field_edit_action(pub):
|
||||
create_user(pub)
|
||||
|
||||
workflow = Workflow.get_default_workflow()
|
||||
workflow.id = '2'
|
||||
|
||||
editable = EditableWorkflowStatusItem()
|
||||
editable.id = '_editable'
|
||||
editable.by = ['_submitter']
|
||||
st2 = workflow.get_status('new')
|
||||
st2.items.append(editable)
|
||||
editable.parent = st2
|
||||
workflow.store()
|
||||
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.name = 'test'
|
||||
formdef.fields = [
|
||||
fields.StringField(id='0', label='field', varname='plop'),
|
||||
fields.ComputedField(
|
||||
id='1', label='computed', varname='computed', value_template='{{ form_var_plop }}'
|
||||
),
|
||||
]
|
||||
formdef.workflow_id = workflow.id
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
|
||||
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
|
||||
resp.forms[0]['f0'] = 'foobar'
|
||||
resp = resp.forms[0].submit('submit') # -> validation
|
||||
resp = resp.forms[0].submit('submit').follow() # -> submit
|
||||
assert 'The form has been recorded' in resp.text
|
||||
assert formdef.data_class().count() == 1
|
||||
formdata = formdef.data_class().select()[0]
|
||||
assert formdata.data == {'0': 'foobar', '1': 'foobar'}
|
||||
|
||||
resp = resp.forms[0].submit('button_editable')
|
||||
resp = resp.follow()
|
||||
resp.forms[0]['f0'] = 'bar'
|
||||
resp = resp.forms[0].submit('submit')
|
||||
formdata.refresh_from_storage()
|
||||
assert formdata.data == {'0': 'bar', '1': 'bar'}
|
||||
|
||||
# freeze value
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields[1].value_template = '{{ request.GET.foo }}'
|
||||
formdef.fields[1].freeze_on_initial_value = True
|
||||
formdef.store()
|
||||
|
||||
resp = login(get_app(pub), username='foo', password='foo').get('/test/?foo=PLOP')
|
||||
resp.forms[0]['f0'] = 'foobar'
|
||||
resp = resp.forms[0].submit('submit') # -> validation
|
||||
resp = resp.forms[0].submit('submit').follow() # -> submit
|
||||
assert 'The form has been recorded' in resp.text
|
||||
assert formdef.data_class().count() == 1
|
||||
formdata = formdef.data_class().select()[0]
|
||||
assert formdata.data == {'0': 'foobar', '1': 'PLOP'}
|
||||
|
||||
resp = resp.forms[0].submit('button_editable')
|
||||
resp = resp.follow()
|
||||
resp.forms[0]['f0'] = 'bar'
|
||||
resp = resp.forms[0].submit('submit')
|
||||
formdata.refresh_from_storage()
|
||||
assert formdata.data == {'0': 'bar', '1': 'PLOP'}
|
||||
|
|
|
@ -912,6 +912,15 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
get_request().form['magictoken'] = token
|
||||
session.add_magictoken(token, self.edited_data.data)
|
||||
|
||||
# and restore computed data
|
||||
computed_values = {}
|
||||
for field in self.formdef.fields or []:
|
||||
if field.key != 'computed':
|
||||
continue
|
||||
if field.id in self.edited_data.data:
|
||||
computed_values[field.id] = self.edited_data.data.get(field.id)
|
||||
session.add_magictoken('%s-computed' % token, computed_values)
|
||||
|
||||
# redirect to existing formdata if form is configured to only allow one
|
||||
# per user and it's already there.
|
||||
existing_form_id = self.check_unique_submission()
|
||||
|
@ -1467,6 +1476,9 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
|
||||
def submitted_existing(self, form):
|
||||
new_data = self.formdef.get_data(form)
|
||||
magictoken = get_request().form['magictoken']
|
||||
computed_values = get_session().get_by_magictoken('%s-computed' % magictoken, {})
|
||||
new_data.update(computed_values)
|
||||
for k, v in self.edited_data.data.items():
|
||||
if k.startswith(WorkflowBackofficeFieldsFormDef.field_prefix):
|
||||
new_data[k] = v
|
||||
|
|
Loading…
Reference in New Issue