Projet

Général

Profil

0001-backoffice-display-card-selected-in-item-field-as-li.patch

Frédéric Péters, 14 janvier 2020 14:56

Télécharger (6,89 ko)

Voir les différences:

Subject: [PATCH] backoffice: display card selected in item field as link
 (#38924)

 tests/test_backoffice_pages.py | 50 ++++++++++++++++++++++++++++++++++
 wcs/fields.py                  | 20 +++++++++++++-
 wcs/forms/common.py            | 16 +++++++----
 3 files changed, 79 insertions(+), 7 deletions(-)
tests/test_backoffice_pages.py
5323 5323
    assert 'HELLO WORLD 2' in resp.text
5324 5324

  
5325 5325
def test_carddata_management(pub, studio):
5326
    CardDef.wipe()
5326 5327
    user = create_user(pub)
5327 5328
    app = login(get_app(pub))
5328 5329
    resp = app.get('/backoffice/')
......
5333 5334
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
5334 5335
    ]
5335 5336
    carddef.store()
5337
    carddef.data_class().wipe()
5336 5338

  
5337 5339
    resp = app.get('/backoffice/')
5338 5340
    assert not 'Cards' in resp.text
......
5370 5372
    resp = app.get('/backoffice/data/')
5371 5373
    resp = resp.click('foo')
5372 5374
    assert resp.text.count('<tr') == 2  # header + row of data
5375

  
5376
def test_studio_card_item_link(pub, studio):
5377
    user = create_user(pub)
5378
    CardDef.wipe()
5379
    carddef = CardDef()
5380
    carddef.name = 'foo'
5381
    carddef.fields = [
5382
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
5383
    ]
5384
    carddef.backoffice_submission_roles = user.roles
5385
    carddef.workflow_roles = {'_editor': user.roles[0]}
5386
    carddef.digest_template = 'card {{form_var_foo}}'
5387
    carddef.store()
5388
    carddef.data_class().wipe()
5389

  
5390
    card = carddef.data_class()()
5391
    card.data = {'1': 'plop'}
5392
    card.store()
5393

  
5394
    carddef2 = CardDef()
5395
    carddef2.name = 'bar'
5396
    carddef2.fields = [
5397
        fields.ItemField(id='1', label='Test', type='item',
5398
            data_source={'type': 'carddef:foo', 'value': ''}),
5399
    ]
5400
    carddef2.backoffice_submission_roles = user.roles
5401
    carddef2.workflow_roles = {'_editor': user.roles[0]}
5402
    carddef2.store()
5403
    carddef2.data_class().wipe()
5404

  
5405
    app = login(get_app(pub))
5406
    resp = app.get('/backoffice/data/')
5407
    resp = resp.click('bar')
5408
    resp = resp.click('Add')
5409
    resp.form['f1'] = card.id
5410
    resp = resp.form.submit('submit')
5411
    assert resp.location.endswith('/backoffice/data/bar/1/')
5412
    resp = resp.follow()
5413
    resp = resp.click('card plop')
5414
    assert '<div class="value">plop</div>' in resp
5415

  
5416
    # look without access rights
5417
    carddef.backoffice_submission_roles = None
5418
    carddef.workflow_roles = {'_editor': None}
5419
    carddef.store()
5420
    resp = app.get('/backoffice/data/bar/1/')
5421
    with pytest.raises(IndexError):
5422
        resp.click('card plop')
wcs/fields.py
1363 1363

  
1364 1364
        return data_source.get_display_value(value)
1365 1365

  
1366
    def get_view_value(self, value, value_id=None):
1367
        value = super(ItemField, self).get_view_value(value)
1368
        if not (value_id and
1369
                get_request() and
1370
                get_request().is_in_backoffice() and
1371
                self.data_source and
1372
                self.data_source.get('type', '').startswith('carddef:')):
1373
            return value
1374
        from wcs.carddef import CardDef
1375
        try:
1376
            carddef = CardDef.get_by_urlname(self.data_source['type'][8:])
1377
            carddata = carddef.data_class().get(value_id)
1378
        except KeyError:
1379
            return value
1380
        if not carddef.is_user_allowed_read(get_request().user, carddata):
1381
            return value
1382
        return htmltext('<a href="%s">' % carddata.get_url(backoffice=True)) + htmltext('%s</a>') % value
1383

  
1366 1384
    def add_to_view_form(self, form, value = None):
1367 1385
        real_value = value
1368 1386
        label_value = ''
......
1575 1593
    def convert_value_to_str(self, value):
1576 1594
        return value
1577 1595

  
1578
    def get_view_value(self, value):
1596
    def get_view_value(self, value, **kwargs):
1579 1597
        if type(value) is str: # == display_value
1580 1598
            return value
1581 1599
        if value:
wcs/forms/common.py
394 394
        pages = []
395 395
        current_page_fields = []
396 396

  
397
        def get_value(f):
397
        def get_value_info(f):
398
            # return the selected value and an optional dictionary that will be
399
            # passed to get_view_value() to provide additional details.
400
            value_details = {}
398 401
            if f.id not in self.filled.data:
399 402
                value = None
400 403
            else:
401 404
                if f.store_display_value and ('%s_display' % f.id) in self.filled.data:
402 405
                    value = self.filled.data['%s_display' % f.id]
406
                    value_details['value_id'] = self.filled.data[f.id]
403 407
                else:
404 408
                    value = self.filled.data[f.id]
405 409

  
406 410
                if value is None or value == '':
407 411
                    value = None
408
            return value
412
            return (value, value_details)
409 413

  
410 414
        for i, f in enumerate(fields):
411 415
            if f.type == 'page':
......
429 433
            if not f.include_in_summary_page:
430 434
                continue
431 435

  
432
            value = get_value(f)
436
            value, value_details = get_value_info(f)
433 437
            if value is None and not (f.required and include_unset_required_fields):
434 438
                continue
435 439

  
436
            current_page_fields.append({'field': f, 'value': value})
440
            current_page_fields.append({'field': f, 'value': value, 'value_details': value_details})
437 441

  
438 442
        if not pages:
439 443
            fields = [x['field'] for x in current_page_fields]
......
477 481
                css_classes.append(f.extra_css_class)
478 482
            r += htmltext('<div class="%s">' % ' '.join(css_classes))
479 483
            r += htmltext('<span class="label">%s</span> ') % f.label
480
            value = get_value(f)
484
            value, value_details = get_value_info(f)
481 485
            if value is None:
482 486
                r += htmltext('<div class="value"><i>%s</i></div>') % _('Not set')
483 487
            else:
484 488
                r += htmltext('<div class="value">')
485
                s = f.get_view_value(value)
489
                s = f.get_view_value(value, **value_details)
486 490
                s = s.replace(str('[download]'), str('%sdownload' % form_url))
487 491
                r += s
488 492
                r += htmltext('</div>')
489
-