backoffice: make 'edit' workflow stay in backoffice (#9093)

This commit is contained in:
Frédéric Péters 2015-11-26 22:14:19 +01:00
parent 9d34babb75
commit d2ba36516b
5 changed files with 65 additions and 5 deletions

View File

@ -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')

View File

@ -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):

View File

@ -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()

View File

@ -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 = {}

View File

@ -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: