working on manual logout: block access token

This commit is contained in:
2025-06-02 12:18:13 +03:30
parent 8a2b2ce905
commit 0e4076e876
11 changed files with 152 additions and 42 deletions

View File

@@ -1,14 +1,26 @@
import typing
from rest_framework import serializers
from apps.authorization.models import (
Role,
Permissions,
UserRelations
UserRelations,
Page
)
from apps.authentication.api.v1.serializers import serializer as auth_serializer
from apps.authentication.models import Organization
import itertools
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = [
'name',
'code'
]
class PermissionSerializer(serializers.ModelSerializer):
class Meta:
model = Permissions
@@ -26,6 +38,18 @@ class PermissionSerializer(serializers.ModelSerializer):
return representation
@classmethod
def permissions_structure_output(cls, permissions: list) -> typing.Any:
""" set a structure for permissions """
structure = {}
for permission in permissions:
if permission.page.name not in structure.keys():
structure.update(
{f'{permission.page.name}': itertools.chain(*list(
permission.page.permission_page.all().values_list('name')))
})
return structure
class RoleSerializer(serializers.ModelSerializer):
class Meta:
@@ -49,15 +73,7 @@ class RoleSerializer(serializers.ModelSerializer):
representation['type'] = auth_serializer.OrganizationTypeSerializer(instance.type).data
if instance.permissions: # noqa
permissions = instance.permissions.all()
pages = {}
for permission in permissions:
if permission.page.name not in pages.keys():
pages.update({
f'{permission.page.name}': itertools.chain(*list(
(permission.page.permission_page.all().values_list('name'))
))
})
representation['permissions'] = pages
representation['permissions'] = PermissionSerializer().permissions_structure_output(permissions)
return representation
@@ -73,6 +89,7 @@ class UserRelationSerializer(serializers.ModelSerializer):
]
def to_representation(self, instance):
""" custom output for serializer """
representation = super().to_representation(instance)
if isinstance(instance, UserRelations):
if instance.user:
@@ -81,18 +98,11 @@ class UserRelationSerializer(serializers.ModelSerializer):
representation['organization'] = auth_serializer.OrganizationSerializer(instance.organization).data
if instance.role:
representation['role'] = RoleSerializer(instance.role).data
if instance.permissions:
if instance.permissions: # noqa
# set permissions by a default structure like:
# 'page permission':[element permissions]
permissions = instance.permissions.all()
pages = {}
for permission in permissions:
if permission.page.name not in pages.keys():
pages.update({
f'{permission.page.name}': itertools.chain(*list(
(permission.page.permission_page.all().values_list('name'))
))
})
representation['permissions'] = pages
representation['permissions'] = PermissionSerializer().permissions_structure_output(permissions)
return representation
def update(self, instance, validated_data):
@@ -100,9 +110,9 @@ class UserRelationSerializer(serializers.ModelSerializer):
if validated_data.get('role'):
instance.role = Role.objects.get(id=validated_data.get('role', instance.role))
if validated_data.get('organization'):
instance.organization = Organization.objects.get(id=validated_data.get(
'organization', instance.organization
))
instance.organization = Organization.objects.get(
id=validated_data.get('organization', instance.organization)
)
instance.save()
instance.permissions.clear()
instance.permissions.add(*(validated_data.get('permissions', instance.permissions)))