From 36dbdf7b9010b138ea7780b5f47e2e5dcbb0bc14 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 4 Jul 2026 09:17:55 +0330 Subject: [PATCH] added quran secondary translation api for admin panel and also category filtering based on its source type --- apps/hadis/serializers/serializers_admin.py | 63 +++++++++++++++++++++ apps/hadis/urls.py | 3 +- apps/hadis/views_admin.py | 21 +++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 1d06b64..509e2ae 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -631,3 +631,66 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): if authors is not None: book.authors.set(authors) return book + + +# Category Quran Verse Admin Serializers +from ..models.category import CategoryQuranVerse, QuranSecondaryTranslation + +class AdminQuranSecondaryTranslationSerializer(serializers.ModelSerializer): + id = serializers.IntegerField(required=False) + translation_text = serializers.JSONField(default=list) + translator = serializers.JSONField(default=list) + + class Meta: + model = QuranSecondaryTranslation + fields = ["id", "translation_text", "translator"] + +class AdminCategoryQuranVerseSerializer(serializers.ModelSerializer): + surah_name = serializers.JSONField(default=list) + translation = serializers.JSONField(default=list) + translator = serializers.JSONField(default=list) + secondary_translations = AdminQuranSecondaryTranslationSerializer(many=True, required=False) + + class Meta: + model = CategoryQuranVerse + fields = [ + "id", + "category", + "surah_name", + "ayah_number", + "arabic_text", + "translation", + "translator", + "secondary_translations", + ] + + def create(self, validated_data): + secondary_data = validated_data.pop("secondary_translations", []) + verse = CategoryQuranVerse.objects.create(**validated_data) + for sec in secondary_data: + QuranSecondaryTranslation.objects.create(quran_verse=verse, **sec) + return verse + + def update(self, instance, validated_data): + secondary_data = validated_data.pop("secondary_translations", None) + instance.surah_name = validated_data.get("surah_name", instance.surah_name) + instance.ayah_number = validated_data.get("ayah_number", instance.ayah_number) + instance.arabic_text = validated_data.get("arabic_text", instance.arabic_text) + instance.translation = validated_data.get("translation", instance.translation) + instance.translator = validated_data.get("translator", instance.translator) + instance.category = validated_data.get("category", instance.category) + instance.save() + + if secondary_data is not None: + keep_ids = [item.get("id") for item in secondary_data if item.get("id")] + instance.secondary_translations.exclude(id__in=keep_ids).delete() + for sec in secondary_data: + sec_id = sec.get("id") + if sec_id: + QuranSecondaryTranslation.objects.filter(id=sec_id, quran_verse=instance).update( + translation_text=sec.get("translation_text", []), + translator=sec.get("translator", []) + ) + else: + QuranSecondaryTranslation.objects.create(quran_verse=instance, **sec) + return instance diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index 9889d0f..a0375a4 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -18,7 +18,7 @@ from .views_admin import ( AdminBookSubjectAreaViewSet, AdminBookTypeViewSet, AdminBookAuthorViewSet, AdminBookAttributeViewSet, AdminBookReferenceImageViewSet, AdminBookReferenceDocumentViewSet, AdminBookReferenceViewSet, AdminTransmitterViewSet, AdminTransmitterReliabilityViewSet, DovodiBookSubjectAreaViewSet, DovodiBookTypeViewSet, DovodiNarratorLayerViewSet, DovodiTransmitterReliabilityViewSet, DovodiOpinionStatusViewSet, - DovodiHadisSectViewSet, DovodiHadisCategoryViewSet + DovodiHadisSectViewSet, DovodiHadisCategoryViewSet, AdminCategoryQuranVerseViewSet ) from .views.reference_v2 import BookAuthorListView, BookAuthorDetailView, AuthorReferencesListView, BookAuthorSyncView from django.views.decorators.cache import cache_page @@ -31,6 +31,7 @@ def cached_view(view_func): admin_router = SimpleRouter() admin_router.register(r'hadises', AdminHadisViewSet, basename='admin-hadises') admin_router.register(r'categories', AdminHadisCategoryViewSet, basename='admin-hadis-categories') +admin_router.register(r'quran-verses', AdminCategoryQuranVerseViewSet, basename='admin-category-quran-verses') admin_router.register(r'dovodi-sects', DovodiHadisSectViewSet, basename='dovodi-hadis-sects') admin_router.register(r'dovodi-categories', DovodiHadisCategoryViewSet, basename='dovodi-hadis-categories') admin_router.register(r'corrections', AdminHadisCorrectionViewSet, basename='admin-hadis-corrections') diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index 2288899..b8b2677 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -92,6 +92,9 @@ class DovodiHadisCategoryViewSet(ModelViewSet): | Q(slug__icontains=search_query) | Q(source_type__icontains=search_query) ) + source_type = self.request.query_params.get("source_type") + if source_type: + queryset = queryset.filter(source_type=source_type) return queryset.order_by("tree_id", "lft", "order", "id") @@ -499,3 +502,21 @@ class AdminBookReferenceViewSet(ModelViewSet): queryset = queryset.filter(authors__id=author_id) return queryset.distinct().order_by("-created_at") + + +class AdminCategoryQuranVerseViewSet(ModelViewSet): + permission_classes = [IsAuthenticated, IsSuperAdmin] + authentication_classes = [TokenAuthentication] + parser_classes = (JSONParser, MultiPartParser, FormParser) + + def get_serializer_class(self): + from .serializers.serializers_admin import AdminCategoryQuranVerseSerializer + return AdminCategoryQuranVerseSerializer + + def get_queryset(self): + from .models.category import CategoryQuranVerse + queryset = CategoryQuranVerse.objects.all().prefetch_related("secondary_translations") + category_id = self.request.query_params.get("category") + if category_id: + queryset = queryset.filter(category_id=category_id) + return queryset