From d0d6bf2f490d787a0a1248884bd97d0eff392a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 28 Nov 2017 10:28:19 +0100 Subject: [PATCH] api: add possibility to get drafts from /api/user/forms endpoint (#20230) --- tests/test_api.py | 24 ++++++++++++++++++++++++ wcs/api.py | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 14a36c7d..d35cadd3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1096,6 +1096,8 @@ def test_user_forms(pub, local_user): fields.StringField(id='0', label='foobar', varname='foobar'), fields.StringField(id='1', label='foobar2'),] formdef.keywords = 'hello, world' + formdef.disabled = False + formdef.enable_tracking_codes = True formdef.store() formdef.data_class().wipe() @@ -1130,6 +1132,28 @@ def test_user_forms(pub, local_user): resp = get_app(pub).get(sign_uri('/api/user/forms', user=local_user)) assert len(resp.json) == 1 + formdata = formdef.data_class()() + formdata.user_id = local_user.id + formdata.status = 'draft' + formdata.receipt_time = datetime.datetime(2015, 1, 1).timetuple() + formdata.store() + + resp = get_app(pub).get(sign_uri('/api/user/forms', user=local_user)) + assert len(resp.json) == 1 + + resp = get_app(pub).get(sign_uri('/api/user/forms?include-drafts=true', user=local_user)) + assert len(resp.json) == 1 + + formdef.disabled = False + formdef.store() + + resp = get_app(pub).get(sign_uri('/api/user/forms?include-drafts=true', user=local_user)) + assert len(resp.json) == 2 + + draft_formdata = [x for x in resp.json if x['status'] == 'Draft'][0] + assert draft_formdata.get('url')[-1] != '/' + assert draft_formdata['status_css_class'] == 'draft' + def test_user_drafts(pub, local_user): FormDef.wipe() formdef = FormDef() diff --git a/wcs/api.py b/wcs/api.py index ac06fafb..49697609 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -24,6 +24,7 @@ from quixote.directory import Directory from qommon import _ from qommon import misc +from qommon.evalutils import make_datetime from qommon.errors import (AccessForbiddenError, QueryError, TraversalError, UnknownNameIdAccessForbiddenError) from qommon.form import ValidationError, ComputedExpressionWidget @@ -96,6 +97,28 @@ def get_formdata_dict(formdata, user, consider_status_visibility=True): return d +def get_draft_formdata_dict(formdata, user): + title = _('%(name)s (%(status)s)') % { + 'name': formdata.formdef.name, + 'status': _('Draft'), + } + d = {'title': title, + 'name': formdata.formdef.name, + 'url': formdata.get_url().rstrip('/'), + 'datetime': misc.strftime('%Y-%m-%d %H:%M:%S', formdata.receipt_time), + 'status': _('Draft'), + 'status_css_class': 'draft', + 'keywords': formdata.formdef.keywords_list, + 'draft': True, + } + if formdata.last_update_time: + d['last_update_time'] = misc.strftime('%Y-%m-%d %H:%M:%S', formdata.last_update_time) + d.update(formdata.get_substitution_variables(minimal=True)) + del d['form_number'] + del d['form_number_raw'] + return d + + class ApiFormdataPage(FormStatusPage): _q_exports_orig = ['', 'download'] @@ -556,10 +579,17 @@ class ApiUserDirectory(Directory): if not user: raise AccessForbiddenError('no user specified') forms = [] + include_drafts = get_request().form.get('include-drafts') == 'true' for form in self.get_user_forms(user): if form.is_draft(): - continue - formdata_dict = get_formdata_dict(form, user) + if not include_drafts: + continue + if form.formdef.is_disabled() or not form.formdef.enable_tracking_codes: + # the form or its draft support has been disabled + continue + formdata_dict = get_draft_formdata_dict(form, user) + else: + formdata_dict = get_formdata_dict(form, user) if not formdata_dict: # skip hidden forms continue -- 2.15.1