From 6f435f0522e4d1c7c1b825253f51cab82266b625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 7 Jan 2016 11:30:30 +0100 Subject: [PATCH] backoffice: make it possible to remove backoffice submission drafts (#9536) --- tests/test_backoffice_pages.py | 56 ++++++++++++++++++++++++++++++++++++++++++ wcs/backoffice/submission.py | 54 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index cb085ee..ce61dd3 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -880,6 +880,62 @@ def test_backoffice_submission_drafts(pub): # check it kept the same id assert resp.location == 'http://example.net/backoffice/management/form-title/%s/' % formdata_no +def test_backoffice_submission_remove_drafts(pub): + user = create_user(pub) + create_environment(pub) + + app = login(get_app(pub)) + + formdef = FormDef.get_by_urlname('form-title') + formdef.enable_tracking_codes = True + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + data_class = formdef.data_class() + data_class.wipe() + pub.tracking_code_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 + + assert data_class.count() == 1 + formdata = data_class.select()[0] + formdata_no = formdata.id + tracking_code = data_class.select()[0].tracking_code + + # stop here, go back to the index + resp = app.get('/backoffice/submission/') + resp = resp.click('#%s' % formdata_no) + resp = resp.follow() + + # and try to delete the form (but cancel) + resp = resp.click('Delete') + resp = resp.form.submit('cancel') + assert resp.location == 'http://example.net/backoffice/submission/' + assert data_class.count() == 1 + assert pub.tracking_code_class().count() == 1 + + # and this time for real + resp = app.get('/backoffice/submission/') + resp = resp.click('#%s' % formdata_no) + resp = resp.follow() + resp = resp.click('Delete') + resp = resp.form.submit('delete') + assert resp.location == 'http://example.net/backoffice/submission/' + assert data_class.count() == 0 + assert pub.tracking_code_class().count() == 0 + + # check it's not possible to delete an actual formdata + formdata = data_class() + formdata.store() + resp = app.get('/backoffice/submission/form-title/remove/%s' % formdata.id, + status=403) + def test_backoffice_submission_sections(pub): user = create_user(pub) create_environment(pub) diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 5e36135..f312bf8 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -19,6 +19,7 @@ from quixote.directory import Directory from quixote.html import TemplateIO, htmltext from qommon.backoffice.menu import html_top +from qommon.form import * from qommon import errors, misc from wcs.formdef import FormDef @@ -26,7 +27,55 @@ from wcs.categories import Category from wcs.forms.root import FormPage as PublicFormFillPage +class RemoveDraftDirectory(Directory): + def __init__(self, parent_directory): + self.parent_directory = parent_directory + self.formdef = parent_directory.formdef + + def _q_lookup(self, component): + try: + formdata = self.formdef.data_class().get(component) + except KeyError: + raise errors.TraversalError() + if not formdata.is_draft(): + raise errors.AccessForbiddenError() + if not formdata.backoffice_submission: + raise errors.AccessForbiddenError() + + self.parent_directory.check_role() + if self.parent_directory.edit_mode: + raise errors.AccessForbiddenError() + + self.parent_directory.html_top(title=_('Remove')) + + form = Form(enctype='multipart/form-data') + form.widgets.append(HtmlWidget('

%s

' % _( + 'You are about to irrevocably delete this form.'))) + form.add_submit('delete', _('Delete')) + form.add_submit('cancel', _('Cancel')) + if form.get_widget('cancel').parse(): + return redirect('../..') + if not form.is_submitted() or form.has_errors(): + r = TemplateIO(html=True) + r += htmltext('

%s

') % (_('Deleting Form')) + r += form.render() + return r.getvalue() + + if formdata.tracking_code: + tracking_code = get_publisher().tracking_code_class.get(formdata.tracking_code) + tracking_code.remove_self() + formdata.remove_self() + return redirect('../..') + + class FormFillPage(PublicFormFillPage): + _q_exports = ['', 'tempfile', 'autosave', 'code', + ('remove', 'remove_draft')] + + def __init__(self, *args, **kwargs): + super(FormFillPage, self).__init__(*args, **kwargs) + self.remove_draft = RemoveDraftDirectory(self) + def html_top(self, *args, **kwargs): return html_top('submission', *args, **kwargs) @@ -60,6 +109,11 @@ class FormFillPage(PublicFormFillPage): from .management import FormBackOfficeStatusPage r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar() + if formdata and not self.edit_mode: + r += htmltext('

') + r += htmltext('%s') % (formdata.id, _('Delete')) + r += htmltext('

') + return r.getvalue() def form_side(self, step_no, page_no=0, log_detail=None, data=None): -- 2.7.0.rc3