56 lines
1.8 KiB
Python
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"]
|