misc: make form_status accessible during form edition (#42541) #740

Merged
fpeters merged 1 commits from wip/42541-form-status-in-edit-mode into main 2023-10-01 08:54:27 +02:00
3 changed files with 52 additions and 1 deletions

View File

@ -2564,6 +2564,49 @@ def test_backoffice_wfedit_and_data_source_with_user_info(pub):
resp = resp.follow()
def test_backoffice_wfedit_and_form_status(pub):
user = create_user(pub)
workflow = Workflow(name='wfedit')
st1 = workflow.add_status('Status1')
wfedit = st1.add_action('editable', id='_wfedit')
wfedit.by = [user.roles[0]]
st2 = workflow.add_status('Status2')
wfedit = st2.add_action('editable', id='_wfedit')
wfedit.by = [user.roles[0]]
workflow.store()
formdef = FormDef()
formdef.name = 'test form'
formdef.fields = [
fields.CommentField(id='1', label='current status: {{form_status}}'),
fields.CommentField(id='2', label='previous status: {{form_previous_status}}'),
]
formdef.workflow_id = workflow.id
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
app = login(get_app(pub))
resp = app.get(f'/backoffice/management/test-form/{formdata.id}/')
resp = resp.form.submit('button_wfedit')
resp = resp.follow()
assert resp.pyquery('[data-field-id="1"]').text() == 'current status: Status1'
assert resp.pyquery('[data-field-id="2"]').text() == 'previous status:'
formdata.jump_status(st2.id)
formdata.store()
resp = app.get(f'/backoffice/management/test-form/{formdata.id}/')
resp = resp.form.submit('button_wfedit')
resp = resp.follow()
assert resp.pyquery('[data-field-id="1"]').text() == 'current status: Status2'
assert resp.pyquery('[data-field-id="2"]').text() == 'previous status: Status1'
def test_backoffice_wfedit_and_workflow_data(pub):
user = create_user(pub)
create_environment(pub)

View File

@ -42,7 +42,7 @@ from wcs.qommon.admin.texts import TextsDirectory
from wcs.qommon.storage import NothingToUpdate
from wcs.roles import logged_users_role
from wcs.sql_criterias import Equal, NotEqual
from wcs.variables import LazyFormDef
from wcs.variables import LazyFormData, LazyFormDef
from wcs.workflows import ContentSnapshotPart, WorkflowStatusItem
from ..qommon import _, emails, errors, get_cfg, misc, ngettext, template
@ -919,6 +919,11 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
formdata._edited_id = self.edited_data.id
# keep workflow data as it may be used in conditions
formdata.workflow_data = self.edited_data.workflow_data
# make form_status and form_previous_status accessible
formdata.status = self.edited_data.status
# add previous status as a private attribute as it cannot be computed
# from history when editing.
formdata._previous_status = LazyFormData(self.edited_data).previous_status
return formdata
formdata.status = ''

View File

@ -946,6 +946,9 @@ class LazyFormData(LazyFormDef):
@property
def previous_status(self):
if getattr(self._formdata, '_previous_status', None):
# for minimal formdata object used during edition.
return self._formdata._previous_status
if self._formdata.evolution:
for evolution in reversed(self._formdata.evolution):
if evolution.status and evolution.status != self._formdata.status: