Projet

Général

Profil

0001-carddef-add-custom-view-dynamic-filter-on-items-fiel.patch

Benjamin Dauvergne, 27 décembre 2021 17:27

Télécharger (5,62 ko)

Voir les différences:

Subject: [PATCH] carddef: add custom view dynamic filter on items field
 (#48386)

 tests/form_pages/test_all.py | 76 ++++++++++++++++++++++++++++++++++++
 wcs/carddef.py               | 25 ++++++++++--
 2 files changed, 98 insertions(+), 3 deletions(-)
tests/form_pages/test_all.py
1 1
import hashlib
2 2
import io
3
import itertools
3 4
import json
4 5
import os
5 6
import re
......
5512 5513
    assert formdef.data_class().select()[0].data['0_structured']['item'] == 'baz'
5513 5514

  
5514 5515

  
5516
@pytest.mark.parametrize('filter_value', ['{{ "foo,bar" }}', 'foo,bar', '{{ "foo,bar"|split:","|list }}'])
5517
def test_items_field_from_custom_view_on_cards(pub, filter_value):
5518
    pub.role_class.wipe()
5519
    pub.custom_view_class.wipe()
5520

  
5521
    user = create_user(pub)
5522
    role = pub.role_class(name='xxx')
5523
    role.store()
5524
    user.roles = [role.id]
5525
    user.is_admin = True
5526
    user.store()
5527

  
5528
    formdef = create_formdef()
5529
    formdef.data_class().wipe()
5530

  
5531
    items = ['foo', 'bar', 'baz', 'buz']
5532
    CardDef.wipe()
5533
    carddef = CardDef()
5534
    carddef.name = 'items'
5535
    carddef.digest_templates = {'default': '{{form_var_attr}} - {{form_var_item}}'}
5536
    carddef.workflow_roles = {'_editor': user.roles[0]}
5537
    carddef.fields = [
5538
        fields.ItemsField(id='0', type='items', label='item', varname='item', items=items),
5539
        fields.StringField(id='1', type='string', label='string', varname='attr'),
5540
    ]
5541
    carddef.store()
5542
    carddef.data_class().wipe()
5543
    foo_bar_ids = set()
5544
    for i, (v1, v2) in enumerate([(v1, v2) for (v1, v2) in itertools.product(items, items) if v1 != v2]):
5545
        carddata = carddef.data_class()()
5546
        carddata.data = {
5547
            '0': [v1, v2],
5548
            '0_display': '%s,%s' % (v1, v2),
5549
            '1': 'attr%s' % i,
5550
        }
5551
        carddata.just_created()
5552
        carddata.store()
5553
        if {v1, v2} & {'foo', 'bar'}:
5554
            foo_bar_ids.add(str(carddata.id))
5555

  
5556
    # create custom view
5557
    app = login(get_app(pub), username='foo', password='foo')
5558

  
5559
    # we must force the ordering to have a determinist test
5560
    resp = app.get('/backoffice/data/items/?order_by=id')
5561
    assert resp.text.count('<tr') == 13  # thead + 12 items (max per page)
5562
    resp.forms['listing-settings']['filter-0'].checked = True
5563
    resp = resp.forms['listing-settings'].submit()
5564

  
5565
    resp.forms['listing-settings']['filter-0-value'].force_value(filter_value)
5566
    resp = resp.forms['listing-settings'].submit()
5567

  
5568
    resp.forms['save-custom-view']['title'] = 'as data source'
5569
    resp.forms['save-custom-view']['visibility'] = 'datasource'
5570
    resp = resp.forms['save-custom-view'].submit()
5571

  
5572
    custom_view = pub.custom_view_class.select()[0]
5573

  
5574
    # use custom view as source
5575
    ds = {'type': 'carddef:%s:%s' % (carddef.url_name, custom_view.slug)}
5576
    formdef.fields = [
5577
        fields.ItemField(id='0', label='string', type='item', data_source=ds, display_disabled_items=True)
5578
    ]
5579
    formdef.store()
5580

  
5581
    resp = get_app(pub).get('/test/')
5582
    assert len(resp.form['f0'].options) == 10  # 12 - ['baz,buz', 'buz,baz']
5583
    assert {x[0] for x in resp.form['f0'].options} == foo_bar_ids
5584
    resp = resp.form.submit('submit')  # -> validation page
5585
    resp = resp.form.submit('submit')  # -> submit
5586
    formdata = formdef.data_class().select()[0]
5587
    assert formdata.data['0'] in foo_bar_ids
5588
    assert formdata.data['0_structured']['text'] == 'attr0 - foo,bar'
5589

  
5590

  
5515 5591
def test_item_field_with_disabled_items(http_requests, pub):
5516 5592
    create_user(pub)
5517 5593
    formdef = create_formdef()
wcs/carddef.py
213 213
            order_by = custom_view.order_by
214 214
            criterias.extend(custom_view.get_criterias(formdef=carddef))
215 215
            for criteria in criterias:
216
                if not Template.is_template_string(criteria.value):
217
                    continue
218
                criteria.value = WorkflowStatusItem.compute(criteria.value)
216
                if Template.is_template_string(criteria.value):
217
                    criteria.value = WorkflowStatusItem.compute(criteria.value)
218
                # case of items
219
                elif (
220
                    criteria.__class__.__name__ == 'Intersects'
221
                    and isinstance(criteria.value, list)
222
                    and len(criteria.value) == 1
223
                    and isinstance(criteria.value[0], str)
224
                ):
225
                    cvalue = criteria.value[0]
226

  
227
                    if Template.is_template_string(cvalue):
228
                        publisher = get_publisher()
229
                        with publisher.complex_data():
230
                            cvalue_evaluated = WorkflowStatusItem.compute(cvalue, allow_complex=True)
231
                            cvalue = publisher.get_cached_complex_data(cvalue_evaluated)
232
                    if isinstance(cvalue, list):
233
                        pass
234
                    elif ',' in cvalue:
235
                        cvalue = [v.strip() for v in cvalue.split(',')]
236
                    criteria.value = [item.strip() for item in cvalue]
237

  
219 238
        if custom_view:
220 239
            view_digest_key = 'custom-view:%s' % custom_view.get_url_slug()
221 240
            if view_digest_key in (carddef.digest_templates or {}):
222
-