workflow: extend resubmit action for frontoffice and preset target (#20009)
This commit is contained in:
parent
eb7d39a3b1
commit
b483ea747d
|
@ -22,12 +22,13 @@ from wcs.qommon.ident.password_accounts import PasswordAccount
|
|||
from wcs.formdef import FormDef
|
||||
from wcs.workflows import (Workflow, EditableWorkflowStatusItem,
|
||||
DisplayMessageWorkflowStatusItem, WorkflowBackofficeFieldsFormDef,
|
||||
ChoiceWorkflowStatusItem)
|
||||
ChoiceWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem)
|
||||
from wcs.wf.export_to_model import ExportToModel, transform_to_pdf
|
||||
from wcs.wf.jump import JumpWorkflowStatusItem
|
||||
from wcs.wf.attachment import AddAttachmentWorkflowStatusItem
|
||||
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
|
||||
from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem
|
||||
from wcs.wf.resubmit import ResubmitWorkflowStatusItem
|
||||
from wcs.categories import Category
|
||||
from wcs.roles import Role, logged_users_role
|
||||
from wcs.tracking_code import TrackingCode
|
||||
|
@ -3850,3 +3851,66 @@ def test_formdata_named_wscall(http_requests, pub):
|
|||
|
||||
formdata = formdef.data_class().select()[0]
|
||||
assert formdata.evolution[0].parts[0].content == 'Hello bar World'
|
||||
|
||||
def test_resubmit(pub):
|
||||
user = create_user(pub)
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'form title'
|
||||
formdef.fields = [fields.StringField(id='1', label='string', varname='toto')]
|
||||
formdef.store()
|
||||
|
||||
formdef2 = FormDef()
|
||||
formdef2.name = 'form title bis'
|
||||
formdef2.enable_tracking_codes = True
|
||||
formdef2.fields = [fields.StringField(id='1', label='string', varname='titi'),
|
||||
fields.StringField(id='2', label='string', varname='toto')]
|
||||
formdef2.store()
|
||||
|
||||
wf = Workflow(name='resubmit')
|
||||
st1 = wf.add_status('Status1')
|
||||
st2 = wf.add_status('Status2')
|
||||
|
||||
resubmit = ResubmitWorkflowStatusItem()
|
||||
resubmit.id = '_resubmit'
|
||||
resubmit.by = ['_submitter']
|
||||
resubmit.formdef_slug = formdef2.url_name
|
||||
st1.items.append(resubmit)
|
||||
resubmit.parent = st1
|
||||
|
||||
jump = JumpOnSubmitWorkflowStatusItem()
|
||||
jump.id = '_jump'
|
||||
jump.status = st2.id
|
||||
st1.items.append(jump)
|
||||
jump.parent = st1
|
||||
|
||||
register_comment = RegisterCommenterWorkflowStatusItem()
|
||||
register_comment.id = '_register'
|
||||
register_comment.comment = '<p><a href="[resubmit_formdata_draft_url]">new draft</a></p>'
|
||||
st2.items.append(register_comment)
|
||||
register_comment.parent = st2
|
||||
|
||||
wf.store()
|
||||
|
||||
formdef.workflow_id = wf.id
|
||||
formdef.store()
|
||||
|
||||
formdef2.data_class().wipe()
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.user_id = user.id
|
||||
formdata.just_created()
|
||||
formdata.data = {'1': 'XXX'}
|
||||
formdata.store()
|
||||
|
||||
app = login(get_app(pub), username='foo', password='foo')
|
||||
resp = app.get(formdata.get_url())
|
||||
resp = resp.form.submit('button_resubmit')
|
||||
resp = resp.follow()
|
||||
assert 'new draft' in resp.body
|
||||
assert formdef2.data_class().select()[0].status == 'draft'
|
||||
assert formdef2.data_class().select()[0].data.get('1') is None
|
||||
assert formdef2.data_class().select()[0].data.get('2') == 'XXX'
|
||||
resp = resp.click('new draft')
|
||||
resp = resp.follow()
|
||||
assert resp.forms[1]['f2'].value == 'XXX'
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from quixote import get_publisher
|
||||
from quixote import get_publisher, get_request
|
||||
|
||||
from qommon import _
|
||||
from wcs.workflows import WorkflowStatusItem, register_item_class
|
||||
|
@ -31,6 +31,7 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem):
|
|||
ok_in_global_action = False
|
||||
|
||||
by = []
|
||||
formdef_slug = None
|
||||
label = None
|
||||
backoffice_info_text = None
|
||||
|
||||
|
@ -48,24 +49,34 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem):
|
|||
label = self.label
|
||||
if not label:
|
||||
label = _('Resubmit')
|
||||
list_forms = [(x.id, x.name, x.id) for x in FormDef.select(order_by='name')
|
||||
if x.backoffice_submission_roles]
|
||||
form.add(SingleSelectWidget, 'resubmit', title=_('Form'),
|
||||
required=True, options=list_forms)
|
||||
if not self.formdef_slug: # user can choose appropriate form
|
||||
if get_request().is_in_backoffice:
|
||||
list_forms = [(x.id, x.name, x.id) for x in FormDef.select(order_by='name')
|
||||
if x.backoffice_submission_roles]
|
||||
else:
|
||||
list_forms = [(x.id, x.name, x.id) for x in FormDef.select(order_by='name')
|
||||
if x.enable_tracking_codes]
|
||||
form.add(SingleSelectWidget, 'resubmit', title=_('Form'),
|
||||
required=True, options=list_forms)
|
||||
form.add_submit('button%s' % self.id, label)
|
||||
form.get_widget('button%s' % self.id).backoffice_info_text = self.backoffice_info_text
|
||||
|
||||
def submit_form(self, form, formdata, user, evo):
|
||||
if form.get_submit() != 'button%s' % self.id:
|
||||
return
|
||||
formdef_id = form.get_widget('resubmit').parse()
|
||||
formdef = FormDef.get(formdef_id)
|
||||
if not self.formdef_slug: # user can choose appropriate form
|
||||
formdef_id = form.get_widget('resubmit').parse()
|
||||
formdef = FormDef.get(formdef_id)
|
||||
elif self.formdef_slug == '_same':
|
||||
formdef = formdata.formdef
|
||||
else:
|
||||
formdef = FormDef.get_by_urlname(self.formdef_slug)
|
||||
new_formdata = formdef.data_class()()
|
||||
new_formdata.status = 'draft'
|
||||
new_formdata.user_id = formdata.user_id
|
||||
new_formdata.submission_context = formdata.submission_context
|
||||
new_formdata.submission_channel = formdata.submission_channel
|
||||
new_formdata.backoffice_submission = True
|
||||
new_formdata.backoffice_submission = get_request().is_in_backoffice()
|
||||
if not new_formdata.submission_context:
|
||||
new_formdata.submission_context = {}
|
||||
new_formdata.submission_context['orig_formdef_id'] = formdata.formdef.id
|
||||
|
@ -92,7 +103,10 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem):
|
|||
|
||||
new_formdata.store()
|
||||
|
||||
workflow_data = {'resubmit_formdata_backoffice_url': new_formdata.get_url(backoffice=True)}
|
||||
workflow_data = {
|
||||
'resubmit_formdata_backoffice_url': new_formdata.get_url(backoffice=True),
|
||||
'resubmit_formdata_draft_url': new_formdata.get_url(backoffice=False).rstrip('/'),
|
||||
}
|
||||
formdata.update_workflow_data(workflow_data)
|
||||
formdata.store()
|
||||
|
||||
|
@ -106,12 +120,17 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem):
|
|||
if 'label' in parameters:
|
||||
form.add(StringWidget, '%slabel' % prefix, title=_('Button Label'),
|
||||
value=self.label or _('Resubmit'))
|
||||
if 'formdef_slug' in parameters:
|
||||
list_forms = [(None, _('Any'), None), ('_same', _('Same as form'), '_same')]
|
||||
list_forms.extend([(x.url_name, x.name, x.url_name) for x in FormDef.select(order_by='name')])
|
||||
form.add(SingleSelectWidget, 'formdef_slug', title=_('Form'),
|
||||
required=False, options=list_forms)
|
||||
if 'backoffice_info_text' in parameters:
|
||||
form.add(WysiwygTextWidget, '%sbackoffice_info_text' % prefix,
|
||||
title=_('Information Text for Backoffice'),
|
||||
value=self.backoffice_info_text)
|
||||
|
||||
def get_parameters(self):
|
||||
return ('by', 'label', 'backoffice_info_text')
|
||||
return ('by', 'label', 'formdef_slug', 'backoffice_info_text')
|
||||
|
||||
register_item_class(ResubmitWorkflowStatusItem)
|
||||
|
|
Loading…
Reference in New Issue