cards: add preset datasources for cards filtered on user (#50459)

This commit is contained in:
Frédéric Péters 2021-01-24 18:33:16 +01:00
parent 9cf08439e3
commit da3e9a5118
2 changed files with 63 additions and 7 deletions

View File

@ -9673,3 +9673,50 @@ def test_jumps_with_by_and_no_trigger(pub):
# it jumps to st2, as jump.by is only related to triggers
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'wf-st2'
def test_user_filter_auto_custom_view(pub):
user = create_user(pub)
CardDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.user_support = 'optional'
carddef.digest_templates = {'default': '{{form_var_name}}'}
carddef.fields = [
fields.StringField(id='0', label='string', varname='name'),
]
carddef.store()
for i, value in enumerate(['foo', 'bar', 'baz']):
carddata = carddef.data_class()()
carddata.data = {
'0': value,
'1': 'attr%s' % i,
}
carddata.user_id = user.id
carddata.just_created()
carddata.store()
carddata.user_id = None # don't associate latest (baz) with user
carddata.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'foobar'
formdef.fields = [
fields.ItemField(id='0', label='item', type='item', varname='foo', data_source=ds),
]
formdef.store()
app = get_app(pub)
resp = app.get(formdef.get_url())
assert [x[2] for x in resp.form['f0'].options] == ['bar', 'baz', 'foo']
formdef.fields[0].data_source['type'] = 'carddef:%s:_with_user_filter' % carddef.url_name
formdef.store()
resp = app.get(formdef.get_url())
assert [x[2] for x in resp.form['f0'].options] == ['---']
app = login(get_app(pub), username='foo', password='foo')
resp = app.get(formdef.get_url())
assert [x[2] for x in resp.form['f0'].options] == ['bar', 'foo']

View File

@ -155,6 +155,9 @@ class CardDef(FormDef):
data_source_id = 'carddef:%s' % carddef.url_name
carddefs_by_id[carddef.id] = carddef
yield (carddef, carddef.name, data_source_id, None)
if carddef.user_support:
data_source_id = 'carddef:%s:_with_user_filter' % carddef.url_name
yield (carddef, _('%s (filtered on user)') % carddef.name, data_source_id, None)
clauses = [Equal('formdef_type', 'carddef'), Equal('visibility', 'datasource')]
for custom_view in get_publisher().custom_view_class.select(clauses):
carddef = carddefs_by_id.get(custom_view.formdef_id)
@ -198,13 +201,19 @@ class CardDef(FormDef):
order_by = None
digest_key = 'default'
if len(parts) > 2:
if custom_view is None:
custom_view = cls.get_data_source_custom_view(data_source_id, carddef=carddef)
if not custom_view:
return []
order_by = custom_view.order_by
if not get_by_id:
criterias.extend(custom_view.get_criterias(formdef=carddef, compile_templates=True))
if parts[2] == '_with_user_filter':
if not get_by_id:
variables = get_publisher().substitutions.get_context_variables(mode='lazy')
user = variables['form_user']
criterias.append(Equal('user_id', str(user.id) if user else '-1'))
else:
if custom_view is None:
custom_view = cls.get_data_source_custom_view(data_source_id, carddef=carddef)
if not custom_view:
return []
order_by = custom_view.order_by
if not get_by_id:
criterias.extend(custom_view.get_criterias(formdef=carddef, compile_templates=True))
if custom_view:
view_digest_key = 'custom-view:%s' % custom_view.get_url_slug()