|
|
@ -1,7 +1,7 @@ |
|
|
from rest_framework import serializers |
|
|
from rest_framework import serializers |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
from django.utils.translation import gettext_lazy as _ |
|
|
from django.utils.translation import gettext_lazy as _ |
|
|
from django.db.models import Exists, OuterRef |
|
|
|
|
|
|
|
|
from django.db.models import Exists, OuterRef, Q |
|
|
|
|
|
|
|
|
from utils.image_compression import maybe_compress_uploaded_file |
|
|
from utils.image_compression import maybe_compress_uploaded_file |
|
|
from utils import absolute_https_url |
|
|
from utils import absolute_https_url |
|
|
@ -80,7 +80,7 @@ class AdminHadisCategorySerializer(serializers.ModelSerializer): |
|
|
def get_has_hadith(self, obj): |
|
|
def get_has_hadith(self, obj): |
|
|
if hasattr(obj, "annotated_has_hadith"): |
|
|
if hasattr(obj, "annotated_has_hadith"): |
|
|
return bool(obj.annotated_has_hadith) |
|
|
return bool(obj.annotated_has_hadith) |
|
|
return obj.hadis_set.exists() |
|
|
|
|
|
|
|
|
return obj.hadis_set.exists() or (hasattr(obj, "hadis_items") and obj.hadis_items.exists()) |
|
|
|
|
|
|
|
|
def get_has_quran_verse(self, obj): |
|
|
def get_has_quran_verse(self, obj): |
|
|
if hasattr(obj, "annotated_has_quran_verse"): |
|
|
if hasattr(obj, "annotated_has_quran_verse"): |
|
|
@ -152,6 +152,7 @@ class AdminHadisCategoryListSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
class AdminHadisListSerializer(serializers.ModelSerializer): |
|
|
class AdminHadisListSerializer(serializers.ModelSerializer): |
|
|
category_detail = AdminHadisCategoryListSerializer(source="category", read_only=True) |
|
|
category_detail = AdminHadisCategoryListSerializer(source="category", read_only=True) |
|
|
|
|
|
categories_detail = AdminHadisCategoryListSerializer(source="categories", many=True, read_only=True) |
|
|
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|
|
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|
|
collections_detail = serializers.SerializerMethodField() |
|
|
collections_detail = serializers.SerializerMethodField() |
|
|
|
|
|
|
|
|
@ -168,6 +169,8 @@ class AdminHadisListSerializer(serializers.ModelSerializer): |
|
|
"status", |
|
|
"status", |
|
|
"category", |
|
|
"category", |
|
|
"category_detail", |
|
|
"category_detail", |
|
|
|
|
|
"categories", |
|
|
|
|
|
"categories_detail", |
|
|
"hadis_status", |
|
|
"hadis_status", |
|
|
"hadis_status_detail", |
|
|
"hadis_status_detail", |
|
|
"collections_detail", |
|
|
"collections_detail", |
|
|
@ -415,6 +418,7 @@ class AdminHadisReferenceSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
category_detail = AdminHadisCategorySerializer(source="category", read_only=True) |
|
|
category_detail = AdminHadisCategorySerializer(source="category", read_only=True) |
|
|
|
|
|
categories_detail = AdminHadisCategorySerializer(source="categories", many=True, read_only=True) |
|
|
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|
|
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|
|
tags_detail = AdminHadisTagSerializer(source="tags", many=True, read_only=True) |
|
|
tags_detail = AdminHadisTagSerializer(source="tags", many=True, read_only=True) |
|
|
|
|
|
|
|
|
@ -423,6 +427,11 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
required=False, |
|
|
required=False, |
|
|
allow_null=True, |
|
|
allow_null=True, |
|
|
) |
|
|
) |
|
|
|
|
|
categories = serializers.PrimaryKeyRelatedField( |
|
|
|
|
|
queryset=HadisCategory.objects.all(), |
|
|
|
|
|
many=True, |
|
|
|
|
|
required=False, |
|
|
|
|
|
) |
|
|
hadis_status = serializers.PrimaryKeyRelatedField( |
|
|
hadis_status = serializers.PrimaryKeyRelatedField( |
|
|
queryset=HadisStatus.objects.all(), |
|
|
queryset=HadisStatus.objects.all(), |
|
|
required=False, |
|
|
required=False, |
|
|
@ -441,6 +450,7 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
) |
|
|
) |
|
|
collections_detail = serializers.SerializerMethodField() |
|
|
collections_detail = serializers.SerializerMethodField() |
|
|
category_path = serializers.SerializerMethodField() |
|
|
category_path = serializers.SerializerMethodField() |
|
|
|
|
|
categories_paths = serializers.SerializerMethodField() |
|
|
book_reference_id = serializers.PrimaryKeyRelatedField( |
|
|
book_reference_id = serializers.PrimaryKeyRelatedField( |
|
|
queryset=BookReference.objects.all(), |
|
|
queryset=BookReference.objects.all(), |
|
|
required=False, |
|
|
required=False, |
|
|
@ -481,9 +491,12 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
bookmark_count = serializers.SerializerMethodField() |
|
|
bookmark_count = serializers.SerializerMethodField() |
|
|
|
|
|
|
|
|
def get_category_path(self, obj): |
|
|
def get_category_path(self, obj): |
|
|
if not obj.category: |
|
|
|
|
|
|
|
|
cat = obj.category |
|
|
|
|
|
if not cat and hasattr(obj, "categories"): |
|
|
|
|
|
cat = obj.categories.first() |
|
|
|
|
|
if not cat: |
|
|
return [] |
|
|
return [] |
|
|
ancestors_qs = obj.category.get_ancestors(include_self=True).select_related('sect') |
|
|
|
|
|
|
|
|
ancestors_qs = cat.get_ancestors(include_self=True).select_related('sect') |
|
|
return [ |
|
|
return [ |
|
|
{ |
|
|
{ |
|
|
"id": a.id, |
|
|
"id": a.id, |
|
|
@ -498,6 +511,28 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
for a in ancestors_qs |
|
|
for a in ancestors_qs |
|
|
] |
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
def get_categories_paths(self, obj): |
|
|
|
|
|
cats = list(obj.categories.all()) if hasattr(obj, "categories") else [] |
|
|
|
|
|
if not cats and obj.category: |
|
|
|
|
|
cats = [obj.category] |
|
|
|
|
|
all_paths = [] |
|
|
|
|
|
for cat in cats: |
|
|
|
|
|
ancestors_qs = cat.get_ancestors(include_self=True).select_related('sect') |
|
|
|
|
|
all_paths.append([ |
|
|
|
|
|
{ |
|
|
|
|
|
"id": a.id, |
|
|
|
|
|
"title": a.title, |
|
|
|
|
|
"slug": a.slug, |
|
|
|
|
|
"source_type": a.source_type, |
|
|
|
|
|
"sect_type": a.sect.sect_type if a.sect else None, |
|
|
|
|
|
"order": a.order, |
|
|
|
|
|
"is_root": a.parent_id is None, |
|
|
|
|
|
"level": getattr(a, a._mptt_meta.level_attr) if hasattr(a, '_mptt_meta') else 0, |
|
|
|
|
|
} |
|
|
|
|
|
for a in ancestors_qs |
|
|
|
|
|
]) |
|
|
|
|
|
return all_paths |
|
|
|
|
|
|
|
|
class Meta: |
|
|
class Meta: |
|
|
model = Hadis |
|
|
model = Hadis |
|
|
fields = [ |
|
|
fields = [ |
|
|
@ -507,6 +542,9 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
"category", |
|
|
"category", |
|
|
"category_detail", |
|
|
"category_detail", |
|
|
"category_path", |
|
|
"category_path", |
|
|
|
|
|
"categories", |
|
|
|
|
|
"categories_detail", |
|
|
|
|
|
"categories_paths", |
|
|
"title_narrator", |
|
|
"title_narrator", |
|
|
"title", |
|
|
"title", |
|
|
"description", |
|
|
"description", |
|
|
@ -631,6 +669,14 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
) |
|
|
) |
|
|
return value |
|
|
return value |
|
|
|
|
|
|
|
|
|
|
|
def validate_categories(self, values): |
|
|
|
|
|
for val in values: |
|
|
|
|
|
if val and val.children.exists(): |
|
|
|
|
|
raise serializers.ValidationError( |
|
|
|
|
|
_("Cannot assign a hadith/item to a category that has subcategories. Only leaf categories can contain hadiths.") |
|
|
|
|
|
) |
|
|
|
|
|
return values |
|
|
|
|
|
|
|
|
def get_collections_detail(self, obj): |
|
|
def get_collections_detail(self, obj): |
|
|
collections = [item.collection for item in obj.collection_items.all()] |
|
|
collections = [item.collection for item in obj.collection_items.all()] |
|
|
return AdminHadisCollectionSerializer(collections, many=True).data |
|
|
return AdminHadisCollectionSerializer(collections, many=True).data |
|
|
@ -644,7 +690,15 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
hadith_number = validated_data.pop("hadith_number", None) |
|
|
hadith_number = validated_data.pop("hadith_number", None) |
|
|
tags = validated_data.pop("tags", []) |
|
|
tags = validated_data.pop("tags", []) |
|
|
collections = validated_data.pop("collection_items", []) |
|
|
collections = validated_data.pop("collection_items", []) |
|
|
|
|
|
categories = validated_data.pop("categories", None) |
|
|
hadis = super().create(validated_data) |
|
|
hadis = super().create(validated_data) |
|
|
|
|
|
if categories is not None: |
|
|
|
|
|
hadis.categories.set(categories) |
|
|
|
|
|
if not hadis.category and categories: |
|
|
|
|
|
hadis.category = categories[0] |
|
|
|
|
|
hadis.save(update_fields=['category']) |
|
|
|
|
|
elif hadis.category: |
|
|
|
|
|
hadis.categories.set([hadis.category]) |
|
|
if tags: |
|
|
if tags: |
|
|
hadis.tags.set(tags) |
|
|
hadis.tags.set(tags) |
|
|
if collections: |
|
|
if collections: |
|
|
@ -678,7 +732,17 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
|
|
tags = validated_data.pop("tags", None) |
|
|
tags = validated_data.pop("tags", None) |
|
|
collections = validated_data.pop("collection_items", None) |
|
|
collections = validated_data.pop("collection_items", None) |
|
|
|
|
|
categories = validated_data.pop("categories", None) |
|
|
hadis = super().update(instance, validated_data) |
|
|
hadis = super().update(instance, validated_data) |
|
|
|
|
|
if categories is not None: |
|
|
|
|
|
hadis.categories.set(categories) |
|
|
|
|
|
if not hadis.category and categories: |
|
|
|
|
|
hadis.category = categories[0] |
|
|
|
|
|
hadis.save(update_fields=['category']) |
|
|
|
|
|
elif "category" in validated_data and validated_data.get("category"): |
|
|
|
|
|
if not hadis.categories.exists(): |
|
|
|
|
|
hadis.categories.set([validated_data["category"]]) |
|
|
|
|
|
|
|
|
if tags is not None: |
|
|
if tags is not None: |
|
|
hadis.tags.set(tags) |
|
|
hadis.tags.set(tags) |
|
|
if collections is not None: |
|
|
if collections is not None: |
|
|
@ -1656,7 +1720,13 @@ class AdminHadisCategoryArchiveDetailSerializer(AdminHadisCategoryArchiveSeriali |
|
|
has_children = bool(getattr(obj, "annotated_has_children", obj.children.exists())) |
|
|
has_children = bool(getattr(obj, "annotated_has_children", obj.children.exists())) |
|
|
if has_children: |
|
|
if has_children: |
|
|
return "categories" |
|
|
return "categories" |
|
|
has_hadith = bool(getattr(obj, "annotated_has_hadith", obj.hadis_set.exists())) |
|
|
|
|
|
|
|
|
has_hadith = bool( |
|
|
|
|
|
getattr( |
|
|
|
|
|
obj, |
|
|
|
|
|
"annotated_has_hadith", |
|
|
|
|
|
obj.hadis_set.exists() or (hasattr(obj, "hadis_items") and obj.hadis_items.exists()) |
|
|
|
|
|
) |
|
|
|
|
|
) |
|
|
if has_hadith: |
|
|
if has_hadith: |
|
|
return "arguments" |
|
|
return "arguments" |
|
|
return "none" |
|
|
return "none" |
|
|
@ -1664,7 +1734,7 @@ class AdminHadisCategoryArchiveDetailSerializer(AdminHadisCategoryArchiveSeriali |
|
|
def get_child_categories(self, obj): |
|
|
def get_child_categories(self, obj): |
|
|
if not obj or not obj.pk: |
|
|
if not obj or not obj.pk: |
|
|
return [] |
|
|
return [] |
|
|
child_hadis_subquery = Hadis.objects.filter(category=OuterRef("pk")) |
|
|
|
|
|
|
|
|
child_hadis_subquery = Hadis.objects.filter(Q(category=OuterRef("pk")) | Q(categories=OuterRef("pk"))) |
|
|
child_children_subquery = HadisCategory.objects.filter(parent=OuterRef("pk")) |
|
|
child_children_subquery = HadisCategory.objects.filter(parent=OuterRef("pk")) |
|
|
children = obj.children.all().annotate( |
|
|
children = obj.children.all().annotate( |
|
|
annotated_has_hadith=Exists(child_hadis_subquery), |
|
|
annotated_has_hadith=Exists(child_hadis_subquery), |
|
|
@ -1686,6 +1756,9 @@ class AdminHadisCategoryArchiveDetailSerializer(AdminHadisCategoryArchiveSeriali |
|
|
def get_child_arguments(self, obj): |
|
|
def get_child_arguments(self, obj): |
|
|
if not obj or not obj.pk: |
|
|
if not obj or not obj.pk: |
|
|
return [] |
|
|
return [] |
|
|
|
|
|
hadis_qs = Hadis.objects.filter( |
|
|
|
|
|
Q(category=obj) | Q(categories=obj) |
|
|
|
|
|
).distinct().select_related("hadis_status").order_by("number", "-id")[:100] |
|
|
return [ |
|
|
return [ |
|
|
{ |
|
|
{ |
|
|
"id": h.id, |
|
|
"id": h.id, |
|
|
@ -1701,7 +1774,7 @@ class AdminHadisCategoryArchiveDetailSerializer(AdminHadisCategoryArchiveSeriali |
|
|
"main_color_code": getattr(h.hadis_status, "main_color_code", None), |
|
|
"main_color_code": getattr(h.hadis_status, "main_color_code", None), |
|
|
} if h.hadis_status else None, |
|
|
} if h.hadis_status else None, |
|
|
} |
|
|
} |
|
|
for h in obj.hadis_set.all().select_related("hadis_status").order_by("number", "-id")[:100] |
|
|
|
|
|
|
|
|
for h in hadis_qs |
|
|
] |
|
|
] |
|
|
|
|
|
|
|
|
def get_child_count(self, obj): |
|
|
def get_child_count(self, obj): |
|
|
@ -1710,7 +1783,7 @@ class AdminHadisCategoryArchiveDetailSerializer(AdminHadisCategoryArchiveSeriali |
|
|
cat_count = obj.children.count() |
|
|
cat_count = obj.children.count() |
|
|
if cat_count > 0: |
|
|
if cat_count > 0: |
|
|
return cat_count |
|
|
return cat_count |
|
|
return obj.hadis_set.count() |
|
|
|
|
|
|
|
|
return Hadis.objects.filter(Q(category=obj) | Q(categories=obj)).distinct().count() |
|
|
|
|
|
|
|
|
class Meta(AdminHadisCategoryArchiveSerializer.Meta): |
|
|
class Meta(AdminHadisCategoryArchiveSerializer.Meta): |
|
|
fields = AdminHadisCategoryArchiveSerializer.Meta.fields + [ |
|
|
fields = AdminHadisCategoryArchiveSerializer.Meta.fields + [ |
|
|
|