cards: list forms using the card as datasource on details page (#47323)

This commit is contained in:
Lauréline Guérin 2020-10-08 15:54:56 +02:00
parent ecccd87464
commit e077697175
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 143 additions and 0 deletions

View File

@ -3,11 +3,15 @@
import pytest
from wcs import fields
from wcs.admin.settings import UserFieldsFormDef
from wcs.carddef import CardDef
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.roles import Role
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
from wcs.workflows import Workflow
from wcs.workflows import WorkflowBackofficeFieldsFormDef
from wcs.workflows import WorkflowVariablesFieldsFormDef
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub
from test_admin_pages import create_superuser
@ -196,3 +200,111 @@ def test_card_custom_view_data_source(pub, studio):
assert 'carddef:foo:card-view' in [x[0] for x in resp.form['data_source$type'].options]
assert len(CardDef.get_data_source_items('carddef:foo')) == 2
assert len(CardDef.get_data_source_items('carddef:foo:card-view')) == 1
def test_carddef_usage(pub):
user = create_superuser(pub)
Role.wipe()
role = Role(name='foobar')
role.store()
user.roles = [role.id]
user.store()
# the one used as data source
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
fields.StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.store()
# another one
carddef2 = CardDef()
carddef2.name = 'foobar' # url_name startswith 'foo'
carddef2.fields = [
fields.StringField(id='1', label='Test', type='string', varname='foo'),
]
carddef2.store()
# custom view
app = login(get_app(pub))
resp = app.get('/backoffice/data/foo/')
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'card view'
resp = resp.forms['save-custom-view'].submit()
# a formdef using the carddef as datasource
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test card def on data source'
formdef.fields = [
fields.ItemField(id='1', label='item', data_source={'type': 'carddef:foo'})
]
formdef.store()
# another using the custom view
formdef2 = FormDef()
formdef2.name = 'test card def on data source2'
formdef2.fields = [
fields.ItemField(id='1', label='item', data_source={'type': 'carddef:foo:card-view'})
]
formdef2.store()
# another, using the other carddef as datasource
formdef3 = FormDef()
formdef3.name = 'test card def on data source2'
formdef3.fields = [
fields.ItemField(id='1', label='item', data_source={'type': 'carddef:foobar'}) # startswith carddef:foo
]
formdef3.store()
# user form
user_formdef = UserFieldsFormDef(pub)
user_formdef.fields.append(
fields.ItemField(id='1', type='item', label='item', data_source={'type': 'carddef:foo'}))
user_formdef.store()
# workflow
Workflow.wipe()
workflow = Workflow(name='Workflow One')
workflow.variables_formdef = WorkflowVariablesFieldsFormDef(workflow=workflow)
workflow.variables_formdef.fields.append(
fields.ItemField(id='1', type='idem', label='item', data_source={'type': 'carddef:foo'}))
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields.append(
fields.ItemField(id='1', type='item', label='item', data_source={'type': 'carddef:foo'}))
baz_status = workflow.add_status(name='baz')
display_form = FormWorkflowStatusItem()
display_form.id = '_x'
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
display_form.formdef.fields.append(
fields.ItemField(id='1', type='item', label='item', data_source={'type': 'carddef:foo'}))
baz_status.items.append(display_form)
display_form.parent = baz_status
workflow.store()
# carddef
carddef3 = CardDef()
carddef3.name = 'Baz'
carddef3.fields = [
fields.ItemField(id='1', label='item', data_source={'type': 'carddef:foo'})
]
carddef3.store()
resp = app.get('http://example.net/backoffice/cards/1/')
assert 'This card model is used as data source in the following forms' in resp.text
assert '/backoffice/forms/%s/' % formdef.id in resp.text
assert '/backoffice/forms/%s/' % formdef2.id in resp.text
assert '/backoffice/forms/%s/' % formdef3.id not in resp.text # no, not the good one
assert '/backoffice/workflows/%s/backoffice-fields/fields/' % workflow.id in resp.text
assert '/backoffice/workflows/%s/variables/fields/' % workflow.id in resp.text
assert '/backoffice/workflows/%s/status/1/items/_x/fields/' % workflow.id in resp.text
assert '/backoffice/settings/users/fields/' in resp.text
assert '/backoffice/cards/%s/' % carddef3.id in resp.text
# cleanup
user_formdef = UserFieldsFormDef(pub)
user_formdef.fields = []
user_formdef.store()

View File

@ -27,6 +27,7 @@ from ..qommon.misc import C_
from ..qommon.storage import NotEqual, Null
from wcs.carddef import CardDef
from wcs.formdef import get_formdefs_of_all_kinds
from wcs.roles import Role
from wcs.workflows import Workflow
from wcs.admin.forms import FormsDirectory, FormDefPage, FormDefUI, html_top
@ -165,8 +166,38 @@ class CardDefPage(FormDefPage):
_('Fields'), _('edit'))
r += self.get_preview()
r += htmltext('</div>')
formdefs = self.usage_in_formdefs()
if formdefs:
r += htmltext('<div class="bo-block">')
r += htmltext('<h3>%s</h3>') % _('Forms')
r += htmltext('<p>%s ') % _('This card model is used as data source in the following forms:')
r += htmltext(', ').join([htmltext('<a href="%s">%s</a>') % (x.get_admin_url(), x.name) for x in formdefs])
r += htmltext('</p>')
r += htmltext('</div>')
return r.getvalue()
def usage_in_formdefs(self):
def is_used_in_formdef(formdef):
for field in formdef.fields or []:
data_source = getattr(field, 'data_source', None)
if not data_source:
continue
data_source_id = 'carddef:%s' % self.formdef.url_name
if data_source.get('type') == data_source_id:
return True
if data_source.get('type').startswith('%s:' % data_source_id):
# custom view
return True
return False
formdefs = []
for formdef in get_formdefs_of_all_kinds():
if is_used_in_formdef(formdef):
formdefs.append(formdef)
formdefs.sort(key=lambda x: x.name.lower())
return formdefs
def duplicate(self):
response = super(CardDefPage, self).duplicate()
self.formdefui.formdef.disabled = False