admin: use accessor when changing workflow (#57355)

this makes sure a cached copy of the workflow is not used to get fields.
This commit is contained in:
Frédéric Péters 2021-09-28 15:37:00 +02:00
parent 2bfc1bd1d8
commit 38fb9383d9
2 changed files with 26 additions and 4 deletions

View File

@ -16,7 +16,7 @@ from wcs.data_sources import NamedDataSource
from wcs.formdef import FormDef
from wcs.qommon.errors import ConnectionError
from wcs.qommon.http_request import HTTPRequest
from wcs.workflows import Workflow
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
from wcs.wscalls import NamedWsCall
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
@ -498,6 +498,10 @@ def test_form_workflow_change(pub):
workflow.store()
workflow = Workflow(name='Workflow Two')
workflow.possible_status = Workflow.get_default_workflow().possible_status[:]
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(id='bo3-3x', label='bo field', type='string'),
]
workflow.store()
app = login(get_app(pub))
@ -513,6 +517,9 @@ def test_form_workflow_change(pub):
resp = resp.forms[0].submit('submit')
assert FormDef.get(formdef.id).workflow_id == workflow.id
# run a SQL SELECT and we known all columns are defined.
FormDef.get(formdef.id).data_class().select()
def test_form_workflow_link(pub):
create_superuser(pub)
@ -572,6 +579,10 @@ def test_form_workflow_remapping(pub):
workflow = Workflow(name='Workflow Two')
# create it with a single status
workflow.possible_status = [Workflow.get_default_workflow().possible_status[-1]]
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(id='bo3-3x', label='bo field', type='string'),
]
workflow.store()
app = login(get_app(pub))
@ -588,6 +599,10 @@ def test_form_workflow_remapping(pub):
assert data_class.get(formdata1.id).status == 'wf-new'
assert data_class.get(formdata2.id).status == 'draft'
resp = resp.forms[0].submit()
# run a SQL SELECT and we known all columns are defined.
FormDef.get(formdef.id).data_class().select()
assert data_class.get(formdata1.id).status == 'wf-finished'
assert data_class.get(formdata2.id).status == 'draft'
@ -595,6 +610,10 @@ def test_form_workflow_remapping(pub):
workflow2 = workflow
workflow = Workflow(name='Workflow Three')
workflow.possible_status = Workflow.get_default_workflow().possible_status[-2:][:]
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(id='bo4', label='another bo field', type='string'),
]
workflow.store()
resp = app.get('/backoffice/forms/1/')
@ -611,6 +630,9 @@ def test_form_workflow_remapping(pub):
assert data_class.get(formdata1.id).status == 'wf-finished'
assert data_class.get(formdata2.id).status == 'draft'
# run a SQL SELECT and we known all columns are defined.
FormDef.get(formdef.id).data_class().select()
def test_form_submitter_roles(pub):
create_superuser(pub)

View File

@ -1099,7 +1099,7 @@ class FormDefPage(Directory):
if workflow_id is None:
workflow_id = self.formdef_default_workflow
return redirect('workflow-status-remapping?new=%s' % workflow_id)
self.formdef.workflow_id = workflow_id
self.formdef.workflow = Workflow.get(workflow_id) if workflow_id else None
self.formdef.store(comment=_('Workflow change'))
return redirect('.')
@ -1145,9 +1145,9 @@ class FormDefPage(Directory):
)
self.workflow_status_remapping_submit(form)
if new_workflow.id == self.formdef_default_workflow:
self.formdef.workflow_id = None
self.formdef.workflow = None
else:
self.formdef.workflow_id = new_workflow.id
self.formdef.workflow = Workflow.get(new_workflow.id)
self.formdef.store(comment=_('Workflow change'))
# instruct formdef to update its security rules
self.formdef.data_class().rebuild_security()