from rest_framework.serializers import ModelSerializer, SerializerMethodField, IntegerField from apps.orgs.models import Organization, OrganizationMembership, OrganizationInvitation, Role, RoleMembership from apps.users.serializers import UserSerializer class OrganizationSerializer(ModelSerializer): owner = UserSerializer(read_only = True) member_count = SerializerMethodField() role_count = SerializerMethodField() class Meta: model = Organization fields = ['id', 'uuid', 'name', 'description', 'owner', 'created_at', 'updated_at', 'member_count', 'role_count'] read_only_fields = ['uuid', 'owner', 'created_at', 'updated_at'] def get_member_count(self, obj): return obj.memberships.count() def get_role_count(self, obj): return obj.roles.count() class OrganizationMembershipSerializer(ModelSerializer): user = UserSerializer(read_only = True) user_id = IntegerField(write_only = True, required = False) class Meta: model = OrganizationMembership fields = ['id', 'user', 'user_id', 'organization', 'created_at', 'updated_at'] read_only_fields = ['organization', 'created_at', 'updated_at'] def create(self, validated_data): user_id = validated_data.pop('user_id', None) if user_id: validated_data['user_id'] = user_id return super().create(validated_data) class OrganizationInvitationSerializer(ModelSerializer): created_by = UserSerializer(read_only = True) invite_url = SerializerMethodField() is_valid = SerializerMethodField() class Meta: model = OrganizationInvitation fields = ['id', 'token', 'organization', 'created_by', 'expires_at', 'max_uses', 'is_active', 'invite_url', 'is_valid', 'created_at', 'updated_at', 'uses'] read_only_fields = ['token', 'organization', 'created_by', 'max_uses', 'created_at', 'updated_at', 'uses'] def get_invite_url(self, obj): request = self.context.get('request') if request: return request.build_absolute_uri(f'/invite/{obj.token}') return f'/invite/{obj.token}' def get_is_valid(self, obj): return obj.is_valid() class RoleMembershipSerializer(ModelSerializer): user = UserSerializer(read_only = True) class Meta: model = RoleMembership fields = ['id', 'user', 'role', 'created_at'] read_only_fields = ['created_at'] class RoleSerializer(ModelSerializer): organization = OrganizationSerializer(read_only = True) member_count = SerializerMethodField() class Meta: model = Role fields = ['id', 'uuid', 'name', 'organization', 'member_count', 'description', 'created_at', 'updated_at'] read_only_fields = ['uuid', 'organization', 'created_at', 'updated_at'] def get_member_count(self, obj): return obj.memberships.count()