datasource: use carddef custom view digest template as text (#45633)

This commit is contained in:
Lauréline Guérin 2021-06-25 10:04:12 +02:00
parent f13f3cd80f
commit ed1698d5b0
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 108 additions and 5 deletions

View File

@ -418,3 +418,101 @@ def test_get_data_source_custom_view(pub):
assert CardDef.get_data_source_custom_view('carddef:foo-1:view', carddef=carddef2) is None
assert CardDef.get_data_source_custom_view('carddef:foo-2:view', carddef=carddef2).id == custom_view2.id
assert CardDef.get_data_source_custom_view('carddef:foo-2:view', carddef=carddef1) is None
def test_data_source_custom_view_digest(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.digest_templates = {'default': '{{ form_var_foo }}'}
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'1': 'Hello'}
carddata.just_created()
carddata.store()
carddata2 = carddef.data_class()()
carddata2.data = {'1': 'Bye'}
carddata2.just_created()
carddata2.store()
custom_view = pub.custom_view_class()
custom_view.title = 'view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': 'id'}]}
custom_view.filters = {}
custom_view.visibility = 'datasource'
custom_view.store()
assert [i['text'] for i in CardDef.get_data_source_items('carddef:foo')] == ['Bye', 'Hello']
assert [i['text'] for i in CardDef.get_data_source_items('carddef:foo:view')] == ['Bye', 'Hello']
cards = CardDef.get_data_source_items('carddef:foo', query='hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo:view', query='hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo', query='foo')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo:view', query='foo')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo', get_by_text='Hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo:view', get_by_text='Hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo', get_by_text='Hello Foo Bar')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo:view', get_by_text='Hello Foo Bar')
assert len(cards) == 0
carddef.digest_templates = {
'default': '{{ form_var_foo }}',
'custom-view:view': '{{ form_var_foo }} Foo Bar',
}
carddef.store()
# rebuild digests
carddata.store()
carddata2.store()
assert [i['text'] for i in CardDef.get_data_source_items('carddef:foo')] == ['Bye', 'Hello']
assert [i['text'] for i in CardDef.get_data_source_items('carddef:foo:view')] == [
'Bye Foo Bar',
'Hello Foo Bar',
]
cards = CardDef.get_data_source_items('carddef:foo', query='hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo:view', query='hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello Foo Bar'
cards = CardDef.get_data_source_items('carddef:foo', query='foo')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo:view', query='foo')
assert len(cards) == 2
assert cards[0]['text'] == 'Bye Foo Bar'
assert cards[1]['text'] == 'Hello Foo Bar'
cards = CardDef.get_data_source_items('carddef:foo', get_by_text='Hello')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello'
cards = CardDef.get_data_source_items('carddef:foo:view', get_by_text='Hello')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo', get_by_text='Hello Foo Bar')
assert len(cards) == 0
cards = CardDef.get_data_source_items('carddef:foo:view', get_by_text='Hello Foo Bar')
assert len(cards) == 1
assert cards[0]['text'] == 'Hello Foo Bar'

View File

@ -32,10 +32,10 @@ class CardData(FormData):
formdef = property(get_formdef)
def get_data_source_structured_item(self):
def get_data_source_structured_item(self, digest_key='default'):
item = {
'id': self.id,
'text': self.default_digest,
'text': self.digests.get(digest_key),
}
for field in self.formdef.get_all_fields():
if not field.varname:

View File

@ -202,6 +202,7 @@ class CardDef(FormDef):
return []
criterias = [NotEqual('status', 'draft')]
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)
@ -213,9 +214,13 @@ class CardDef(FormDef):
if not Template.is_template_string(criteria.value):
continue
criteria.value = WorkflowStatusItem.compute(criteria.value)
if custom_view:
view_digest_key = 'custom-view:%s' % custom_view.get_url_slug()
if view_digest_key in (carddef.digest_templates or {}):
digest_key = view_digest_key
if query:
criterias.append(ElementILike('digests', 'default', query))
criterias.append(ElementILike('digests', digest_key, query))
if get_by_id:
try:
if int(get_by_id) >= 2 ** 31:
@ -228,10 +233,10 @@ class CardDef(FormDef):
else:
criterias.append(Equal('id', get_by_id))
if get_by_text:
criterias.append(ElementEqual('digests', 'default', get_by_text))
criterias.append(ElementEqual('digests', digest_key, get_by_text))
items = [
x.get_data_source_structured_item()
x.get_data_source_structured_item(digest_key=digest_key)
for x in carddef.data_class().select(clause=criterias, order_by=order_by, limit=limit)
]
if order_by is None: