fix permisions
This commit is contained in:
@@ -1,14 +1,16 @@
|
|||||||
import typing
|
import typing
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
from django.db.models.query import QuerySet
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from apps.authentication.api.v1.serializers import serializer as auth_serializer
|
||||||
from apps.authorization.models import (
|
from apps.authorization.models import (
|
||||||
Role,
|
Role,
|
||||||
Permissions,
|
Permissions,
|
||||||
UserRelations,
|
UserRelations,
|
||||||
Page
|
Page
|
||||||
)
|
)
|
||||||
from apps.authentication.api.v1.serializers import serializer as auth_serializer
|
|
||||||
import itertools
|
|
||||||
|
|
||||||
|
|
||||||
class PageSerializer(serializers.ModelSerializer):
|
class PageSerializer(serializers.ModelSerializer):
|
||||||
@@ -55,19 +57,28 @@ class PermissionSerializer(serializers.ModelSerializer):
|
|||||||
return representation
|
return representation
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def permissions_structure_output(cls, permissions) -> typing.Any:
|
def permissions_structure_output(cls, permissions) -> typing.List[dict]:
|
||||||
""" set a structure for permissions """
|
""" set a structure for permissions """
|
||||||
|
|
||||||
structure = []
|
if isinstance(permissions, QuerySet):
|
||||||
pages_list = []
|
permissions = permissions.select_related('page')
|
||||||
for counter, permission in enumerate(permissions):
|
|
||||||
if permission.page.name not in pages_list:
|
grouped = defaultdict(set)
|
||||||
pages_list.append(permission.page.name)
|
|
||||||
structure.append({
|
for permission in permissions:
|
||||||
'page_name': permission.page.name,
|
if getattr(permission, 'is_active', True):
|
||||||
'page_access': itertools.chain(*list(
|
page_name = getattr(permission.page, 'name', None)
|
||||||
permissions.filter(page=permission.page).values_list('name')))
|
if page_name:
|
||||||
})
|
grouped[page_name].add(permission.name)
|
||||||
|
|
||||||
|
structure = [
|
||||||
|
{
|
||||||
|
'page_name': page,
|
||||||
|
'page_access': sorted(list(access))
|
||||||
|
}
|
||||||
|
for page, access in grouped.items()
|
||||||
|
]
|
||||||
|
|
||||||
return structure
|
return structure
|
||||||
|
|
||||||
|
|
||||||
@@ -139,9 +150,8 @@ class UserRelationSerializer(serializers.ModelSerializer):
|
|||||||
# set permissions by a default structure like:
|
# set permissions by a default structure like:
|
||||||
# 'page permission':[element permissions]
|
# 'page permission':[element permissions]
|
||||||
permissions = instance.permissions.filter(is_active=True)
|
permissions = instance.permissions.filter(is_active=True)
|
||||||
representation['permissions'] = (
|
representation['permissions'] = PermissionSerializer.permissions_structure_output(
|
||||||
PermissionSerializer().permissions_structure_output(permissions) +
|
list(permissions) + list(instance.role.permissions.all())
|
||||||
PermissionSerializer().permissions_structure_output(instance.role.permissions.all())
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return representation
|
return representation
|
||||||
|
|||||||
Reference in New Issue
Block a user