97 lines
3.3 KiB
Python
97 lines
3.3 KiB
Python
from rest_framework import serializers
|
|
from apps.authorization.models import (
|
|
Role,
|
|
Permissions,
|
|
UserRelations
|
|
)
|
|
from apps.authentication.api.v1.serializers import serializer as auth_serializer
|
|
from apps.authentication.models import Organization
|
|
|
|
|
|
class PermissionSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Permissions
|
|
fields = [
|
|
'id',
|
|
'name',
|
|
'description',
|
|
'category',
|
|
'page'
|
|
]
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
representation['name'] = 'Hello'
|
|
|
|
return representation
|
|
|
|
|
|
class RoleSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Role
|
|
fields = [
|
|
'id',
|
|
'role_name',
|
|
'description',
|
|
'type',
|
|
'permissions'
|
|
]
|
|
extra_kwargs = {
|
|
'permissions': {'required': False} # permissions not required for some roles
|
|
}
|
|
|
|
def to_representation(self, instance):
|
|
"""
|
|
using @to_representation for many_to_many permissions in response
|
|
"""
|
|
representation = super().to_representation(instance)
|
|
representation['type'] = auth_serializer.OrganizationTypeSerializer(instance.type).data
|
|
representation['permissions'] = PermissionSerializer(instance.permissions, many=True).data
|
|
return representation
|
|
|
|
|
|
class UserRelationSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = UserRelations
|
|
fields = [
|
|
'id',
|
|
'user',
|
|
'organization',
|
|
'role',
|
|
'permissions',
|
|
]
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
if isinstance(instance, UserRelations):
|
|
if instance.user:
|
|
representation['user'] = auth_serializer.UserSerializer(instance.user).data
|
|
if instance.organization:
|
|
representation['organization'] = auth_serializer.OrganizationSerializer(instance.organization).data
|
|
if instance.role:
|
|
representation['role'] = RoleSerializer(instance.role).data
|
|
if instance.permissions:
|
|
permissions = instance.permissions.all()
|
|
pages = {}
|
|
for permission in permissions:
|
|
if permission.page.name not in pages.keys():
|
|
pages.update({
|
|
f'{permission.page.name}': permission.page.permission_page.all().values('name')
|
|
})
|
|
representation['perms'] = pages
|
|
|
|
return representation
|
|
|
|
def update(self, instance, validated_data):
|
|
""" update user relation object """
|
|
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.save()
|
|
instance.permissions.clear()
|
|
instance.permissions.add(*(validated_data.get('permissions', instance.permissions)))
|
|
return instance
|