Projet

Général

Profil

0001-cards-add-preset-datasources-for-cards-filtered-on-u.patch

Frédéric Péters, 15 juillet 2022 18:55

Télécharger (4,48 ko)

Voir les différences:

Subject: [PATCH] cards: add preset datasources for cards filtered on user
 (#50459)

 tests/form_pages/test_all.py | 47 ++++++++++++++++++++++++++++++++++++
 wcs/carddef.py               | 23 ++++++++++++------
 2 files changed, 63 insertions(+), 7 deletions(-)
tests/form_pages/test_all.py
9673 9673
    # it jumps to st2, as jump.by is only related to triggers
9674 9674
    assert formdef.data_class().count() == 1
9675 9675
    assert formdef.data_class().select()[0].status == 'wf-st2'
9676

  
9677

  
9678
def test_user_filter_auto_custom_view(pub):
9679
    user = create_user(pub)
9680

  
9681
    CardDef.wipe()
9682
    carddef = CardDef()
9683
    carddef.name = 'items'
9684
    carddef.user_support = 'optional'
9685
    carddef.digest_templates = {'default': '{{form_var_name}}'}
9686
    carddef.fields = [
9687
        fields.StringField(id='0', label='string', varname='name'),
9688
    ]
9689
    carddef.store()
9690
    for i, value in enumerate(['foo', 'bar', 'baz']):
9691
        carddata = carddef.data_class()()
9692
        carddata.data = {
9693
            '0': value,
9694
            '1': 'attr%s' % i,
9695
        }
9696
        carddata.user_id = user.id
9697
        carddata.just_created()
9698
        carddata.store()
9699

  
9700
    carddata.user_id = None  # don't associate latest (baz) with user
9701
    carddata.store()
9702

  
9703
    ds = {'type': 'carddef:%s' % carddef.url_name}
9704
    formdef = FormDef()
9705
    formdef.name = 'foobar'
9706
    formdef.fields = [
9707
        fields.ItemField(id='0', label='item', type='item', varname='foo', data_source=ds),
9708
    ]
9709
    formdef.store()
9710

  
9711
    app = get_app(pub)
9712
    resp = app.get(formdef.get_url())
9713
    assert [x[2] for x in resp.form['f0'].options] == ['bar', 'baz', 'foo']
9714

  
9715
    formdef.fields[0].data_source['type'] = 'carddef:%s:_with_user_filter' % carddef.url_name
9716
    formdef.store()
9717
    resp = app.get(formdef.get_url())
9718
    assert [x[2] for x in resp.form['f0'].options] == ['---']
9719

  
9720
    app = login(get_app(pub), username='foo', password='foo')
9721
    resp = app.get(formdef.get_url())
9722
    assert [x[2] for x in resp.form['f0'].options] == ['bar', 'foo']
wcs/carddef.py
155 155
            data_source_id = 'carddef:%s' % carddef.url_name
156 156
            carddefs_by_id[carddef.id] = carddef
157 157
            yield (carddef, carddef.name, data_source_id, None)
158
            if carddef.user_support:
159
                data_source_id = 'carddef:%s:_with_user_filter' % carddef.url_name
160
                yield (carddef, _('%s (filtered on user)') % carddef.name, data_source_id, None)
158 161
        clauses = [Equal('formdef_type', 'carddef'), Equal('visibility', 'datasource')]
159 162
        for custom_view in get_publisher().custom_view_class.select(clauses):
160 163
            carddef = carddefs_by_id.get(custom_view.formdef_id)
......
198 201
        order_by = None
199 202
        digest_key = 'default'
200 203
        if len(parts) > 2:
201
            if custom_view is None:
202
                custom_view = cls.get_data_source_custom_view(data_source_id, carddef=carddef)
203
                if not custom_view:
204
                    return []
205
            order_by = custom_view.order_by
206
            if not get_by_id:
207
                criterias.extend(custom_view.get_criterias(formdef=carddef, compile_templates=True))
204
            if parts[2] == '_with_user_filter':
205
                if not get_by_id:
206
                    variables = get_publisher().substitutions.get_context_variables(mode='lazy')
207
                    user = variables['form_user']
208
                    criterias.append(Equal('user_id', str(user.id) if user else '-1'))
209
            else:
210
                if custom_view is None:
211
                    custom_view = cls.get_data_source_custom_view(data_source_id, carddef=carddef)
212
                    if not custom_view:
213
                        return []
214
                order_by = custom_view.order_by
215
                if not get_by_id:
216
                    criterias.extend(custom_view.get_criterias(formdef=carddef, compile_templates=True))
208 217

  
209 218
        if custom_view:
210 219
            view_digest_key = 'custom-view:%s' % custom_view.get_url_slug()
211
-