backoffice: overwrite shared custom views (#56698)
This commit is contained in:
parent
10ccd9e3a9
commit
ef24d19cab
|
@ -2646,6 +2646,66 @@ def test_form_export_import_export_overwrite(pub):
|
|||
assert (field.id, field.label, field.type) == (field_ow.id, field_ow.label, field_ow.type)
|
||||
|
||||
|
||||
def test_form_with_custom_views_import_export_overwrite(pub):
|
||||
user = create_superuser(pub)
|
||||
create_role(pub)
|
||||
|
||||
FormDef.wipe()
|
||||
pub.custom_view_class.wipe()
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'form title'
|
||||
formdef.table_name = 'xxx'
|
||||
formdef.fields = [ # unordered id
|
||||
fields.StringField(id='1', label='field 1', type='string'),
|
||||
fields.DateField(id='12', label='field 2', type='date'),
|
||||
fields.ItemField(id='4', label='field 3', type='item'),
|
||||
]
|
||||
formdef.store()
|
||||
|
||||
# add data
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {'1': 'foo'}
|
||||
formdata.just_created()
|
||||
formdata.store()
|
||||
|
||||
# add custom view
|
||||
custom_view = pub.custom_view_class()
|
||||
custom_view.title = 'custom test view'
|
||||
custom_view.formdef = formdef
|
||||
custom_view.visibility = 'any'
|
||||
custom_view.columns = {'list': [{'id': 'id'}]}
|
||||
custom_view.filters = {}
|
||||
custom_view.store()
|
||||
|
||||
# add private custom view
|
||||
custom_view2 = pub.custom_view_class()
|
||||
custom_view2.title = 'private custom test view'
|
||||
custom_view2.formdef = formdef
|
||||
custom_view2.visibility = 'owner'
|
||||
custom_view2.user_id = str(user.id)
|
||||
custom_view2.columns = {'list': [{'id': 'id'}]}
|
||||
custom_view2.filters = {}
|
||||
custom_view2.store()
|
||||
|
||||
formdef_xml = ET.tostring(formdef.export_to_xml(include_id=True))
|
||||
|
||||
# alter initial custom view
|
||||
custom_view.title = 'modified custom test view'
|
||||
custom_view.store()
|
||||
|
||||
app = login(get_app(pub))
|
||||
resp = app.get('/backoffice/forms/%s/' % formdef.id)
|
||||
resp = resp.click(href='overwrite')
|
||||
resp.forms[0]['file'] = Upload('formdef.wcs', formdef_xml)
|
||||
resp = resp.forms[0].submit() # -> confirmation
|
||||
resp = resp.forms[0].submit() # -> overwrite
|
||||
assert {x.title for x in pub.custom_view_class.select()} == {
|
||||
'custom test view',
|
||||
'private custom test view',
|
||||
}
|
||||
|
||||
|
||||
def test_form_comment_with_error_in_wscall(http_requests, pub):
|
||||
create_superuser(pub)
|
||||
NamedWsCall.wipe()
|
||||
|
|
|
@ -1352,6 +1352,12 @@ class FormDefPage(Directory):
|
|||
new_formdef.workflow_roles = self.formdef.workflow_roles
|
||||
new_formdef.backoffice_submission_roles = self.formdef.backoffice_submission_roles
|
||||
new_formdef.roles = self.formdef.roles
|
||||
|
||||
# remove existing shared views
|
||||
for view in get_publisher().custom_view_class.select():
|
||||
if view.match(user=None, formdef=self.formdef):
|
||||
view.remove_self()
|
||||
|
||||
self.formdef = new_formdef
|
||||
self.formdef.store(comment=_('Overwritten'))
|
||||
get_session().message = ('info', str(self.overwrite_success_message))
|
||||
|
|
|
@ -1063,10 +1063,18 @@ class FormDef(StorableObject):
|
|||
else:
|
||||
pass # TODO: extend support to other types
|
||||
|
||||
custom_views = ET.SubElement(root, 'custom_views')
|
||||
for view in get_publisher().custom_view_class.select():
|
||||
if view.match(user=None, formdef=self):
|
||||
custom_views.append(view.export_to_xml(charset=charset))
|
||||
custom_views_element = ET.SubElement(root, 'custom_views')
|
||||
if hasattr(self, '_custom_views'):
|
||||
# it has just been loaded, it's reexported as part as the overwrite
|
||||
# confirmation dialog, do not get custom views from database.
|
||||
custom_views = self._custom_views
|
||||
else:
|
||||
custom_views = []
|
||||
for view in get_publisher().custom_view_class.select():
|
||||
if view.match(user=None, formdef=self):
|
||||
custom_views.append(view)
|
||||
for view in custom_views:
|
||||
custom_views_element.append(view.export_to_xml(charset=charset))
|
||||
|
||||
geolocations = ET.SubElement(root, 'geolocations')
|
||||
for geoloc_key, geoloc_label in (self.geolocations or {}).items():
|
||||
|
|
Loading…
Reference in New Issue