Files
cetana-backend/apps/accounts/serializers.py
T
2026-09-24 12:32:59 +03:30

56 lines
1.8 KiB
Python

from rest_framework import serializers
from apps.accounts.models import Customer, User
from apps.rbac.models import Role
class RoleBriefSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ["id", "name", "slug"]
class UserSerializer(serializers.ModelSerializer):
roles = serializers.SerializerMethodField()
permissions = serializers.SerializerMethodField()
role_ids = serializers.ListField(child=serializers.UUIDField(), write_only=True, required=False)
class Meta:
model = User
fields = [
"id", "username", "email", "first_name", "last_name", "phone",
"is_active", "is_superuser", "roles", "permissions", "role_ids",
]
read_only_fields = ["is_superuser"]
def get_roles(self, obj):
return RoleBriefSerializer(
[ur.role for ur in obj.user_roles.select_related("role").all()], many=True
).data
def get_permissions(self, obj):
if obj.is_superuser:
return ["*"]
from apps.rbac.models import Permission
return list(
Permission.objects.filter(roles__user_roles__user=obj).values_list("code", flat=True)
)
def create(self, validated_data):
# role_ids is a write-only helper; roles are synced by the viewset.
validated_data.pop("role_ids", None)
return super().create(validated_data)
def update(self, instance, validated_data):
validated_data.pop("role_ids", None)
return super().update(instance, validated_data)
class CustomerSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = Customer
fields = ["id", "user", "customer_code", "company_name", "category", "odoo_partner_id"]