From fae222c8e9aee4a2837bcde7b5c02bc944bcc0d3 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_admin_pages.py | 6 +- tests/test_backoffice_pages.py | 103 ++++++++++++++++++++++++ wcs/admin/forms.py | 56 ++++++++----- wcs/backoffice/root.py | 7 +- wcs/backoffice/submission.py | 155 ++++++++++++++++++++++++++++++++++++ wcs/formdef.py | 1 + wcs/forms/root.py | 26 ++++-- wcs/qommon/static/css/dc2/admin.css | 3 + 8 files changed, 327 insertions(+), 30 deletions(-) create mode 100644 wcs/backoffice/submission.py diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index 4047af2..6781b82 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -553,11 +553,11 @@ def test_form_roles(): app = login(get_app(pub)) resp = app.get('/backoffice/forms/1/') - resp = resp.click('change', href='roles') + resp = resp.click('change', href='roles', index=0) resp = resp.forms[0].submit('cancel') resp = app.get('/backoffice/forms/1/') - resp = resp.click('change', href='roles') + resp = resp.click('change', href='roles', index=0) resp.forms[0]['roles$element0'].value = role.name resp = resp.forms[0].submit('submit') assert FormDef.get(1).roles == [role.id] @@ -921,7 +921,7 @@ def test_form_legacy_int_id(): assert resp.forms[0]['workflow_id'].value resp = app.get('/backoffice/forms/1/') - resp = resp.click('change', href='roles') + resp = resp.click('change', href='roles', index=0) assert resp.forms[0]['roles$element0'].value == 'Logged Users' assert resp.forms[0]['roles$element1'].value == 'ZAB' diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index e27421d..170db4d 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -38,6 +38,7 @@ def create_user(pub, is_admin=False): if pub.user_class.select(lambda x: x.name == 'admin'): user1 = pub.user_class.select(lambda x: x.name == 'admin')[0] user1.is_admin = is_admin + user1.roles = [x.id for x in Role.select() if x.name == 'foobar'] user1.store() return user1 user1 = pub.user_class(name='admin') @@ -453,3 +454,105 @@ 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 + +def test_backoffice_submission_tracking_code(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.enable_tracking_codes = True + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + data_class = formdef.data_class() + data_class.wipe() + 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 + + # stop here, don't validate, let user finish it. + assert data_class.count() == 1 + formdata_no = data_class.select()[0].id + tracking_code = data_class.select()[0].tracking_code + + 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 == 'draft' + assert data_class.get(formdata_no).user is None + + resp = get_app(pub).get('/code/%s/load' % data_class.select()[0].tracking_code) + resp = resp.follow() + assert resp.location.startswith('http://example.net/form-title/?mt=') + resp = resp.follow() + assert 'Check values then click submit.' in resp.body + assert 'test submission' in resp.body diff --git a/wcs/admin/forms.py b/wcs/admin/forms.py index 40e76bf..47fa450 100644 --- a/wcs/admin/forms.py +++ b/wcs/admin/forms.py @@ -290,7 +290,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: @@ -415,24 +416,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'), @@ -498,6 +485,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('