fix permisions

This commit is contained in:
2025-10-25 12:09:00 +03:30
parent e82e67cc4d
commit 6a146c5fb4

View File

@@ -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