from rest_framework import serializers from apps.clients.models import Client from core.serializers.base import BaseModelSerializer class ClientSerializer(BaseModelSerializer): """ Serializer for retrieving and representing client details. """ class Meta: model = Client fields = BaseModelSerializer.Meta.fields + ( "workspace", "name", "notes", "thumbnail", ) read_only_fields = fields def to_representation(self, instance): data = super().to_representation(instance) request = self.context.get("request") if instance.thumbnail: thumbnail_url = instance.thumbnail.url data["thumbnail"] = request.build_absolute_uri(thumbnail_url) if request else thumbnail_url else: data["thumbnail"] = None return data def validate_thumbnail(value): if value is None: return value max_bytes = 2 * 1024 * 1024 if getattr(value, "size", 0) > max_bytes: raise serializers.ValidationError("Image size must be 2MB or less.") content_type = (getattr(value, "content_type", "") or "").lower() allowed_types = {"image/jpeg", "image/png", "image/webp"} if content_type and content_type not in allowed_types: raise serializers.ValidationError("Unsupported image type. Use JPG, PNG, or WebP.") return value class ClientCreateSerializer(serializers.Serializer): """ Serializer for handling input data during client creation. """ workspace_id = serializers.UUIDField() name = serializers.CharField(max_length=255) notes = serializers.CharField(allow_blank=True, required=False, default="") thumbnail = serializers.ImageField(required=False, allow_null=True) def validate_thumbnail(self, value): return validate_thumbnail(value) class ClientUpdateSerializer(serializers.Serializer): """ Serializer for handling input data during client updates. """ name = serializers.CharField(max_length=255, required=False) notes = serializers.CharField(allow_blank=True, required=False) thumbnail = serializers.ImageField(required=False, allow_null=True) clear_thumbnail = serializers.BooleanField(required=False, default=False) def validate_thumbnail(self, value): return validate_thumbnail(value)