From 211fe137b4387523b35ed336ac5e65a25a86376a Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Mon, 22 Jun 2026 09:41:10 +0330 Subject: [PATCH] transmitters arguments lists added --- apps/hadis/serializers/hadis.py | 8 +++++++- apps/hadis/urls.py | 6 +++++- apps/hadis/views/transmitter.py | 30 ++++++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 8ef58ec..46cb015 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -440,11 +440,12 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): scholars_opinions = serializers.SerializerMethodField() original_texts = serializers.SerializerMethodField() full_name = LocalizedField() + hadis = serializers.SerializerMethodField() class Meta: model = Transmitters fields = [ - 'id', 'full_name','slug' ,'biographical', 'scholars_opinions', 'original_texts' + 'id', 'full_name','slug' ,'biographical', 'scholars_opinions', 'original_texts','hadis' ] def get_biographical(self, obj): @@ -517,6 +518,11 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): } for t in obj.originaltexts.all() # Already prefetched ] + def get_hadis(self, obj): + # چون از related_name='hadises' در مدل HadisTransmitter استفاده شده، + # لیست تمام رکوردهای واسط را می‌گیریم. + # استفاده از set باعث می‌شود اگر یک راوی در ۲ سند از یک حدیث بود، آیدی آن حدیث تکراری نشود. + return list(set(item.hadis_id for item in obj.hadises.all() if item.hadis_id)) diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index 1195c2e..d344bbb 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -2,7 +2,10 @@ from django.urls import path, include from rest_framework.routers import SimpleRouter from .views.category import HadisCategorySectListView, HadisCategoryTreeView, CategoriesView, CategoriesBySectView, HadisCategorySelectBySectView, HadisCategorySelectBySectSourceView , HadisCategoryTreeNormalView ,test_deploy,debug_headers,HadisCategoryXMindView from .views.hadis import HadisCollectionListView, HadisListView, HadisBasicView, HadisDetailView, HadisSyncView, HadisTransmittersView, HadisCorrectionsView,HadisMainListView, HadisFiltersView, HadisLayersView,PinnedHadisCollectionListView, HadisFiltersSyncAPIView -from .views.transmitter import TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView, TransmitterFiltersView +from .views.transmitter import ( + TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView, TransmitterFiltersView, + NarratorArgumentsListView +) from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView from .views.reference_v2 import BookReferenceV2DetailView, BookReferenceV2SyncView, BookReferenceV2ListView from .views.version import ContentReleaseSyncView @@ -89,6 +92,7 @@ urlpatterns = [ path('arguments/filters/', HadisFiltersView.as_view(), name='hadis-filters'), # Narrator paths + path('narrators//arguments', NarratorArgumentsListView.as_view(), name='narrator-arguments'), path('narrators//opinions', TransmitterOpinionView.as_view(), name='narrator-opinions'), path('narrators//original_texts', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), path('narrators/', TransmitterDetailView.as_view(), name='narrator-detail'), diff --git a/apps/hadis/views/transmitter.py b/apps/hadis/views/transmitter.py index 9e326e1..5f6a5f6 100644 --- a/apps/hadis/views/transmitter.py +++ b/apps/hadis/views/transmitter.py @@ -4,12 +4,12 @@ from rest_framework.generics import ListAPIView , RetrieveAPIView from rest_framework.response import Response from utils.pagination import StandardResultsSetPagination -from ..models import Transmitters , TransmitterOpinion, TransmitterOriginalText -from ..serializers import TransmitterSerializer , TransmitterDetailSerializer, TransmitterSyncSerializer,TransmitterOpinionSerializer, TransmitterOriginalTextSerializer +from ..models import Transmitters , TransmitterOpinion, TransmitterOriginalText, Hadis +from ..serializers import TransmitterSerializer , TransmitterDetailSerializer, TransmitterSyncSerializer,TransmitterOpinionSerializer, TransmitterOriginalTextSerializer, HadisListSerializer from ..docs import transmitter_filters_swagger,transmitter_list_swagger, transmitter_detail_swagger, transmitter_sync_swagger, transmitter_opinion_swagger, transmitter_original_text_swagger from utils.pagination import NoPagination from .category import get_localized_text - +from ..serializers import HadisListSerializer class TransmitterFliterView(ListAPIView): pass @@ -130,7 +130,8 @@ class TransmitterSyncView(ListAPIView): Transmitters.objects .prefetch_related( Prefetch('opinions', queryset=TransmitterOpinion.objects.select_related('status')), - Prefetch('originaltexts', queryset=TransmitterOriginalText.objects.all()) + Prefetch('originaltexts', queryset=TransmitterOriginalText.objects.all()), + 'hadises' ) .order_by('id') ) @@ -193,3 +194,24 @@ class TransmitterFiltersView(ListAPIView): def list(self, request, *args, **kwargs): return Response(get_transmitter_filters(request)) +class NarratorArgumentsListView(ListAPIView): + """ + API view to list all Hadis (arguments) where a specific narrator + exists in the transmission chain (prefetching category and status). + """ + serializer_class = HadisListSerializer + pagination_class = StandardResultsSetPagination + # در صورت نیاز به احراز هویت می‌توانید کامنت زیر را باز کنید: + # authentication_classes = [TokenAuthentication] + + def get_queryset(self): + narrator_slug = self.kwargs.get('narrator_slug') + + # فیلتر کردن احادیث فعال که این راوی در زنجیره سند (transmitters) آن‌ها حضور دارد + return Hadis.objects.filter( + transmitters__transmitter__slug=narrator_slug, + status=True + ).select_related( + 'category__sect', + 'hadis_status' + ).distinct().order_by('id') \ No newline at end of file