backoffice: allow role specific custom view to be default (#77193) #633

Merged
fpeters merged 1 commits from wip/77193-custom-default-view-by-role into main 2023-09-05 19:49:00 +02:00
2 changed files with 50 additions and 10 deletions

View File

@ -915,32 +915,61 @@ def test_backoffice_custom_view_is_default(pub):
assert pub.custom_view_class.get(2).is_default is True # super user - private
assert pub.custom_view_class.get(3).is_default is True # super user - shared
# not possible to define more than one default private view
# role default view
resp = app.get('/backoffice/management/form-title/')
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'view 4'
resp.forms['save-custom-view']['visibility'] = 'owner'
resp.forms['save-custom-view']['visibility'] = 'role'
resp.forms['save-custom-view']['role'] = agent.roles[0]
resp.forms['save-custom-view']['is_default'] = True
resp = resp.forms['save-custom-view'].submit()
assert pub.custom_view_class.count() == 4
assert pub.custom_view_class.get(1).is_default is False # simple user - private
assert pub.custom_view_class.get(2).is_default is False # super user - private
assert pub.custom_view_class.get(2).is_default is True # super user - private
assert pub.custom_view_class.get(3).is_default is True # super user - shared
assert pub.custom_view_class.get(4).is_default is True # super user - private 2
assert pub.custom_view_class.get(4).is_default is True # role view
# not possible to define more than one default shared view
# not possible to define more than one default private view
resp = app.get('/backoffice/management/form-title/')
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'view 5'
resp.forms['save-custom-view']['visibility'] = 'any'
resp.forms['save-custom-view']['visibility'] = 'owner'
resp.forms['save-custom-view']['is_default'] = True
resp = resp.forms['save-custom-view'].submit()
assert pub.custom_view_class.count() == 5
assert pub.custom_view_class.get(1).is_default is False # simple user - private
assert pub.custom_view_class.get(2).is_default is False # super user - private
assert pub.custom_view_class.get(3).is_default is True # super user - shared
assert pub.custom_view_class.get(4).is_default is True # role view
assert pub.custom_view_class.get(5).is_default is True # super user - private 2
# not possible to define more than one default shared view
resp = app.get('/backoffice/management/form-title/')
resp = resp.forms['listing-settings'].submit()
resp.forms['save-custom-view']['title'] = 'view 6'
resp.forms['save-custom-view']['visibility'] = 'any'
resp.forms['save-custom-view']['is_default'] = True
resp = resp.forms['save-custom-view'].submit()
assert pub.custom_view_class.count() == 6
assert pub.custom_view_class.get(1).is_default is False # simple user - private
assert pub.custom_view_class.get(2).is_default is False # super user - private
assert pub.custom_view_class.get(3).is_default is False # super user - shared
assert pub.custom_view_class.get(4).is_default is True # super user - private 2
assert pub.custom_view_class.get(5).is_default is True # super user - shared 2
assert pub.custom_view_class.get(4).is_default is True # role view
assert pub.custom_view_class.get(5).is_default is True # super user - private 2
assert pub.custom_view_class.get(6).is_default is True # super user - shared 2
# check most specific default custom view is used
resp = app.get('/backoffice/management/form-title/')
assert resp.pyquery('#appbar h2').text() == 'form title - view 5' # owner
pub.custom_view_class.remove_object(5)
resp = app.get('/backoffice/management/form-title/')
assert resp.pyquery('#appbar h2').text() == 'form title - view 4' # role
pub.custom_view_class.remove_object(4)
resp = app.get('/backoffice/management/form-title/')
assert resp.pyquery('#appbar h2').text() == 'form title - view 6' # any
def test_backoffice_default_custom_view(pub):

View File

@ -814,7 +814,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
self.get_custom_views(
[
Equal('is_default', True),
Contains('visibility', ['any', 'owner']),
Contains('visibility', ['any', 'role', 'owner']),
]
)
)
@ -826,6 +826,17 @@ class FormPage(Directory, TempfileDirectoryMixin):
self.default_view = view
return
# search for first default role custom view
user = get_request().user
if user:
user_role_ids = user.get_roles()

Les rôles d'un user sont toujours ordonnés de la même façon ? Si un user a plusieurs rôles, et qu'il existe une vue par défaut pour plus d'un de ses rôles, le résultat sera toujours le même ?

Les rôles d'un user sont toujours ordonnés de la même façon ? Si un user a plusieurs rôles, et qu'il existe une vue par défaut pour plus d'un de ses rôles, le résultat sera toujours le même ?

Il n'y a pas de problème par rapport à la liste des rôles, l'itération principale se fait sur la liste des vues, mais si jamais l'ordre de celle-ci changeait, on pourrait en effet voir une vue qui change, j'ai ajouté cette modification au patch :

-        for view in get_publisher().custom_view_class.select(clause=criterias):
+        for view in get_publisher().custom_view_class.select(clause=criterias, order_by='id'):

pour garantir qu'on récupère toujours les listes dans le même ordre.

Il n'y a pas de problème par rapport à la liste des rôles, l'itération principale se fait sur la liste des vues, mais si jamais l'ordre de celle-ci changeait, on pourrait en effet voir une vue qui change, j'ai ajouté cette modification au patch : ``` - for view in get_publisher().custom_view_class.select(clause=criterias): + for view in get_publisher().custom_view_class.select(clause=criterias, order_by='id'): ``` pour garantir qu'on récupère toujours les listes dans le même ordre.
for view in custom_views:
if view.visibility != 'role':
continue
if view.role_id in user_role_ids:
self.default_view = view
return
# default user custom view not found, search in 'any' custom views
for view in custom_views:
if view.visibility != 'any':
@ -858,7 +869,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
Equal('formdef_type', self.formdef.xml_root_node),
Equal('formdef_id', str(self.formdef.id)),
] + (criterias or [])
for view in get_publisher().custom_view_class.select(clause=criterias):
for view in get_publisher().custom_view_class.select(clause=criterias, order_by='id'):
if view.match(get_request().user, self.formdef):
yield view