|
|
|
@ -245,6 +245,174 @@ class AdminHadisCollectionSerializer(serializers.ModelSerializer): |
|
|
|
return super().update(instance, validated_data) |
|
|
|
|
|
|
|
|
|
|
|
class AdminHadisReferenceSerializer(serializers.ModelSerializer): |
|
|
|
book_reference_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
edition_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
book_volume_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
images = serializers.SerializerMethodField(read_only=True) |
|
|
|
delete_image_ids = serializers.ListField( |
|
|
|
child=serializers.IntegerField(), |
|
|
|
required=False, |
|
|
|
write_only=True |
|
|
|
) |
|
|
|
|
|
|
|
class Meta: |
|
|
|
model = HadisReference |
|
|
|
fields = [ |
|
|
|
"id", |
|
|
|
"hadis", |
|
|
|
"book_reference", |
|
|
|
"book_reference_detail", |
|
|
|
"edition", |
|
|
|
"edition_detail", |
|
|
|
"book_volume", |
|
|
|
"book_volume_detail", |
|
|
|
"hadith_number", |
|
|
|
"volume", |
|
|
|
"pages", |
|
|
|
"address", |
|
|
|
"url", |
|
|
|
"images", |
|
|
|
"delete_image_ids", |
|
|
|
] |
|
|
|
|
|
|
|
def get_book_reference_detail(self, obj): |
|
|
|
if obj.book_reference: |
|
|
|
request = self.context.get("request") |
|
|
|
author = obj.book_reference.author |
|
|
|
first_ed = obj.book_reference.editions.first() if hasattr(obj.book_reference, "editions") else None |
|
|
|
pub = getattr(obj.book_reference, "publisher", None) |
|
|
|
if pub is None and first_ed: |
|
|
|
pub = first_ed.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
year = getattr(obj.book_reference, "year_of_publication", None) |
|
|
|
if not year and first_ed: |
|
|
|
year = first_ed.year_of_publication |
|
|
|
num_vols = getattr(obj.book_reference, "number_of_volumes", None) |
|
|
|
if num_vols is None and first_ed: |
|
|
|
num_vols = first_ed.number_of_volumes |
|
|
|
return { |
|
|
|
"id": obj.book_reference.id, |
|
|
|
"title": get_localized_text(obj.book_reference.title, request) if isinstance(obj.book_reference.title, list) else obj.book_reference.title, |
|
|
|
"slug": obj.book_reference.slug, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": year or "", |
|
|
|
"number_of_volumes": num_vols, |
|
|
|
"has_editions": getattr(obj.book_reference, "has_editions", False), |
|
|
|
"author": { |
|
|
|
"id": author.id, |
|
|
|
"name": get_localized_text(author.name, request) if isinstance(author.name, list) else author.name, |
|
|
|
"slug": author.slug |
|
|
|
} if author else None |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_edition_detail(self, obj): |
|
|
|
if obj.edition: |
|
|
|
request = self.context.get("request") |
|
|
|
pub = obj.edition.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
return { |
|
|
|
"id": obj.edition.id, |
|
|
|
"edition_number": obj.edition.edition_number, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": obj.edition.year_of_publication or "", |
|
|
|
"number_of_volumes": obj.edition.number_of_volumes, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_book_volume_detail(self, obj): |
|
|
|
if obj.book_volume: |
|
|
|
return { |
|
|
|
"id": obj.book_volume.id, |
|
|
|
"title": obj.book_volume.title, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_images(self, obj): |
|
|
|
request = self.context.get("request") |
|
|
|
return [ |
|
|
|
{ |
|
|
|
"id": img.id, |
|
|
|
"reference_id": obj.id, |
|
|
|
"hadis_id": obj.hadis_id, |
|
|
|
"thumbnail": absolute_https_url(img.thumbnail.url, request) if request and img.thumbnail else (img.thumbnail.url if img.thumbnail else None), |
|
|
|
"image": absolute_https_url(img.thumbnail.url, request) if request and img.thumbnail else (img.thumbnail.url if img.thumbnail else None), |
|
|
|
"priority": img.priority, |
|
|
|
} |
|
|
|
for img in obj.images.all().order_by("priority", "id") |
|
|
|
] |
|
|
|
|
|
|
|
def to_internal_value(self, data): |
|
|
|
import json |
|
|
|
data = safe_copy_data(data) |
|
|
|
book_ref = data.get("book_reference") |
|
|
|
if book_ref in ("", "none", "null"): |
|
|
|
data["book_reference"] = None |
|
|
|
|
|
|
|
edition = data.get("edition") |
|
|
|
if edition in ("", "none", "null"): |
|
|
|
data["edition"] = None |
|
|
|
|
|
|
|
book_vol = data.get("book_volume") |
|
|
|
if book_vol in ("", "none", "null"): |
|
|
|
data["book_volume"] = None |
|
|
|
|
|
|
|
delete_ids = data.get("delete_image_ids") |
|
|
|
if delete_ids: |
|
|
|
if isinstance(delete_ids, str): |
|
|
|
try: |
|
|
|
data["delete_image_ids"] = json.loads(delete_ids) |
|
|
|
except ValueError: |
|
|
|
data["delete_image_ids"] = [int(x) for x in delete_ids.split(",") if x.strip().isdigit()] |
|
|
|
elif isinstance(delete_ids, list): |
|
|
|
parsed = [] |
|
|
|
for x in delete_ids: |
|
|
|
if isinstance(x, str) and x.strip().isdigit(): |
|
|
|
parsed.append(int(x)) |
|
|
|
elif isinstance(x, int): |
|
|
|
parsed.append(x) |
|
|
|
data["delete_image_ids"] = parsed |
|
|
|
return super().to_internal_value(data) |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().create(validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def update(self, instance, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().update(instance, validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def _handle_images(self, instance, delete_image_ids): |
|
|
|
request = self.context.get("request") |
|
|
|
if delete_image_ids: |
|
|
|
instance.images.filter(id__in=delete_image_ids).delete() |
|
|
|
|
|
|
|
if request: |
|
|
|
new_images = ( |
|
|
|
request.FILES.getlist("uploaded_images") |
|
|
|
or request.FILES.getlist("uploaded_images[]") |
|
|
|
or request.FILES.getlist("images") |
|
|
|
or request.FILES.getlist("images[]") |
|
|
|
) |
|
|
|
single_img = request.FILES.get("image") or request.FILES.get("thumbnail") |
|
|
|
if single_img and not new_images: |
|
|
|
new_images = [single_img] |
|
|
|
|
|
|
|
last_img = instance.images.order_by("-priority").first() |
|
|
|
current_priority = (last_img.priority + 1) if last_img else 1 |
|
|
|
|
|
|
|
for img in new_images: |
|
|
|
ReferenceImage.objects.create(reference=instance, thumbnail=img, priority=current_priority) |
|
|
|
current_priority += 1 |
|
|
|
|
|
|
|
|
|
|
|
class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
category_detail = AdminHadisCategorySerializer(source="category", read_only=True) |
|
|
|
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|
|
|
@ -279,6 +447,36 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
) |
|
|
|
edition_id = serializers.PrimaryKeyRelatedField( |
|
|
|
queryset=BookEdition.objects.all(), |
|
|
|
required=False, |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
) |
|
|
|
book_volume_id = serializers.PrimaryKeyRelatedField( |
|
|
|
queryset=BookVolume.objects.all(), |
|
|
|
required=False, |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
) |
|
|
|
volume = serializers.CharField( |
|
|
|
required=False, |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
allow_blank=True, |
|
|
|
) |
|
|
|
pages = serializers.CharField( |
|
|
|
required=False, |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
allow_blank=True, |
|
|
|
) |
|
|
|
hadith_number = serializers.CharField( |
|
|
|
required=False, |
|
|
|
write_only=True, |
|
|
|
allow_null=True, |
|
|
|
allow_blank=True, |
|
|
|
) |
|
|
|
|
|
|
|
bookmark_count = serializers.SerializerMethodField() |
|
|
|
|
|
|
|
@ -325,6 +523,11 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
"collections", |
|
|
|
"collections_detail", |
|
|
|
"book_reference_id", |
|
|
|
"edition_id", |
|
|
|
"book_volume_id", |
|
|
|
"volume", |
|
|
|
"pages", |
|
|
|
"hadith_number", |
|
|
|
"share_link", |
|
|
|
"explanation", |
|
|
|
"bookmark_count", |
|
|
|
@ -336,22 +539,75 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
def to_representation(self, instance): |
|
|
|
ret = super().to_representation(instance) |
|
|
|
request = self.context.get("request") |
|
|
|
refs = list(instance.references.all()) |
|
|
|
ref = refs[0] if refs else None |
|
|
|
|
|
|
|
ret["book_reference"] = ref.book_reference_id if ref else None |
|
|
|
ret["edition"] = ref.edition_id if ref else None |
|
|
|
ret["book_volume"] = ref.book_volume_id if ref else None |
|
|
|
ret["volume"] = ref.volume if ref else None |
|
|
|
ret["pages"] = ref.pages if ref else None |
|
|
|
ret["hadith_number"] = ref.hadith_number if ref else None |
|
|
|
|
|
|
|
if ref and ref.book_reference: |
|
|
|
author = ref.book_reference.author |
|
|
|
first_ed = ref.book_reference.editions.first() if hasattr(ref.book_reference, "editions") else None |
|
|
|
pub = getattr(ref.book_reference, "publisher", None) |
|
|
|
if pub is None and first_ed: |
|
|
|
pub = first_ed.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
year = getattr(ref.book_reference, "year_of_publication", None) |
|
|
|
if not year and first_ed: |
|
|
|
year = first_ed.year_of_publication |
|
|
|
num_vols = getattr(ref.book_reference, "number_of_volumes", None) |
|
|
|
if num_vols is None and first_ed: |
|
|
|
num_vols = first_ed.number_of_volumes |
|
|
|
ret["book_reference_detail"] = { |
|
|
|
"id": ref.book_reference.id, |
|
|
|
"title": ref.book_reference.title, |
|
|
|
"title": get_localized_text(ref.book_reference.title, request) if isinstance(ref.book_reference.title, list) else ref.book_reference.title, |
|
|
|
"slug": ref.book_reference.slug, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": year or "", |
|
|
|
"number_of_volumes": num_vols, |
|
|
|
"has_editions": getattr(ref.book_reference, "has_editions", False), |
|
|
|
"author": { |
|
|
|
"id": author.id, |
|
|
|
"name": get_localized_text(author.name, request) if isinstance(author.name, list) else author.name, |
|
|
|
"slug": author.slug |
|
|
|
} if author else None |
|
|
|
} |
|
|
|
else: |
|
|
|
ret["book_reference_detail"] = None |
|
|
|
|
|
|
|
if ref and ref.edition: |
|
|
|
ed = ref.edition |
|
|
|
pub = ed.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
ret["edition_detail"] = { |
|
|
|
"id": ed.id, |
|
|
|
"edition_number": ed.edition_number, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": ed.year_of_publication or "", |
|
|
|
"number_of_volumes": ed.number_of_volumes, |
|
|
|
} |
|
|
|
else: |
|
|
|
ret["edition_detail"] = None |
|
|
|
|
|
|
|
if ref and ref.book_volume: |
|
|
|
ret["book_volume_detail"] = { |
|
|
|
"id": ref.book_volume.id, |
|
|
|
"title": ref.book_volume.title, |
|
|
|
} |
|
|
|
else: |
|
|
|
ret["book_volume_detail"] = None |
|
|
|
|
|
|
|
ref_images = [] |
|
|
|
for r in refs: |
|
|
|
for img in r.images.all().order_by("priority", "id"): |
|
|
|
url = absolute_https_url(img.thumbnail.url, self.context.get("request")) if img.thumbnail else None |
|
|
|
url = absolute_https_url(img.thumbnail.url, request) if img.thumbnail else None |
|
|
|
ref_images.append({ |
|
|
|
"id": img.id, |
|
|
|
"reference_id": r.id, |
|
|
|
@ -361,6 +617,7 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
"priority": img.priority, |
|
|
|
}) |
|
|
|
ret["reference_images"] = ref_images |
|
|
|
ret["references"] = AdminHadisReferenceSerializer(instance.references.all().order_by("id"), many=True, context=self.context).data |
|
|
|
return ret |
|
|
|
|
|
|
|
def get_bookmark_count(self, obj): |
|
|
|
@ -380,6 +637,11 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
book_reference = validated_data.pop("book_reference_id", None) |
|
|
|
edition = validated_data.pop("edition_id", None) |
|
|
|
book_volume = validated_data.pop("book_volume_id", None) |
|
|
|
volume = validated_data.pop("volume", None) |
|
|
|
pages = validated_data.pop("pages", None) |
|
|
|
hadith_number = validated_data.pop("hadith_number", None) |
|
|
|
tags = validated_data.pop("tags", []) |
|
|
|
collections = validated_data.pop("collection_items", []) |
|
|
|
hadis = super().create(validated_data) |
|
|
|
@ -388,13 +650,32 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
if collections: |
|
|
|
for idx, col in enumerate(collections): |
|
|
|
HadisInCollection.objects.create(hadis=hadis, collection=col, order=idx) |
|
|
|
if book_reference: |
|
|
|
HadisReference.objects.create(hadis=hadis, book_reference=book_reference) |
|
|
|
if book_reference or edition or book_volume or volume or pages or hadith_number: |
|
|
|
HadisReference.objects.create( |
|
|
|
hadis=hadis, |
|
|
|
book_reference=book_reference, |
|
|
|
edition=edition, |
|
|
|
book_volume=book_volume, |
|
|
|
volume=volume or "", |
|
|
|
pages=pages or "", |
|
|
|
hadith_number=hadith_number or "" |
|
|
|
) |
|
|
|
return hadis |
|
|
|
|
|
|
|
def update(self, instance, validated_data): |
|
|
|
book_reference_provided = "book_reference_id" in validated_data |
|
|
|
book_reference = validated_data.pop("book_reference_id", None) |
|
|
|
edition_provided = "edition_id" in validated_data |
|
|
|
edition = validated_data.pop("edition_id", None) |
|
|
|
book_volume_provided = "book_volume_id" in validated_data |
|
|
|
book_volume = validated_data.pop("book_volume_id", None) |
|
|
|
volume_provided = "volume" in validated_data |
|
|
|
volume = validated_data.pop("volume", None) |
|
|
|
pages_provided = "pages" in validated_data |
|
|
|
pages = validated_data.pop("pages", None) |
|
|
|
hadith_number_provided = "hadith_number" in validated_data |
|
|
|
hadith_number = validated_data.pop("hadith_number", None) |
|
|
|
|
|
|
|
tags = validated_data.pop("tags", None) |
|
|
|
collections = validated_data.pop("collection_items", None) |
|
|
|
hadis = super().update(instance, validated_data) |
|
|
|
@ -404,13 +685,30 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
instance.collection_items.all().delete() |
|
|
|
for idx, col in enumerate(collections): |
|
|
|
HadisInCollection.objects.create(hadis=hadis, collection=col, order=idx) |
|
|
|
if book_reference_provided: |
|
|
|
|
|
|
|
any_ref_provided = ( |
|
|
|
book_reference_provided or edition_provided or book_volume_provided or |
|
|
|
volume_provided or pages_provided or hadith_number_provided |
|
|
|
) |
|
|
|
if any_ref_provided: |
|
|
|
ref = instance.references.first() |
|
|
|
if not ref: |
|
|
|
if book_reference or edition or book_volume or volume or pages or hadith_number: |
|
|
|
ref = HadisReference.objects.create(hadis=hadis) |
|
|
|
if ref: |
|
|
|
ref.book_reference = book_reference |
|
|
|
if book_reference_provided: |
|
|
|
ref.book_reference = book_reference |
|
|
|
if edition_provided: |
|
|
|
ref.edition = edition |
|
|
|
if book_volume_provided: |
|
|
|
ref.book_volume = book_volume |
|
|
|
if volume_provided: |
|
|
|
ref.volume = volume or "" |
|
|
|
if pages_provided: |
|
|
|
ref.pages = pages or "" |
|
|
|
if hadith_number_provided: |
|
|
|
ref.hadith_number = hadith_number or "" |
|
|
|
ref.save() |
|
|
|
elif book_reference: |
|
|
|
HadisReference.objects.create(hadis=hadis, book_reference=book_reference) |
|
|
|
return hadis |
|
|
|
|
|
|
|
|
|
|
|
@ -778,8 +1076,315 @@ class AdminHadisCorrectionSerializer(serializers.ModelSerializer): |
|
|
|
return instance |
|
|
|
|
|
|
|
|
|
|
|
class AdminInterpretationReferenceSerializer(serializers.ModelSerializer): |
|
|
|
book_reference_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
edition_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
book_volume_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
images = serializers.SerializerMethodField(read_only=True) |
|
|
|
delete_image_ids = serializers.ListField( |
|
|
|
child=serializers.IntegerField(), |
|
|
|
required=False, |
|
|
|
write_only=True |
|
|
|
) |
|
|
|
|
|
|
|
class Meta: |
|
|
|
model = InterpretationReference |
|
|
|
fields = [ |
|
|
|
"id", |
|
|
|
"interpretation", |
|
|
|
"book_reference", |
|
|
|
"book_reference_detail", |
|
|
|
"edition", |
|
|
|
"edition_detail", |
|
|
|
"book_volume", |
|
|
|
"book_volume_detail", |
|
|
|
"hadith_number", |
|
|
|
"volume", |
|
|
|
"pages", |
|
|
|
"address", |
|
|
|
"url", |
|
|
|
"images", |
|
|
|
"delete_image_ids", |
|
|
|
] |
|
|
|
|
|
|
|
def get_book_reference_detail(self, obj): |
|
|
|
if obj.book_reference: |
|
|
|
request = self.context.get("request") |
|
|
|
author = obj.book_reference.author |
|
|
|
first_ed = obj.book_reference.editions.first() if hasattr(obj.book_reference, "editions") else None |
|
|
|
pub = getattr(obj.book_reference, "publisher", None) |
|
|
|
if pub is None and first_ed: |
|
|
|
pub = first_ed.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
year = getattr(obj.book_reference, "year_of_publication", None) |
|
|
|
if not year and first_ed: |
|
|
|
year = first_ed.year_of_publication |
|
|
|
num_vols = getattr(obj.book_reference, "number_of_volumes", None) |
|
|
|
if num_vols is None and first_ed: |
|
|
|
num_vols = first_ed.number_of_volumes |
|
|
|
return { |
|
|
|
"id": obj.book_reference.id, |
|
|
|
"title": get_localized_text(obj.book_reference.title, request), |
|
|
|
"slug": obj.book_reference.slug, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": year or "", |
|
|
|
"number_of_volumes": num_vols, |
|
|
|
"has_editions": getattr(obj.book_reference, "has_editions", False), |
|
|
|
"author": { |
|
|
|
"id": author.id, |
|
|
|
"name": get_localized_text(author.name, request), |
|
|
|
"slug": author.slug |
|
|
|
} if author else None |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_edition_detail(self, obj): |
|
|
|
if obj.edition: |
|
|
|
request = self.context.get("request") |
|
|
|
pub = obj.edition.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
return { |
|
|
|
"id": obj.edition.id, |
|
|
|
"edition_number": obj.edition.edition_number, |
|
|
|
"publisher": pub, |
|
|
|
"year_of_publication": obj.edition.year_of_publication, |
|
|
|
"number_of_volumes": obj.edition.number_of_volumes, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_book_volume_detail(self, obj): |
|
|
|
if obj.book_volume: |
|
|
|
return { |
|
|
|
"id": obj.book_volume.id, |
|
|
|
"title": obj.book_volume.title, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_images(self, obj): |
|
|
|
request = self.context.get("request") |
|
|
|
return [ |
|
|
|
{ |
|
|
|
"id": img.id, |
|
|
|
"image": absolute_https_url(img.image.url, request) if request and img.image else (img.image.url if img.image else None), |
|
|
|
"thumbnail": absolute_https_url(img.image.url, request) if request and img.image else (img.image.url if img.image else None), |
|
|
|
"priority": img.priority, |
|
|
|
} |
|
|
|
for img in obj.images.all() |
|
|
|
] |
|
|
|
|
|
|
|
def to_internal_value(self, data): |
|
|
|
import json |
|
|
|
data = safe_copy_data(data) |
|
|
|
book_ref = data.get("book_reference") |
|
|
|
if book_ref in ("", "none", "null"): |
|
|
|
data["book_reference"] = None |
|
|
|
|
|
|
|
edition = data.get("edition") |
|
|
|
if edition in ("", "none", "null"): |
|
|
|
data["edition"] = None |
|
|
|
|
|
|
|
book_vol = data.get("book_volume") |
|
|
|
if book_vol in ("", "none", "null"): |
|
|
|
data["book_volume"] = None |
|
|
|
|
|
|
|
delete_ids = data.get("delete_image_ids") |
|
|
|
if delete_ids: |
|
|
|
if isinstance(delete_ids, str): |
|
|
|
try: |
|
|
|
data["delete_image_ids"] = json.loads(delete_ids) |
|
|
|
except ValueError: |
|
|
|
data["delete_image_ids"] = [int(x) for x in delete_ids.split(",") if x.strip().isdigit()] |
|
|
|
elif isinstance(delete_ids, list): |
|
|
|
parsed = [] |
|
|
|
for x in delete_ids: |
|
|
|
if isinstance(x, str) and x.strip().isdigit(): |
|
|
|
parsed.append(int(x)) |
|
|
|
elif isinstance(x, int): |
|
|
|
parsed.append(x) |
|
|
|
data["delete_image_ids"] = parsed |
|
|
|
return super().to_internal_value(data) |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().create(validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def update(self, instance, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().update(instance, validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def _handle_images(self, instance, delete_image_ids): |
|
|
|
request = self.context.get("request") |
|
|
|
if delete_image_ids: |
|
|
|
instance.images.filter(id__in=delete_image_ids).delete() |
|
|
|
|
|
|
|
if request: |
|
|
|
new_images = request.FILES.getlist("uploaded_images") or request.FILES.getlist("uploaded_images[]") or request.FILES.getlist("images") |
|
|
|
for img in new_images: |
|
|
|
InterpretationReferenceImage.objects.create(reference=instance, image=img) |
|
|
|
|
|
|
|
|
|
|
|
class AdminOriginalTextReferenceSerializer(serializers.ModelSerializer): |
|
|
|
book_reference_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
edition_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
book_volume_detail = serializers.SerializerMethodField(read_only=True) |
|
|
|
images = serializers.SerializerMethodField(read_only=True) |
|
|
|
delete_image_ids = serializers.ListField( |
|
|
|
child=serializers.IntegerField(), |
|
|
|
required=False, |
|
|
|
write_only=True |
|
|
|
) |
|
|
|
|
|
|
|
class Meta: |
|
|
|
model = OriginalTextReference |
|
|
|
fields = [ |
|
|
|
"id", |
|
|
|
"original_text", |
|
|
|
"book_reference", |
|
|
|
"book_reference_detail", |
|
|
|
"edition", |
|
|
|
"edition_detail", |
|
|
|
"book_volume", |
|
|
|
"book_volume_detail", |
|
|
|
"hadith_number", |
|
|
|
"volume", |
|
|
|
"pages", |
|
|
|
"address", |
|
|
|
"url", |
|
|
|
"images", |
|
|
|
"delete_image_ids", |
|
|
|
] |
|
|
|
|
|
|
|
def get_book_reference_detail(self, obj): |
|
|
|
if obj.book_reference: |
|
|
|
request = self.context.get("request") |
|
|
|
author = obj.book_reference.author |
|
|
|
first_ed = obj.book_reference.editions.first() if hasattr(obj.book_reference, "editions") else None |
|
|
|
pub = getattr(obj.book_reference, "publisher", None) |
|
|
|
if pub is None and first_ed: |
|
|
|
pub = first_ed.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
year = getattr(obj.book_reference, "year_of_publication", None) |
|
|
|
if not year and first_ed: |
|
|
|
year = first_ed.year_of_publication |
|
|
|
num_vols = getattr(obj.book_reference, "number_of_volumes", None) |
|
|
|
if num_vols is None and first_ed: |
|
|
|
num_vols = first_ed.number_of_volumes |
|
|
|
return { |
|
|
|
"id": obj.book_reference.id, |
|
|
|
"title": get_localized_text(obj.book_reference.title, request), |
|
|
|
"slug": obj.book_reference.slug, |
|
|
|
"publisher": pub or "", |
|
|
|
"year_of_publication": year or "", |
|
|
|
"number_of_volumes": num_vols, |
|
|
|
"has_editions": getattr(obj.book_reference, "has_editions", False), |
|
|
|
"author": { |
|
|
|
"id": author.id, |
|
|
|
"name": get_localized_text(author.name, request), |
|
|
|
"slug": author.slug |
|
|
|
} if author else None |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_edition_detail(self, obj): |
|
|
|
if obj.edition: |
|
|
|
request = self.context.get("request") |
|
|
|
pub = obj.edition.publisher |
|
|
|
if isinstance(pub, list): |
|
|
|
pub = get_localized_text(pub, request) |
|
|
|
return { |
|
|
|
"id": obj.edition.id, |
|
|
|
"edition_number": obj.edition.edition_number, |
|
|
|
"publisher": pub, |
|
|
|
"year_of_publication": obj.edition.year_of_publication, |
|
|
|
"number_of_volumes": obj.edition.number_of_volumes, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_book_volume_detail(self, obj): |
|
|
|
if obj.book_volume: |
|
|
|
return { |
|
|
|
"id": obj.book_volume.id, |
|
|
|
"title": obj.book_volume.title, |
|
|
|
} |
|
|
|
return None |
|
|
|
|
|
|
|
def get_images(self, obj): |
|
|
|
request = self.context.get("request") |
|
|
|
return [ |
|
|
|
{ |
|
|
|
"id": img.id, |
|
|
|
"image": absolute_https_url(img.image.url, request) if request and img.image else (img.image.url if img.image else None), |
|
|
|
"thumbnail": absolute_https_url(img.image.url, request) if request and img.image else (img.image.url if img.image else None), |
|
|
|
"priority": img.priority, |
|
|
|
} |
|
|
|
for img in obj.images.all() |
|
|
|
] |
|
|
|
|
|
|
|
def to_internal_value(self, data): |
|
|
|
import json |
|
|
|
data = safe_copy_data(data) |
|
|
|
book_ref = data.get("book_reference") |
|
|
|
if book_ref in ("", "none", "null"): |
|
|
|
data["book_reference"] = None |
|
|
|
|
|
|
|
edition = data.get("edition") |
|
|
|
if edition in ("", "none", "null"): |
|
|
|
data["edition"] = None |
|
|
|
|
|
|
|
book_vol = data.get("book_volume") |
|
|
|
if book_vol in ("", "none", "null"): |
|
|
|
data["book_volume"] = None |
|
|
|
|
|
|
|
delete_ids = data.get("delete_image_ids") |
|
|
|
if delete_ids: |
|
|
|
if isinstance(delete_ids, str): |
|
|
|
try: |
|
|
|
data["delete_image_ids"] = json.loads(delete_ids) |
|
|
|
except ValueError: |
|
|
|
data["delete_image_ids"] = [int(x) for x in delete_ids.split(",") if x.strip().isdigit()] |
|
|
|
elif isinstance(delete_ids, list): |
|
|
|
parsed = [] |
|
|
|
for x in delete_ids: |
|
|
|
if isinstance(x, str) and x.strip().isdigit(): |
|
|
|
parsed.append(int(x)) |
|
|
|
elif isinstance(x, int): |
|
|
|
parsed.append(x) |
|
|
|
data["delete_image_ids"] = parsed |
|
|
|
return super().to_internal_value(data) |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().create(validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def update(self, instance, validated_data): |
|
|
|
delete_image_ids = validated_data.pop("delete_image_ids", []) |
|
|
|
instance = super().update(instance, validated_data) |
|
|
|
self._handle_images(instance, delete_image_ids) |
|
|
|
return instance |
|
|
|
|
|
|
|
def _handle_images(self, instance, delete_image_ids): |
|
|
|
request = self.context.get("request") |
|
|
|
if delete_image_ids: |
|
|
|
instance.images.filter(id__in=delete_image_ids).delete() |
|
|
|
|
|
|
|
if request: |
|
|
|
new_images = request.FILES.getlist("uploaded_images") or request.FILES.getlist("uploaded_images[]") or request.FILES.getlist("images") |
|
|
|
for img in new_images: |
|
|
|
OriginalTextReferenceImage.objects.create(reference=instance, image=img) |
|
|
|
|
|
|
|
|
|
|
|
class AdminHadisInterpretationSerializer(serializers.ModelSerializer): |
|
|
|
category_detail = AdminHadisCategoryBriefSerializer(source="category", read_only=True) |
|
|
|
references = AdminInterpretationReferenceSerializer(many=True, read_only=True) |
|
|
|
|
|
|
|
# Writable relation fields |
|
|
|
book_reference_id = serializers.PrimaryKeyRelatedField( |
|
|
|
@ -813,10 +1418,11 @@ class AdminHadisInterpretationSerializer(serializers.ModelSerializer): |
|
|
|
"book_reference_id", |
|
|
|
"address", |
|
|
|
"delete_image_ids", |
|
|
|
"references", |
|
|
|
"created_at", |
|
|
|
"updated_at", |
|
|
|
] |
|
|
|
read_only_fields = ["id", "created_at", "updated_at"] |
|
|
|
read_only_fields = ["id", "references", "created_at", "updated_at"] |
|
|
|
|
|
|
|
def to_internal_value(self, data): |
|
|
|
import json |
|
|
|
@ -870,6 +1476,7 @@ class AdminHadisInterpretationSerializer(serializers.ModelSerializer): |
|
|
|
} |
|
|
|
for img in images |
|
|
|
] |
|
|
|
ret["references"] = AdminInterpretationReferenceSerializer(instance.references.all(), many=True, context=self.context).data |
|
|
|
return ret |
|
|
|
|
|
|
|
def create(self, validated_data): |
|
|
|
@ -2038,6 +2645,7 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer): |
|
|
|
title = serializers.JSONField(required=False, default=list) |
|
|
|
text = serializers.JSONField(required=False, default=list) |
|
|
|
translation = serializers.JSONField(required=False, default=list) |
|
|
|
references = AdminOriginalTextReferenceSerializer(many=True, read_only=True) |
|
|
|
|
|
|
|
# Writable relation fields |
|
|
|
book_reference_id = serializers.PrimaryKeyRelatedField( |
|
|
|
@ -2069,6 +2677,7 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer): |
|
|
|
"share_link", |
|
|
|
"embedded_in", |
|
|
|
"order", |
|
|
|
"references", |
|
|
|
"book_reference_id", |
|
|
|
"address", |
|
|
|
"delete_image_ids", |
|
|
|
@ -2104,6 +2713,12 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer): |
|
|
|
def to_representation(self, instance): |
|
|
|
import json |
|
|
|
ret = super().to_representation(instance) |
|
|
|
ret["references"] = AdminOriginalTextReferenceSerializer( |
|
|
|
instance.references.all().order_by("id"), |
|
|
|
many=True, |
|
|
|
context=self.context |
|
|
|
).data |
|
|
|
|
|
|
|
ref = instance.references.first() |
|
|
|
ret["book_reference"] = ref.book_reference_id if ref else None |
|
|
|
|
|
|
|
|