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"]