backoffice: make 'edit' workflow stay in backoffice (#9093)
This commit is contained in:
parent
9d34babb75
commit
d2ba36516b
|
@ -17,7 +17,7 @@ from qommon.ident.password_accounts import PasswordAccount
|
|||
from wcs.qommon.http_request import HTTPRequest
|
||||
from wcs.roles import Role
|
||||
from wcs.workflows import (Workflow, CommentableWorkflowStatusItem,
|
||||
ChoiceWorkflowStatusItem)
|
||||
ChoiceWorkflowStatusItem, EditableWorkflowStatusItem)
|
||||
from wcs.wf.wscall import WebserviceCallStatusItem
|
||||
from wcs.categories import Category
|
||||
from wcs.formdef import FormDef
|
||||
|
@ -1049,6 +1049,44 @@ def test_backoffice_wscall_failure_display(pub):
|
|||
assert (' with the number %s.' % number31) in resp.body
|
||||
assert not 'Error during webservice call' in resp.body
|
||||
|
||||
def test_backoffice_wfedit(pub):
|
||||
user = create_user(pub)
|
||||
create_environment(pub)
|
||||
formdef = FormDef.get_by_urlname('form-title')
|
||||
form_class = formdef.data_class()
|
||||
|
||||
number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
|
||||
|
||||
# attach a custom workflow
|
||||
workflow = Workflow(name='wfedit')
|
||||
st1 = workflow.add_status('Status1', number31.status.split('-')[1])
|
||||
|
||||
wfedit = EditableWorkflowStatusItem()
|
||||
wfedit.id = '_wfedit'
|
||||
wfedit.by = [user.roles[0]]
|
||||
st1.items.append(wfedit)
|
||||
wfedit.parent = st1
|
||||
workflow.store()
|
||||
|
||||
formdef.workflow_id = workflow.id
|
||||
formdef.store()
|
||||
|
||||
app = login(get_app(pub))
|
||||
|
||||
resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
|
||||
assert (' with the number %s.' % number31.id) in resp.body
|
||||
resp = resp.form.submit('button_wfedit')
|
||||
resp = resp.follow()
|
||||
assert resp.form['f1'].value == number31.data['1']
|
||||
assert resp.form['f2'].value == number31.data['2']
|
||||
assert resp.form['f3'].value == number31.data['3']
|
||||
assert 'value="Save Changes"' in resp.body
|
||||
resp.form['f2'].value = 'bar'
|
||||
resp = resp.form.submit('submit')
|
||||
resp = resp.follow()
|
||||
assert form_class().get(number31.id).data['2'] == 'bar'
|
||||
number31.store()
|
||||
|
||||
def test_global_listing(pub):
|
||||
if not pub.is_using_postgresql():
|
||||
pytest.skip('this requires SQL')
|
||||
|
|
|
@ -51,6 +51,9 @@ from wcs.admin.settings import UserFieldsFormDef
|
|||
from wcs.categories import Category
|
||||
from wcs.formdef import FormDef
|
||||
from wcs.roles import logged_users_role
|
||||
from wcs.workflows import EditableWorkflowStatusItem
|
||||
|
||||
from .submission import FormFillPage
|
||||
|
||||
|
||||
class SendCodeFormdefDirectory(Directory):
|
||||
|
@ -1547,6 +1550,8 @@ class FormPage(Directory):
|
|||
|
||||
|
||||
class FormBackOfficeStatusPage(FormStatusPage):
|
||||
_q_exports = ['', 'download', 'json', 'wfedit']
|
||||
|
||||
def html_top(self, title = None):
|
||||
return html_top('management', title)
|
||||
|
||||
|
@ -1669,6 +1674,20 @@ class FormBackOfficeStatusPage(FormStatusPage):
|
|||
|
||||
return r.getvalue()
|
||||
|
||||
def wfedit(self):
|
||||
wf_status = self.filled.get_status()
|
||||
for item in wf_status.items:
|
||||
if not isinstance(item, EditableWorkflowStatusItem):
|
||||
continue
|
||||
if item.check_auth(self.filled, get_request().user):
|
||||
f = FormFillPage(self.formdef.url_name)
|
||||
f.edit_mode = True
|
||||
get_response().breadcrumb = get_response().breadcrumb[:-1]
|
||||
get_response().breadcrumb.append( ('wfedit', _('Edit')) )
|
||||
return f._q_index(editing=self.filled)
|
||||
|
||||
raise errors.AccessForbiddenError()
|
||||
|
||||
|
||||
class FakeField(object):
|
||||
def __init__(self, id, type_, label):
|
||||
|
|
|
@ -25,14 +25,16 @@ from wcs.formdef import FormDef
|
|||
from wcs.categories import Category
|
||||
from wcs.forms.root import FormPage as PublicFormFillPage
|
||||
|
||||
from .management import FormBackOfficeStatusPage
|
||||
|
||||
|
||||
class FormFillPage(PublicFormFillPage):
|
||||
edit_mode = False
|
||||
|
||||
def html_top(self, *args, **kwargs):
|
||||
return html_top('submission', *args, **kwargs)
|
||||
|
||||
def check_role(self):
|
||||
if self.edit_mode:
|
||||
return True
|
||||
if not self.formdef.backoffice_submission_roles:
|
||||
raise errors.AccessUnauthorizedError()
|
||||
for role in get_request().user.roles or []:
|
||||
|
@ -57,6 +59,7 @@ class FormFillPage(PublicFormFillPage):
|
|||
r += htmltext('<p>-</p>')
|
||||
|
||||
if formdata and formdata.submission_context:
|
||||
from .management import FormBackOfficeStatusPage
|
||||
r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar()
|
||||
|
||||
return r.getvalue()
|
||||
|
|
|
@ -351,7 +351,7 @@ class FormPage(Directory):
|
|||
magictoken = get_request().form.get('magictoken')
|
||||
if magictoken:
|
||||
form_data = session.get_by_magictoken(magictoken, {})
|
||||
if self.formdef.enable_tracking_codes:
|
||||
if self.formdef.enable_tracking_codes and not editing:
|
||||
form.attrs['data-has-draft'] = 'yes'
|
||||
else:
|
||||
form_data = {}
|
||||
|
|
|
@ -1656,7 +1656,7 @@ class EditableWorkflowStatusItem(WorkflowStatusItem):
|
|||
|
||||
def submit_form(self, form, formdata, user, evo):
|
||||
if form.get_submit() == 'button%s' % self.id:
|
||||
return formdata.get_url() + 'wfedit'
|
||||
return formdata.get_url(backoffice=get_request().is_in_backoffice()) + 'wfedit'
|
||||
|
||||
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
|
||||
if 'by' in parameters:
|
||||
|
|
Loading…
Reference in New Issue