diff --git a/mayan/apps/permissions/models.py b/mayan/apps/permissions/models.py index 4911018b6b..186442a6c1 100644 --- a/mayan/apps/permissions/models.py +++ b/mayan/apps/permissions/models.py @@ -27,20 +27,19 @@ class StoredPermission(models.Model): verbose_name = _('Permission') verbose_name_plural = _('Permissions') - def __init__(self, *args, **kwargs): - super(StoredPermission, self).__init__(*args, **kwargs) - try: - self.volatile_permission = Permission.get( - pk='{}.{}'.format(self.namespace, self.name), - proxy_only=True - ) - except KeyError: - # Must be a deprecated permission in the database that is no - # longer used in the current code - pass - def __str__(self): - return force_text(getattr(self, 'volatile_permission', self.name)) + try: + return force_text(self.get_volatile_permission()) + except KeyError: + return self.name + + def get_volatile_permission_id(self): + return '{}.{}'.format(self.namespace, self.name) + + def get_volatile_permission(self): + return Permission.get( + pk=self.get_volatile_permission_id(), proxy_only=True + ) def natural_key(self): return (self.namespace, self.name) diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index ad70d28630..fa259f6d17 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -136,7 +136,16 @@ class SetupRolePermissionsView(AssignRemoveView): Permission.refresh() results = [] - for namespace, permissions in itertools.groupby(StoredPermission.objects.exclude(id__in=self.get_object().permissions.values_list('pk', flat=True)), lambda entry: entry.namespace): + available_permission = sorted( + StoredPermission.objects.exclude( + id__in=self.get_object().permissions.values_list('pk', flat=True) + ), key=lambda x: ( + x.get_volatile_permission().namespace.label, + x.get_volatile_permission().label + ) + ) + + for namespace, permissions in itertools.groupby(available_permission, lambda entry: entry.namespace): permission_options = [ (force_text(permission.pk), permission) for permission in permissions ] @@ -148,7 +157,15 @@ class SetupRolePermissionsView(AssignRemoveView): def right_list(self): results = [] - for namespace, permissions in itertools.groupby(self.get_object().permissions.all(), lambda entry: entry.namespace): + + granted_permissions = sorted( + self.get_object().permissions.all(), key=lambda x: ( + x.get_volatile_permission().namespace.label, + x.get_volatile_permission().label + ) + ) + + for namespace, permissions in itertools.groupby(granted_permissions, lambda entry: entry.namespace): permission_options = [ (force_text(permission.pk), permission) for permission in permissions ]