backoffice: overwrite shared custom views (#56698)

This commit is contained in:
Frédéric Péters 2021-09-07 10:01:25 +02:00
parent 10ccd9e3a9
commit ef24d19cab
3 changed files with 78 additions and 4 deletions

View File

@ -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()

View File

@ -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))

View File

@ -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():