backoffice: always register a snapshot on custom view changes (#80235)

This commit is contained in:
Lauréline Guérin 2023-08-10 13:16:47 +02:00
parent f5f34160d9
commit 8e73319dbc
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 118 additions and 14 deletions

View File

@ -1743,3 +1743,96 @@ def test_backoffice_folded_data_sources(pub):
resp = resp.click('datasource view')
assert resp.pyquery('.sidebar-custom-views').length == 2
assert resp.pyquery('fieldset.foldable:not(.folded) .sidebar-custom-views').length == 1
@pytest.mark.parametrize('formdef_class', [FormDef, CardDef])
def test_backoffice_custom_view_and_snapshots(pub, formdef_class):
user = create_superuser(pub)
pub.custom_view_class.wipe()
pub.snapshot_class.wipe()
formdef_class.wipe()
formdef = formdef_class()
formdef.name = 'foo'
formdef.fields = [
fields.StringField(id='1', label='Test', varname='foo'),
]
formdef.backoffice_submission_roles = user.roles
formdef.workflow_roles = {'_editor': user.roles[0], '_receiver': 1}
formdef.digest_templates = {
'default': 'plop',
}
formdef.store()
assert pub.snapshot_class.count() == 1
app = login(get_app(pub))
resp = app.get(formdef.get_backoffice_url())
resp.forms['listing-settings']['filter-1'].checked = True
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'custom test view - owner'
resp.forms['save-custom-view']['visibility'] = 'owner'
resp = resp.forms['save-custom-view'].submit()
assert resp.location.endswith('/user-custom-test-view-owner/')
resp = resp.follow()
custom_view = pub.custom_view_class.select()[-1]
assert custom_view.visibility == 'owner'
assert pub.custom_view_class.count() == 1
assert pub.snapshot_class.count() == 1 # owner custom view, no store on formdef
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert pub.custom_view_class.count() == 0
assert pub.snapshot_class.count() == 1 # owner custom view, no store on formdef
resp.forms['listing-settings']['filter-1'].checked = True
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'custom test view - role'
resp.forms['save-custom-view']['role'] = user.roles[0]
resp.forms['save-custom-view']['visibility'] = 'role'
resp = resp.forms['save-custom-view'].submit()
assert resp.location.endswith('/custom-test-view-role/')
resp = resp.follow()
custom_view = pub.custom_view_class.select()[-1]
assert custom_view.visibility == 'role'
assert pub.custom_view_class.count() == 1
assert pub.snapshot_class.count() == 2 # role custom view, store formdef
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert pub.custom_view_class.count() == 0
assert pub.snapshot_class.count() == 3 # role custom view, store formdef
resp.forms['listing-settings']['filter-1'].checked = True
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'custom test view - any'
resp.forms['save-custom-view']['visibility'] = 'any'
resp = resp.forms['save-custom-view'].submit()
assert resp.location.endswith('/custom-test-view-any/')
resp = resp.follow()
custom_view = pub.custom_view_class.select()[-1]
assert custom_view.visibility == 'any'
assert pub.custom_view_class.count() == 1
assert pub.snapshot_class.count() == 4 # any custom view, store formdef
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert pub.custom_view_class.count() == 0
assert pub.snapshot_class.count() == 5 # any custom view, store formdef
if formdef_class == CardDef:
resp.forms['listing-settings']['filter-1'].checked = True
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'custom test view - datasource'
resp.forms['save-custom-view']['visibility'] = 'datasource'
resp = resp.forms['save-custom-view'].submit()
assert resp.location.endswith('/custom-test-view-datasource/')
resp = resp.follow()
custom_view = pub.custom_view_class.select()[-1]
assert custom_view.visibility == 'datasource'
assert pub.custom_view_class.count() == 1
assert pub.snapshot_class.count() == 6 # datasource custom view, store formdef
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert pub.custom_view_class.count() == 0
assert pub.snapshot_class.count() == 7 # datasource custom view, store formdef

View File

@ -1691,6 +1691,20 @@ class FormPage(FormdefDirectoryBase):
custom_view.group_by = form.get_widget('group_by').parse()
custom_view.store()
if custom_view.is_default and custom_view.visibility != 'datasource':
# need to clean other views to have only one default per owner/any visibility
for view in self.get_custom_views():
if view.id == custom_view.id:
continue
if (
custom_view.visibility == view.visibility
and view.is_default
and view.role_id == custom_view.role_id
):
view.is_default = False
view.store()
formdef_stored = False
if form.get_widget('digest_template') and custom_view.visibility != 'owner':
if not self.formdef.digest_templates:
self.formdef.digest_templates = {}
@ -1701,6 +1715,7 @@ class FormPage(FormdefDirectoryBase):
'custom-view:%s' % custom_view.get_url_slug()
] = form.get_widget('digest_template').parse()
self.formdef.store()
formdef_stored = True
if self.formdef.data_class().count():
get_response().add_after_job(UpdateDigestAfterJob(formdefs=[self.formdef]))
elif (
@ -1715,19 +1730,12 @@ class FormPage(FormdefDirectoryBase):
if old_view_digest_key in (self.formdef.digest_templates or {}):
del self.formdef.digest_templates[old_view_digest_key]
self.formdef.store()
if custom_view.is_default and custom_view.visibility != 'datasource':
# need to clean other views to have only one default per owner/any visibility
for view in self.get_custom_views():
if view.id == custom_view.id:
continue
if (
custom_view.visibility == view.visibility
and view.is_default
and view.role_id == custom_view.role_id
):
view.is_default = False
view.store()
formdef_stored = True
if custom_view.visibility != 'owner':
# store to always have a snapshot, except if owner view
if not formdef_stored:
# a snapshot will be stored only if there is changes
self.formdef.store()
if self.view:
return redirect('../' + custom_view.get_url_slug() + '/')

View File

@ -69,6 +69,7 @@ class CustomView(StorableObject):
self.formdef_type = value.xml_root_node
def remove_self(self):
super().remove_self()
try:
formdef = self.formdef
except KeyError:
@ -78,7 +79,9 @@ class CustomView(StorableObject):
if view_digest_key in (formdef.digest_templates or {}):
del formdef.digest_templates[view_digest_key]
formdef.store()
super().remove_self()
elif self.visibility != 'owner':
# a snapshot will be stored only if there is changes
formdef.store()
def match(self, user, formdef, for_export=False):
if self.formdef_type != formdef.xml_root_node: