Projet

Général

Profil

0001-backoffice-display-current-user-forms-in-the-sidebar.patch

Frédéric Péters, 05 novembre 2015 15:24

Télécharger (10,9 ko)

Voir les différences:

Subject: [PATCH] backoffice: display current user forms in the sidebar (#8879)

 tests/test_backoffice_pages.py      |  55 ++++++++++++++++++
 wcs/backoffice/management.py        | 112 +++++++++++++++++++++++++++---------
 wcs/categories.py                   |   6 ++
 wcs/qommon/static/css/dc2/admin.css |   9 +++
 4 files changed, 155 insertions(+), 27 deletions(-)
tests/test_backoffice_pages.py
15 15
from wcs.workflows import (Workflow, CommentableWorkflowStatusItem,
16 16
        ChoiceWorkflowStatusItem)
17 17
from wcs.wf.wscall import WebserviceCallStatusItem
18
from wcs.categories import Category
18 19
from wcs.formdef import FormDef
19 20
from wcs import fields
20 21

  
......
65 66
    create_user(pub, is_admin=True)
66 67

  
67 68
def create_environment(pub, set_receiver=True):
69
    Category.wipe()
68 70
    FormDef.wipe()
69 71
    formdef = FormDef()
70 72
    formdef.name = 'form title'
......
877 879
        assert resp.location == 'http://example.net/backoffice/management/listing'
878 880
        resp = resp.follow()
879 881
        assert 'No such code' in resp.body
882

  
883
def test_backoffice_sidebar_user_context(pub):
884
    if not pub.is_using_postgresql():
885
        pytest.skip('this requires SQL')
886
        return
887

  
888
    user = create_user(pub)
889
    create_environment(pub)
890
    form_class = FormDef.get_by_urlname('form-title').data_class()
891
    number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
892
    app = login(get_app(pub))
893
    resp = app.get('/backoffice/management/form-title/')
894
    assert re.findall('<tbody.*\/tbody>', resp.body, re.DOTALL)[0].count('<tr') == 17
895

  
896
    # click on a formdata
897
    resp = resp.click(href='%s/' % number31.id)
898
    assert (' with the number %s.' % number31.id) in resp.body
899

  
900
    # check there's nothing in the sidebar
901
    assert not 'Other Pending Forms' in resp.body
902

  
903
    number31.user_id = user.id
904
    number31.store()
905
    resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
906
    assert not 'Other Pending Forms' in resp.body
907

  
908
    # another item with status = new
909
    number34 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 33'][0]
910
    number34.user_id = user.id
911
    number34.store()
912

  
913
    resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
914
    assert 'Other Pending Forms' in resp.body
915
    assert number34.get_url(backoffice=True) in resp.body
916

  
917
    cat1 = Category(name='cat1')
918
    cat1.store()
919

  
920
    formdef = FormDef.get_by_urlname('other-form')
921
    formdef.category_id = cat1.id
922
    formdef.store()
923
    other_formdata = formdef.data_class().select()[0]
924
    other_formdata.user_id = user.id
925
    other_formdata.store()
926

  
927
    resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
928
    assert 'Other Pending Forms' in resp.body
929
    assert number34.get_url(backoffice=True) in resp.body
930
    assert other_formdata.get_url(backoffice=True) in resp.body
931
    # categories are displayed, and current formdata category is on top
932
    assert '>cat1<' in resp.body
933
    assert '>Misc<' in resp.body
934
    assert resp.body.index('>Misc<') < resp.body.index('>cat1<')
wcs/backoffice/management.py
1251 1251

  
1252 1252
    def get_extra_context_bar(self):
1253 1253
        formdata = self.filled
1254
        if not formdata.submission_context:
1255
            return ''
1256 1254

  
1257 1255
        r = TemplateIO(html=True)
1258
        extra_context = formdata.submission_context or {}
1259
        r += htmltext('<div class="extra-context">')
1260
        if extra_context.get('channel'):
1261
            channel_labels = {
1262
                'mail': _('Mail'),
1263
            }
1264
            r += htmltext('<h3>%s</h3>') % '%s: %s' % (
1265
                    _('Channel'), channel_labels.get(extra_context.get('channel'), '?'))
1266
        if extra_context.get('thumbnail_url'):
1267
            r += htmltext('<p class="thumbnail"><img src="%s" alt=""/></p>'
1268
                    ) % extra_context.get('thumbnail_url')
1269
        if extra_context.get('mail_url'):
1270
            r += htmltext('<p><a href="%s">%s</a></p>') % (
1271
                    extra_context.get('mail_url'), _('Open'))
1272
        if extra_context.get('user_id'):
1273
            r += htmltext('<h3>%s</h3>') % _('Associated User')
1274
            r += htmltext('<p>%s</p>') % get_publisher().user_class.get(
1275
                    extra_context.get('user_id')).display_name
1276
        if extra_context.get('comments'):
1277
            r += htmltext('<h3>%s</h3>') % _('Comments')
1278
            r += htmltext('<p>%s</p>') % extra_context.get('comments')
1279
        if extra_context.get('summary_url'):
1280
            r += htmltext('<div data-content-url="%s"></div>' %
1281
                    (extra_context.get('summary_url')))
1282
        r += htmltext('</div>')
1256
        if formdata.submission_context:
1257
            extra_context = formdata.submission_context or {}
1258
            r += htmltext('<div class="extra-context">')
1259
            if extra_context.get('channel'):
1260
                channel_labels = {
1261
                    'mail': _('Mail'),
1262
                }
1263
                r += htmltext('<h3>%s</h3>') % '%s: %s' % (
1264
                        _('Channel'), channel_labels.get(extra_context.get('channel'), '?'))
1265
            if extra_context.get('thumbnail_url'):
1266
                r += htmltext('<p class="thumbnail"><img src="%s" alt=""/></p>'
1267
                        ) % extra_context.get('thumbnail_url')
1268
            if extra_context.get('mail_url'):
1269
                r += htmltext('<p><a href="%s">%s</a></p>') % (
1270
                        extra_context.get('mail_url'), _('Open'))
1271
            if extra_context.get('user_id'):
1272
                r += htmltext('<h3>%s</h3>') % _('Associated User')
1273
                r += htmltext('<p>%s</p>') % get_publisher().user_class.get(
1274
                        extra_context.get('user_id')).display_name
1275
            if extra_context.get('comments'):
1276
                r += htmltext('<h3>%s</h3>') % _('Comments')
1277
                r += htmltext('<p>%s</p>') % extra_context.get('comments')
1278
            if extra_context.get('summary_url'):
1279
                r += htmltext('<div data-content-url="%s"></div>' %
1280
                        (extra_context.get('summary_url')))
1281
            r += htmltext('</div>')
1282

  
1283
        if formdata.user_id and get_publisher().is_using_postgresql():
1284
            # display list of open formdata for the same user
1285
            user_roles = [logged_users_role().id] + (get_request().user.roles or [])
1286
            criterias = [Equal('is_at_endpoint', False),
1287
                         Equal('user_id', str(formdata.user_id)),
1288
                         Intersects('concerned_roles_array', user_roles),
1289
                        ]
1290
            from wcs import sql
1291
            formdatas = sql.AnyFormData.select(criterias, order_by='-receipt_time', limit=50)
1292

  
1293
            # exclude currently displayed formdate from list
1294
            formdatas = [x for x in formdatas if not (
1295
                str(x.formdef_id) == str(self.formdef.id) and str(x.id) == str(formdata.id))]
1296

  
1297
            if formdatas:
1298
                r += htmltext('<div class="other-pending-forms">')
1299
                r += htmltext('<h3>%s</h3>') % _('Other Pending Forms')
1300
                categories = {}
1301
                formdata_by_category = {}
1302
                for formdata in formdatas:
1303
                    if not formdata.formdef.category_id in categories:
1304
                        categories[formdata.formdef.category_id] = formdata.formdef.category
1305
                        formdata_by_category[formdata.formdef.category_id] = []
1306
                    formdata_by_category[formdata.formdef.category_id].append(formdata)
1307
                cats = categories.values()
1308
                Category.sort_by_position(cats)
1309
                if self.formdef.category_id in categories:
1310
                    # move current category to the top
1311
                    cats.remove(categories[self.formdef.category_id])
1312
                    cats.insert(0, categories[self.formdef.category_id])
1313
                for cat in cats:
1314
                    if len(cats) > 1:
1315
                        if cat is None:
1316
                            r += htmltext('<h4>%s</h4>') % _('Misc')
1317
                            cat_formdatas = formdata_by_category[None]
1318
                        else:
1319
                            r += htmltext('<h4>%s</h4>') % cat.name
1320
                            cat_formdatas = formdata_by_category[cat.id]
1321
                    else:
1322
                        cat_formdatas = formdatas
1323
                    r += htmltext('<ul>')
1324
                    for formdata in cat_formdatas:
1325
                        status = formdata.get_status()
1326
                        if status:
1327
                            status_label = status.name
1328
                        else:
1329
                            status_label = _('Unknown')
1330
                        submit_date = misc.strftime.strftime(
1331
                                misc.date_format(), formdata.receipt_time)
1332
                        r += htmltext('<li><a href="%s">%s</a>, '
1333
                                      '<span class="datetime">%s</span> '
1334
                                      '<span class="status">(%s)</span>' % (
1335
                            formdata.get_url(backoffice=True),
1336
                            formdata.formdef.name,
1337
                            submit_date, status_label))
1338
                    r += htmltext('</ul>')
1339
                r += htmltext('</div>')
1340

  
1283 1341
        return r.getvalue()
1284 1342

  
1285 1343

  
wcs/categories.py
65 65

  
66 66
    def sort_by_position(cls, categories):
67 67
        def cmp_position(x, y):
68
            if x is None and x is None:
69
                return 0
70
            if y is None:
71
                return -1
72
            if x is None:
73
                return 1
68 74
            if x.position == y.position:
69 75
                return 0
70 76
            if x.position is None:
wcs/qommon/static/css/dc2/admin.css
1109 1109
div.bo-block.important {
1110 1110
	background: #fd6;
1111 1111
	border: 1px solid #ffae15;
1112
}
1112 1113

  
1114
div.other-pending-forms ul {
1115
	margin-left: 0;
1116
	padding-left: 1.5em;
1117
}
1118

  
1119
div.other-pending-forms span.datetime,
1120
div.other-pending-forms span.status {
1121
	font-size: 80%;
1113 1122
}
1114
-