api: add possibility to get drafts from /api/user/forms endpoint (#20230)
This commit is contained in:
parent
47ca25760f
commit
06ef78bb9e
|
@ -128,15 +128,10 @@ l'adresse <code>/user</code>.
|
|||
|
||||
<p>
|
||||
Il est possible de recevoir un ensemble plus complet de données en passant un
|
||||
paramètre <code>full=on</code> à l'adresse.
|
||||
paramètre <code>full=on</code> à l'adresse. Pour inclure également les
|
||||
brouillons, un paramètre <code>include-drafts=true</code> peut être passé.
|
||||
</p>
|
||||
|
||||
<note>
|
||||
<p>Note de compatibilité : cette information est également disponible à
|
||||
l'adresse <code>/myspace/forms</code>.
|
||||
</p>
|
||||
</note>
|
||||
|
||||
</section>
|
||||
<section>
|
||||
<title>Brouillons</title>
|
||||
|
@ -147,7 +142,7 @@ l'adresse <code>/myspace/forms</code>.
|
|||
</p>
|
||||
|
||||
<screen>
|
||||
<output style="prompt">$ </output><input>curl https://www.example.net/myspace/drafts</input>
|
||||
<output style="prompt">$ </output><input>curl https://www.example.net/api/user/drafts</input>
|
||||
<output>[
|
||||
{
|
||||
"datetime": "2014-07-21 10:15:21",
|
||||
|
|
|
@ -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,27 @@ 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] != '/'
|
||||
|
||||
def test_user_drafts(pub, local_user):
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
|
@ -1143,6 +1166,8 @@ def test_user_drafts(pub, local_user):
|
|||
formdef.enable_tracking_codes = True
|
||||
formdef.store()
|
||||
|
||||
formdef.data_class().wipe()
|
||||
|
||||
resp = get_app(pub).get(sign_uri('/api/user/drafts', user=local_user))
|
||||
assert len(resp.json) == 0
|
||||
|
||||
|
|
66
wcs/api.py
66
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
|
||||
|
@ -67,7 +68,7 @@ def posted_json_data_to_formdata_data(formdef, data):
|
|||
|
||||
|
||||
def get_formdata_dict(formdata, user, consider_status_visibility=True):
|
||||
if consider_status_visibility:
|
||||
if consider_status_visibility and not formdata.is_draft():
|
||||
status = formdata.get_visible_status(user=user)
|
||||
if not status:
|
||||
# skip hidden forms
|
||||
|
@ -75,21 +76,29 @@ def get_formdata_dict(formdata, user, consider_status_visibility=True):
|
|||
else:
|
||||
status = formdata.get_status()
|
||||
|
||||
title = _('%(name)s #%(id)s (%(status)s)') % {
|
||||
'name': formdata.formdef.name,
|
||||
'id': formdata.get_display_id(),
|
||||
'status': status.name,
|
||||
}
|
||||
d = {'title': title,
|
||||
d = {
|
||||
'name': formdata.formdef.name,
|
||||
'url': formdata.get_url(),
|
||||
'datetime': misc.strftime('%Y-%m-%d %H:%M:%S', formdata.receipt_time),
|
||||
'status': status.name,
|
||||
'status_css_class': status.extra_css_class,
|
||||
'status': status.name if not formdata.is_draft() else _('Draft'),
|
||||
'status_css_class': status.extra_css_class if status else None,
|
||||
'keywords': formdata.formdef.keywords_list,
|
||||
'draft': formdata.is_draft(),
|
||||
}
|
||||
if formdata.last_update_time:
|
||||
d['last_update_time'] = misc.strftime('%Y-%m-%d %H:%M:%S', formdata.last_update_time)
|
||||
|
||||
if formdata.is_draft():
|
||||
d['url'] = d['url'].rstrip('/')
|
||||
d['form_number_raw'] = d['form_number'] = None
|
||||
d['title'] = _('%(name)s (draft)') % {'name': formdata.formdef.name}
|
||||
else:
|
||||
d['title'] = _('%(name)s #%(id)s (%(status)s)') % {
|
||||
'name': formdata.formdef.name,
|
||||
'id': formdata.get_display_id(),
|
||||
'status': status.name,
|
||||
}
|
||||
|
||||
d.update(formdata.get_substitution_variables(minimal=True))
|
||||
if get_request().form.get('full') == 'on':
|
||||
d.update(formdata.get_json_export_dict(include_files=False))
|
||||
|
@ -520,44 +529,23 @@ class ApiUserDirectory(Directory):
|
|||
return user_forms
|
||||
|
||||
def drafts(self):
|
||||
get_response().set_content_type('application/json')
|
||||
user = self.user or get_user_from_api_query_string() or get_request().user
|
||||
if not user:
|
||||
raise AccessForbiddenError('no user specified')
|
||||
drafts = []
|
||||
for form in self.get_user_forms(user):
|
||||
if not form.is_draft():
|
||||
continue
|
||||
if form.formdef.is_disabled() or not form.formdef.enable_tracking_codes:
|
||||
continue
|
||||
title = _('%(name)s, draft saved on %(datetime)s') % {
|
||||
'name': form.formdef.name,
|
||||
'datetime': misc.localstrftime(form.receipt_time)
|
||||
}
|
||||
# !!! no trailing slash in the special draft case
|
||||
url = form.get_url().rstrip('/')
|
||||
d = {'title': title,
|
||||
'name': form.formdef.name,
|
||||
'url': url,
|
||||
'datetime': misc.strftime('%Y-%m-%d %H:%M:%S', form.receipt_time),
|
||||
'keywords': form.formdef.keywords_list,
|
||||
}
|
||||
if get_request().form.get('full') == 'on':
|
||||
d.update(form.get_json_export_dict(include_files=False))
|
||||
drafts.append(d)
|
||||
return self.forms(include_drafts=True, include_non_drafts=False)
|
||||
|
||||
return json.dumps(drafts,
|
||||
cls=misc.JSONEncoder,
|
||||
encoding=get_publisher().site_charset)
|
||||
|
||||
def forms(self):
|
||||
def forms(self, include_drafts=False, include_non_drafts=True):
|
||||
get_response().set_content_type('application/json')
|
||||
user = self.user or get_user_from_api_query_string() or get_request().user
|
||||
if not user:
|
||||
raise AccessForbiddenError('no user specified')
|
||||
forms = []
|
||||
include_drafts = include_drafts or get_request().form.get('include-drafts') == 'true'
|
||||
for form in self.get_user_forms(user):
|
||||
if form.is_draft():
|
||||
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
|
||||
elif not include_non_drafts:
|
||||
continue
|
||||
formdata_dict = get_formdata_dict(form, user)
|
||||
if not formdata_dict:
|
||||
|
|
Loading…
Reference in New Issue