from rest_framework import serializers from rest_framework.serializers import ModelSerializer from apps.domains.models import Domain, Organization, Dataset, OrganizationMembership, InviteToken, DomainMembership from apps.users.serializers import UserSerializer class OrganizationSerializer(serializers.ModelSerializer): owner = UserSerializer(read_only=True) member_count = serializers.SerializerMethodField() domain_count = serializers.SerializerMethodField() class Meta: model = Organization fields = ['id', 'uuid', 'name', 'description', 'owner', 'created_at', 'updated_at', 'member_count', 'domain_count'] read_only_fields = ['uuid', 'owner', 'created_at', 'updated_at'] def get_member_count(self, obj): return obj.memberships.count() def get_domain_count(self, obj): return obj.domains.count() class OrganizationMembershipSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) user_id = serializers.IntegerField(write_only=True, required=False) class Meta: model = OrganizationMembership fields = ['id', 'user', 'user_id', 'organization', 'role', 'created_at'] read_only_fields = ['organization', 'created_at'] class InviteTokenSerializer(serializers.ModelSerializer): created_by = UserSerializer(read_only=True) used_by = UserSerializer(read_only=True) invite_url = serializers.SerializerMethodField() is_valid = serializers.SerializerMethodField() class Meta: model = InviteToken fields = ['id', 'token', 'organization', 'created_by', 'expires_at', 'used_by', 'used_at', 'is_active', 'invite_url', 'is_valid', 'created_at'] read_only_fields = ['token', 'organization', 'created_by', 'used_by', 'used_at', 'created_at'] 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 DomainMembershipSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) domain_name = serializers.CharField(source='domain.name', read_only=True) class Meta: model = DomainMembership fields = ['id', 'user', 'domain', 'domain_name', 'created_at'] read_only_fields = ['created_at'] class DomainSerializer(ModelSerializer): organization = OrganizationSerializer(read_only=True) organization_id = serializers.IntegerField(write_only=True, required=False, allow_null=True) member_count = serializers.SerializerMethodField() class Meta: model = Domain fields = ['id', 'uuid', 'name', 'description', 'organization', 'organization_id', 'member_count'] read_only_fields = ['uuid'] def get_member_count(self, obj): return obj.memberships.count() class DatasetSerializer(ModelSerializer): class Meta: model = Dataset fields = ['id', 'domain', 'name', 'description', 'uuid', 'created_by', 'datafile', 'created_at', 'updated_at']