Browse Source

transmitters arguments lists added

master
Mohsen Taba 4 weeks ago
parent
commit
211fe137b4
  1. 8
      apps/hadis/serializers/hadis.py
  2. 6
      apps/hadis/urls.py
  3. 30
      apps/hadis/views/transmitter.py

8
apps/hadis/serializers/hadis.py

@ -440,11 +440,12 @@ class TransmitterSyncSerializer(serializers.ModelSerializer):
scholars_opinions = serializers.SerializerMethodField() scholars_opinions = serializers.SerializerMethodField()
original_texts = serializers.SerializerMethodField() original_texts = serializers.SerializerMethodField()
full_name = LocalizedField() full_name = LocalizedField()
hadis = serializers.SerializerMethodField()
class Meta: class Meta:
model = Transmitters model = Transmitters
fields = [ 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): def get_biographical(self, obj):
@ -517,6 +518,11 @@ class TransmitterSyncSerializer(serializers.ModelSerializer):
} }
for t in obj.originaltexts.all() # Already prefetched 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))

6
apps/hadis/urls.py

@ -2,7 +2,10 @@ from django.urls import path, include
from rest_framework.routers import SimpleRouter from rest_framework.routers import SimpleRouter
from .views.category import HadisCategorySectListView, HadisCategoryTreeView, CategoriesView, CategoriesBySectView, HadisCategorySelectBySectView, HadisCategorySelectBySectSourceView , HadisCategoryTreeNormalView ,test_deploy,debug_headers,HadisCategoryXMindView 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.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 import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView
from .views.reference_v2 import BookReferenceV2DetailView, BookReferenceV2SyncView, BookReferenceV2ListView from .views.reference_v2 import BookReferenceV2DetailView, BookReferenceV2SyncView, BookReferenceV2ListView
from .views.version import ContentReleaseSyncView from .views.version import ContentReleaseSyncView
@ -89,6 +92,7 @@ urlpatterns = [
path('arguments/filters/', HadisFiltersView.as_view(), name='hadis-filters'), path('arguments/filters/', HadisFiltersView.as_view(), name='hadis-filters'),
# Narrator paths # Narrator paths
path('narrators/<str:narrator_slug>/arguments', NarratorArgumentsListView.as_view(), name='narrator-arguments'),
path('narrators/<str:narrator_slug>/opinions', TransmitterOpinionView.as_view(), name='narrator-opinions'), path('narrators/<str:narrator_slug>/opinions', TransmitterOpinionView.as_view(), name='narrator-opinions'),
path('narrators/<str:narrator_slug>/original_texts', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), path('narrators/<str:narrator_slug>/original_texts', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'),
path('narrators/<str:narrator_slug>', TransmitterDetailView.as_view(), name='narrator-detail'), path('narrators/<str:narrator_slug>', TransmitterDetailView.as_view(), name='narrator-detail'),

30
apps/hadis/views/transmitter.py

@ -4,12 +4,12 @@ from rest_framework.generics import ListAPIView , RetrieveAPIView
from rest_framework.response import Response from rest_framework.response import Response
from utils.pagination import StandardResultsSetPagination 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 ..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 utils.pagination import NoPagination
from .category import get_localized_text from .category import get_localized_text
from ..serializers import HadisListSerializer
class TransmitterFliterView(ListAPIView): class TransmitterFliterView(ListAPIView):
pass pass
@ -130,7 +130,8 @@ class TransmitterSyncView(ListAPIView):
Transmitters.objects Transmitters.objects
.prefetch_related( .prefetch_related(
Prefetch('opinions', queryset=TransmitterOpinion.objects.select_related('status')), Prefetch('opinions', queryset=TransmitterOpinion.objects.select_related('status')),
Prefetch('originaltexts', queryset=TransmitterOriginalText.objects.all())
Prefetch('originaltexts', queryset=TransmitterOriginalText.objects.all()),
'hadises'
) )
.order_by('id') .order_by('id')
) )
@ -193,3 +194,24 @@ class TransmitterFiltersView(ListAPIView):
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
return Response(get_transmitter_filters(request)) 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')
Loading…
Cancel
Save