cards: list forms using the card as datasource on details page (#47323)
This commit is contained in:
parent
ecccd87464
commit
e077697175
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue