0001-backoffice-add-jsonp-endpoints-to-get-various-counte.patch
tests/test_backoffice_pages.py | ||
---|---|---|
66 | 66 |
create_user(pub, is_admin=True) |
67 | 67 | |
68 | 68 |
def create_environment(pub, set_receiver=True): |
69 |
Workflow.wipe() |
|
69 | 70 |
Category.wipe() |
70 | 71 |
FormDef.wipe() |
71 | 72 |
formdef = FormDef() |
... | ... | |
1005 | 1006 |
assert '>cat1<' in resp.body |
1006 | 1007 |
assert '>Misc<' in resp.body |
1007 | 1008 |
assert resp.body.index('>Misc<') < resp.body.index('>cat1<') |
1009 | ||
1010 |
def test_count_open(pub): |
|
1011 |
if not pub.is_using_postgresql(): |
|
1012 |
pytest.skip('this requires SQL') |
|
1013 |
return |
|
1014 |
create_user(pub) |
|
1015 |
create_environment(pub) |
|
1016 |
resp = login(get_app(pub)).get('/backoffice/management/count') |
|
1017 |
assert resp.json['count'] == 37 |
|
1018 | ||
1019 |
formdef = FormDef.get_by_urlname('form-title') |
|
1020 |
formdef.workflow_roles = {'_receiver': 2} # role the user doesn't have |
|
1021 |
formdef.store() |
|
1022 |
formdef.data_class().rebuild_security() |
|
1023 |
resp = login(get_app(pub)).get('/backoffice/management/count') |
|
1024 |
assert resp.json['count'] == 20 |
|
1025 | ||
1026 |
formdef = FormDef.get_by_urlname('form-title') |
|
1027 |
formdef.workflow_roles = {'_receiver': 2, '_foobar': 1} |
|
1028 |
formdef.store() |
|
1029 |
formdef.data_class().rebuild_security() |
|
1030 |
resp = login(get_app(pub)).get('/backoffice/management/count') |
|
1031 |
assert resp.json['count'] == 20 |
|
1032 |
resp = login(get_app(pub)).get('/backoffice/management/count?waiting=yes') |
|
1033 |
assert resp.json['count'] == 20 |
|
1034 | ||
1035 |
formdef = FormDef.get_by_urlname('form-title') |
|
1036 |
workflow = Workflow.get_default_workflow() |
|
1037 |
workflow.roles['_foobar'] = 'Foobar' |
|
1038 |
workflow.id = '2' |
|
1039 |
workflow.store() |
|
1040 |
formdef.workflow_id = workflow.id |
|
1041 |
formdef.workflow_roles = {'_receiver': 2, '_foobar': '1'} |
|
1042 |
formdef.store() |
|
1043 |
formdef.data_class().rebuild_security() |
|
1044 |
resp = login(get_app(pub)).get('/backoffice/management/count?waiting=no') |
|
1045 |
assert resp.json['count'] == 37 |
|
1046 | ||
1047 |
def test_count_backoffice_drafts(pub): |
|
1048 |
user = create_user(pub) |
|
1049 |
create_environment(pub) |
|
1050 | ||
1051 |
formdef = FormDef.get_by_urlname('form-title') |
|
1052 |
formdef.backoffice_submission_roles = user.roles[:] |
|
1053 |
formdef.store() |
|
1054 | ||
1055 |
resp = login(get_app(pub)).get('/backoffice/submission/count') |
|
1056 |
assert resp.json['count'] == 0 |
|
1057 | ||
1058 |
formdata1, formdata2, formdata3 = formdef.data_class().select()[:3] |
|
1059 |
for formdata in (formdata1, formdata2, formdata3): |
|
1060 |
formdata.status = 'draft' |
|
1061 |
formdata.store() |
|
1062 | ||
1063 |
resp = login(get_app(pub)).get('/backoffice/submission/count') |
|
1064 |
assert resp.json['count'] == 0 |
|
1065 | ||
1066 |
for formdata in (formdata1, formdata2, formdata3): |
|
1067 |
formdata.backoffice_submission = True |
|
1068 |
formdata.store() |
|
1069 | ||
1070 |
resp = login(get_app(pub)).get('/backoffice/submission/count') |
|
1071 |
assert resp.json['count'] == 3 |
|
1072 | ||
1073 |
formdata1.data = {} |
|
1074 |
formdata1.store() |
|
1075 | ||
1076 |
resp = login(get_app(pub)).get('/backoffice/submission/count?mode=empty') |
|
1077 |
assert resp.json['count'] == 1 |
|
1078 |
resp = login(get_app(pub)).get('/backoffice/submission/count?mode=existing') |
|
1079 |
assert resp.json['count'] == 2 |
wcs/backoffice/management.py | ||
---|---|---|
47 | 47 | |
48 | 48 | |
49 | 49 |
class ManagementDirectory(Directory): |
50 |
_q_exports = ['', 'listing', 'statistics', 'code'] |
|
50 |
_q_exports = ['', 'listing', 'statistics', 'code', 'count']
|
|
51 | 51 | |
52 | 52 |
def is_accessible(self, user): |
53 | 53 |
return user.can_go_in_backoffice() |
... | ... | |
309 | 309 |
r += htmltext('</ul>') |
310 | 310 |
return r.getvalue() |
311 | 311 | |
312 |
def get_global_listing_criterias(self): |
|
313 |
parsed_values = {} |
|
314 |
user_roles = [logged_users_role().id] + (get_request().user.roles or []) |
|
315 |
criterias = get_global_criteria(get_request(), parsed_values) |
|
316 |
criterias.append(Equal('is_at_endpoint', False)) |
|
317 |
if not get_request().form or get_request().form.get('waiting') == 'yes': |
|
318 |
criterias.append(Intersects('actions_roles_array', user_roles)) |
|
319 |
else: |
|
320 |
criterias.append(Intersects('concerned_roles_array', user_roles)) |
|
321 |
return criterias |
|
322 | ||
312 | 323 |
def listing(self): |
313 | 324 |
if not get_publisher().is_using_postgresql(): |
314 | 325 |
raise errors.TraversalError() |
... | ... | |
318 | 329 |
from wcs import sql |
319 | 330 |
html_top('management', _('Management')) |
320 | 331 | |
321 |
user_roles = [logged_users_role().id] + (get_request().user.roles or []) |
|
322 | ||
323 | 332 |
limit = int(get_request().form.get('limit', |
324 | 333 |
get_publisher().get_site_option('default-page-size') or 20)) |
325 | 334 |
offset = int(get_request().form.get('offset', 0)) |
326 | 335 | |
327 |
parsed_values = {} |
|
328 |
criterias = get_global_criteria(get_request(), parsed_values) |
|
329 |
criterias.append(Equal('is_at_endpoint', False)) |
|
330 |
if not get_request().form or get_request().form.get('waiting') == 'yes': |
|
331 |
criterias.append(Intersects('actions_roles_array', user_roles)) |
|
332 |
else: |
|
333 |
criterias.append(Intersects('concerned_roles_array', user_roles)) |
|
336 |
criterias = self.get_global_listing_criterias() |
|
334 | 337 |
total_count = sql.AnyFormData.count(criterias) |
335 | 338 |
formdatas = sql.AnyFormData.select(criterias, |
336 | 339 |
order_by='receipt_time', limit=limit, offset=offset) |
... | ... | |
395 | 398 |
r = rt |
396 | 399 |
return rt.getvalue() |
397 | 400 | |
401 |
def count(self): |
|
402 |
if not get_publisher().is_using_postgresql(): |
|
403 |
raise errors.TraversalError() |
|
404 |
from wcs import sql |
|
405 |
criterias = self.get_global_listing_criterias() |
|
406 |
count = sql.AnyFormData.count(criterias) |
|
407 |
return misc.json_response({'count': count}) |
|
398 | 408 | |
399 | 409 |
def _q_lookup(self, component): |
400 | 410 |
return FormPage(component) |
wcs/backoffice/root.py | ||
---|---|---|
212 | 212 |
return r.getvalue() |
213 | 213 | |
214 | 214 |
def menu_json(self): |
215 |
get_response().set_content_type('application/json') |
|
216 |
if get_request().get_environ('HTTP_ORIGIN'): |
|
217 |
get_response().set_header('Access-Control-Allow-Origin', |
|
218 |
get_request().get_environ('HTTP_ORIGIN')) |
|
219 |
get_response().set_header('Access-Control-Allow-Credentials', 'true') |
|
220 |
get_response().set_header('Access-Control-Allow-Headers', 'x-requested-with') |
|
221 | 215 |
menu_items = [] |
222 | 216 |
backoffice_url = get_publisher().get_backoffice_url() |
223 |
json_str = json.dumps(self.get_menu_items()) |
|
224 |
for variable in ('jsonpCallback', 'callback'): |
|
225 |
if variable in get_request().form: |
|
226 |
json_str = '%s(%s);' % (get_request().form[variable], json_str) |
|
227 |
break |
|
228 |
return json_str |
|
217 |
return misc.json_response(self.get_menu_items()) |
|
229 | 218 | |
230 | 219 |
def pending(self): |
231 | 220 |
# kept as a redirection for compatibility with possible bookmarks |
wcs/backoffice/submission.py | ||
---|---|---|
99 | 99 | |
100 | 100 | |
101 | 101 |
class SubmissionDirectory(Directory): |
102 |
_q_exports = [''] |
|
102 |
_q_exports = ['', 'count']
|
|
103 | 103 | |
104 | 104 |
def is_accessible(self, user): |
105 | 105 |
if not user.can_go_in_backoffice(): |
... | ... | |
111 | 111 |
return True |
112 | 112 |
return False |
113 | 113 | |
114 |
def _q_index(self): |
|
115 |
get_response().breadcrumb.append(('submission/', _('Submission'))) |
|
116 |
html_top('submission', _('Submission')) |
|
114 |
def get_submittable_formdefs(self): |
|
117 | 115 |
user = get_request().user |
118 | 116 | |
119 | 117 |
list_forms = [] |
... | ... | |
129 | 127 |
continue |
130 | 128 |
list_forms.append(formdef) |
131 | 129 | |
132 |
r = TemplateIO(html=True) |
|
130 |
return list_forms |
|
131 | ||
132 |
def _q_index(self): |
|
133 |
get_response().breadcrumb.append(('submission/', _('Submission'))) |
|
134 |
html_top('submission', _('Submission')) |
|
133 | 135 | |
136 |
list_forms = self.get_submittable_formdefs() |
|
134 | 137 |
cats = Category.select() |
135 | 138 |
Category.sort_by_position(cats) |
136 | 139 |
for cat in cats: |
... | ... | |
139 | 142 |
misc_cat.formdefs = [x for x in list_forms if not x.category] |
140 | 143 |
cats.append(misc_cat) |
141 | 144 | |
145 |
r = TemplateIO(html=True) |
|
142 | 146 |
for mode in ['create', 'existing', 'empty']: |
143 | 147 |
list_content = TemplateIO() |
144 | 148 |
for cat in cats: |
... | ... | |
216 | 220 | |
217 | 221 |
return r.getvalue() |
218 | 222 | |
223 |
def count(self): |
|
224 |
formdefs = self.get_submittable_formdefs() |
|
225 |
count = 0 |
|
226 |
mode = get_request().form.get('mode') |
|
227 |
for formdef in formdefs: |
|
228 |
if not hasattr(formdef, '_formdatas'): |
|
229 |
data_class = formdef.data_class() |
|
230 |
formdata_ids = data_class.get_ids_with_indexed_value('status', 'draft') |
|
231 |
formdatas = [x for x in data_class.get_ids(formdata_ids) |
|
232 |
if x.backoffice_submission is True] |
|
233 |
if mode == 'empty': |
|
234 |
formdatas = [x for x in formdatas if x.has_empty_data()] |
|
235 |
elif mode == 'existing': |
|
236 |
formdatas = [x for x in formdatas if not x.has_empty_data()] |
|
237 |
count += len(formdatas) |
|
238 |
return misc.json_response({'count': count}) |
|
239 | ||
219 | 240 |
def _q_lookup(self, component): |
220 | 241 |
get_response().breadcrumb.append(('submission/', _('Submission'))) |
221 | 242 |
return FormFillPage(component) |
wcs/qommon/misc.py | ||
---|---|---|
27 | 27 |
import tempfile |
28 | 28 |
import unicodedata |
29 | 29 | |
30 |
from quixote import get_publisher, get_session, get_response |
|
30 |
from quixote import get_publisher, get_session, get_response, get_request
|
|
31 | 31 |
from quixote.html import htmltext |
32 | 32 | |
33 | 33 |
from qommon import get_cfg, get_logger, ezt |
... | ... | |
440 | 440 |
os.unlink(tmpfile.name + '.pdf') |
441 | 441 |
os.unlink(tmpfile.name) |
442 | 442 |
return pdf_content |
443 | ||
444 |
def json_response(data): |
|
445 |
get_response().set_content_type('application/json') |
|
446 |
if get_request().get_environ('HTTP_ORIGIN'): |
|
447 |
get_response().set_header('Access-Control-Allow-Origin', |
|
448 |
get_request().get_environ('HTTP_ORIGIN')) |
|
449 |
get_response().set_header('Access-Control-Allow-Credentials', 'true') |
|
450 |
get_response().set_header('Access-Control-Allow-Headers', 'x-requested-with') |
|
451 |
json_str = json.dumps(data) |
|
452 |
for variable in ('jsonpCallback', 'callback'): |
|
453 |
if variable in get_request().form: |
|
454 |
get_response().set_content_type('application/javascript') |
|
455 |
json_str = '%s(%s);' % (get_request().form[variable], json_str) |
|
456 |
break |
|
457 |
return json_str |
|
443 |
- |