backoffice: always register a snapshot on custom view changes (#80235)
This commit is contained in:
parent
f5f34160d9
commit
8e73319dbc
|
@ -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
|
||||
|
|
|
@ -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() + '/')
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue