From 41c4c7c9711d9784b5a5833c7415e8f866d2867f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 30 Apr 2015 20:17:37 +0200 Subject: [PATCH] backoffice: make it possible to submit forms from the backoffice (#7052) --- tests/test_backoffice_pages.py | 58 ++++++++++++++ wcs/admin/forms.py | 55 ++++++++----- wcs/backoffice/root.py | 7 +- wcs/backoffice/submission.py | 149 ++++++++++++++++++++++++++++++++++++ wcs/formdef.py | 1 + wcs/forms/root.py | 24 ++++-- wcs/qommon/static/css/dc2/admin.css | 3 + 7 files changed, 271 insertions(+), 26 deletions(-) create mode 100644 wcs/backoffice/submission.py diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index e27421d..16bd41e 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -453,3 +453,61 @@ def test_global_statisticspub(pub): resp.forms[0]['end'] = '2014-12-31' resp = resp.forms[0].submit() assert 'Total count: 20' in resp.body + +def test_backoffice_submission(pub): + user = create_user(pub) + create_environment(pub) + + app = login(get_app(pub)) + resp = app.get('/backoffice/') + assert 'Submission' in resp.body + + resp = resp.click('Submission', index=0) + formdef = FormDef.select()[0] + assert not formdef.url_name in resp.body + + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + resp = app.get('/backoffice/submission/') + assert formdef.url_name in resp.body + + resp = resp.click(formdef.name) + resp.form['f1'] = 'test submission' + resp.form['f2'] = 'baz' + resp.form['f3'] = 'C' + resp = resp.form.submit('submit') + assert 'Check values then click submit.' in resp.body + + # going back to first page, to check + resp = resp.form.submit('previous') + assert resp.form['f1'].value == 'test submission' + resp = resp.form.submit('submit') + + # final submit + resp = resp.form.submit('submit') + + formdata_no = resp.location.split('/')[-2] + data_class = formdef.data_class() + assert data_class.get(formdata_no).data['1'] == 'test submission' + assert data_class.get(formdata_no).data['2'] == 'baz' + assert data_class.get(formdata_no).status == 'wf-new' + assert data_class.get(formdata_no).user is None + + resp = resp.follow() # get to the formdata page + + formdata_count = data_class.count() + + # test submission when agent is not receiver + formdef.workflow_roles = {} + formdef.store() + resp = app.get('/backoffice/submission/') + resp = resp.click(formdef.name) + resp.form['f1'] = 'test submission' + resp.form['f2'] = 'baz' + resp.form['f3'] = 'C' + resp = resp.form.submit('submit') # to validation screen + resp = resp.form.submit('submit') # final submit + assert resp.location == 'http://example.net/backoffice/submission/' + resp = resp.follow() # should go back to submission screen + + assert data_class.count() == formdata_count + 1 diff --git a/wcs/admin/forms.py b/wcs/admin/forms.py index 0aab25c..40a3272 100644 --- a/wcs/admin/forms.py +++ b/wcs/admin/forms.py @@ -175,7 +175,8 @@ class FormDefPage(Directory): ('workflow-status-remapping', 'workflow_status_remapping'), 'roles', 'title', 'options', ('acl-read', 'acl_read'), 'overwrite', 'qrcode', 'information', - ('public-url', 'public_url')] + ('public-url', 'public_url'), + ('backoffice-submission-roles', 'backoffice_submission_roles'),] def __init__(self, component): try: @@ -299,24 +300,10 @@ class FormDefPage(Directory): r += htmltext('') r += htmltext('') - r += htmltext('
  • %s ') % _('User Roles:') - if self.formdef.roles: - roles = [] - for x in self.formdef.roles: - if x == logged_users_role().id: - roles.append(logged_users_role().name) - else: - try: - roles.append(htmltext('%s') % (x, Role.get(x).name)) - except KeyError: - # removed role ? - roles.append(htmltext('%s') % _('Unknown role (%s)') % role_id) - r += htmltext(', ').join(roles) - else: - r += '-' - r += ' ' - r += htmltext('(%s)') % _('change') - r += htmltext('
  • ') + r += self._display_roles(_('User Roles:'), 'roles', 'roles') + r += self._display_roles(_('Backoffice Submission Roles:'), + 'backoffice_submission_roles', + 'backoffice-submission-roles') r += htmltext('
  • %s ') % _('Read Access:') r += '%s' % {'none': _('None'), @@ -366,6 +353,29 @@ class FormDefPage(Directory): r += htmltext('') return r.getvalue() + def _display_roles(self, title, attribute, change_url): + r = TemplateIO(html=True) + r += htmltext('
  • %s ') % title + if getattr(self.formdef, attribute): + roles = [] + for x in getattr(self.formdef, attribute): + if x == logged_users_role().id: + roles.append(logged_users_role().name) + else: + try: + roles.append(htmltext('%s') % (x, Role.get(x).name)) + except KeyError: + # removed role ? + roles.append(htmltext('%s') % _('Unknown role (%s)') % role_id) + r += htmltext(', ').join(roles) + else: + r += '-' + r += ' ' + r += htmltext('(%s)') % ( + change_url, _('change')) + r += htmltext('
  • ') + return r.getvalue() + def get_sidebar(self): r = TemplateIO(html=True) r += htmltext('