diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 37414d0..d72e060 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -10,6 +10,17 @@ from ..models import ( from .category import LocalizedField +class AbsoluteImageField(serializers.ImageField): + def to_representation(self, value): + if not value: + return None + request = self.context.get("request") + url = value.url if hasattr(value, "url") else str(value) + if request: + return request.build_absolute_uri(url) + return url + + class AdminHadisCategorySerializer(serializers.ModelSerializer): sect_type = serializers.CharField(source='sect.sect_type', read_only=True) title = LocalizedField() @@ -79,10 +90,50 @@ class HadisCollectionsField(serializers.PrimaryKeyRelatedField): class AdminHadisCollectionSerializer(serializers.ModelSerializer): title = serializers.JSONField() summary = serializers.JSONField() + thumbnail = AbsoluteImageField(required=False, allow_null=True) + remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) class Meta: model = HadisCollection - fields = ["id", "title", "slug", "summary", "display_position", "status", "order", "pin_top"] + fields = [ + "id", + "title", + "slug", + "summary", + "status", + "pin_top", + "order", + "thumbnail", + "remove_thumbnail", + "created_at", + "updated_at", + ] + read_only_fields = ["id", "created_at", "updated_at"] + + def to_internal_value(self, data): + mutable_data = data.copy() if hasattr(data, "copy") else data + thumbnail = mutable_data.get("thumbnail") if hasattr(mutable_data, "get") else None + if thumbnail and hasattr(thumbnail, "read"): + compressed_bytes = maybe_compress_uploaded_file(thumbnail) + if compressed_bytes is not None: + mutable_data = mutable_data.copy() if hasattr(mutable_data, "copy") else mutable_data + mutable_data["thumbnail"] = SimpleUploadedFile( + name=getattr(thumbnail, "name", "image"), + content=compressed_bytes, + content_type=getattr(thumbnail, "content_type", None), + ) + return super().to_internal_value(mutable_data) + + def create(self, validated_data): + validated_data.pop("remove_thumbnail", False) + return super().create(validated_data) + + def update(self, instance, validated_data): + remove_thumbnail = validated_data.pop("remove_thumbnail", False) + if remove_thumbnail and instance.thumbnail: + instance.thumbnail.delete(save=False) + instance.thumbnail = None + return super().update(instance, validated_data) class AdminHadisDetailSerializer(serializers.ModelSerializer): @@ -224,18 +275,6 @@ class AdminHadisInterpretationSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "created_at", "updated_at"] - -class AbsoluteImageField(serializers.ImageField): - def to_representation(self, value): - if not value: - return None - request = self.context.get("request") - url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url - - class AbsoluteFileField(serializers.FileField): def to_representation(self, value): if not value: @@ -313,56 +352,6 @@ class AdminHadisCategoryArchiveSerializer(serializers.ModelSerializer): instance.xmind_file = None return super().update(instance, validated_data) - -class AdminHadisCollectionSerializer(serializers.ModelSerializer): - title = serializers.JSONField() - summary = serializers.JSONField() - thumbnail = AbsoluteImageField(required=False, allow_null=True) - remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) - - class Meta: - model = HadisCollection - fields = [ - "id", - "title", - "slug", - "summary", - "status", - "pin_top", - "order", - "thumbnail", - "remove_thumbnail", - "created_at", - "updated_at", - ] - read_only_fields = ["id", "created_at", "updated_at"] - - def to_internal_value(self, data): - mutable_data = data.copy() if hasattr(data, "copy") else data - thumbnail = mutable_data.get("thumbnail") if hasattr(mutable_data, "get") else None - if thumbnail and hasattr(thumbnail, "read"): - compressed_bytes = maybe_compress_uploaded_file(thumbnail) - if compressed_bytes is not None: - mutable_data = mutable_data.copy() if hasattr(mutable_data, "copy") else mutable_data - mutable_data["thumbnail"] = SimpleUploadedFile( - name=getattr(thumbnail, "name", "image"), - content=compressed_bytes, - content_type=getattr(thumbnail, "content_type", None), - ) - return super().to_internal_value(mutable_data) - - def create(self, validated_data): - validated_data.pop("remove_thumbnail", False) - return super().create(validated_data) - - def update(self, instance, validated_data): - remove_thumbnail = validated_data.pop("remove_thumbnail", False) - if remove_thumbnail and instance.thumbnail: - instance.thumbnail.delete(save=False) - instance.thumbnail = None - return super().update(instance, validated_data) - - class AdminTransmitterReliabilitySerializer(serializers.ModelSerializer): class Meta: model = TransmitterReliability