Projet

Général

Profil

0001-backoffice-add-jsonp-endpoints-to-get-various-counte.patch

Frédéric Péters, 08 novembre 2015 14:29

Télécharger (11,6 ko)

Voir les différences:

Subject: [PATCH] backoffice: add jsonp endpoints to get various counters
 (#8915)

 tests/test_backoffice_pages.py | 72 ++++++++++++++++++++++++++++++++++++++++++
 wcs/backoffice/management.py   | 30 ++++++++++++------
 wcs/backoffice/root.py         | 13 +-------
 wcs/backoffice/submission.py   | 31 +++++++++++++++---
 wcs/qommon/misc.py             | 17 +++++++++-
 5 files changed, 135 insertions(+), 28 deletions(-)
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
-