|
|
|
@ -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 |
|
|
|
|