|
|
|
@ -4,10 +4,11 @@ from utils.pagination import NoPagination |
|
|
|
from rest_framework.response import Response |
|
|
|
from django.db.models import Count |
|
|
|
from django.db.models import Prefetch |
|
|
|
from ..serializers.category import get_localized_text |
|
|
|
|
|
|
|
from ..models import HadisCategory, Hadis, HadisCollection,HadisTransmitter , HadisCorrection |
|
|
|
from ..serializers import HadisListSerializer, HadisBasicSerializer, HadisDetailSerializer, HadisCollectionListSerializer, HadisSyncSerializer,HadisCorrectionSerializer,HadisTransmitterListSerializer |
|
|
|
from ..docs import hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger, hadis_transmitters_swagger, hadis_corrections_swagger, hadis_basic_swagger |
|
|
|
from ..docs import hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger, hadis_transmitters_swagger, hadis_corrections_swagger, hadis_basic_swagger, hadis_main_list_swagger |
|
|
|
|
|
|
|
|
|
|
|
class HadisCollectionListView(ListAPIView): |
|
|
|
@ -83,6 +84,101 @@ class HadisListView(ListAPIView): |
|
|
|
).select_related('category') |
|
|
|
|
|
|
|
|
|
|
|
class HadisMainListView(ListAPIView): |
|
|
|
""" |
|
|
|
API view to list Hadis by category_id |
|
|
|
""" |
|
|
|
serializer_class = HadisListSerializer |
|
|
|
|
|
|
|
@hadis_main_list_swagger |
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
return self.list(request, *args, **kwargs) |
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
|
queryset = Hadis.objects.select_related('category', 'hadis_status') |
|
|
|
|
|
|
|
# Get search parameters |
|
|
|
search_query = self.request.query_params.get('search', None) |
|
|
|
status_filter = self.request.query_params.get('status', None) |
|
|
|
category_filter = self.request.query_params.get('category', None) |
|
|
|
|
|
|
|
# Apply search filter |
|
|
|
if search_query: |
|
|
|
queryset = self.apply_search_filter(queryset, search_query) |
|
|
|
|
|
|
|
# Apply status filter |
|
|
|
if status_filter: |
|
|
|
queryset = queryset.filter(hadis_status__title__icontains=status_filter) |
|
|
|
|
|
|
|
# Apply category filter |
|
|
|
if category_filter: |
|
|
|
queryset = queryset.filter(category__title__icontains=category_filter) |
|
|
|
|
|
|
|
return queryset |
|
|
|
|
|
|
|
def list(self, request, *args, **kwargs): |
|
|
|
queryset = self.get_queryset() |
|
|
|
serializer = self.get_serializer(queryset, many=True) |
|
|
|
|
|
|
|
# Get category titles |
|
|
|
category_titles = self.get_category_titles(request) |
|
|
|
|
|
|
|
# Get status titles |
|
|
|
status_titles = self.get_status_titles(request) |
|
|
|
|
|
|
|
response_data = { |
|
|
|
'count': queryset.count(), |
|
|
|
'categories': category_titles, |
|
|
|
'statuses': status_titles, |
|
|
|
'results': serializer.data |
|
|
|
} |
|
|
|
|
|
|
|
return Response(response_data) |
|
|
|
|
|
|
|
def get_category_titles(self,request): |
|
|
|
"""Get list of category titles based on language""" |
|
|
|
from ..models import HadisCategory |
|
|
|
|
|
|
|
categories = HadisCategory.objects.all() |
|
|
|
category_titles = [] |
|
|
|
|
|
|
|
for category in categories: |
|
|
|
title = get_localized_text(category.title,request) |
|
|
|
category_titles.append(title) |
|
|
|
|
|
|
|
return category_titles |
|
|
|
|
|
|
|
def get_status_titles(self, request): |
|
|
|
"""Get list of status titles based on language""" |
|
|
|
from ..models import HadisStatus |
|
|
|
|
|
|
|
statuses = HadisStatus.objects.all().order_by('order') |
|
|
|
status_titles = [] |
|
|
|
|
|
|
|
for status in statuses: |
|
|
|
title = get_localized_text(status.title,request) |
|
|
|
status_titles.append(title) |
|
|
|
return status_titles |
|
|
|
|
|
|
|
def apply_search_filter(self, queryset, search_query): |
|
|
|
""" |
|
|
|
Apply search filter across multiple fields including JSONFields. |
|
|
|
Searches in: title, title_narrator, text, translation |
|
|
|
""" |
|
|
|
from django.db.models import Q |
|
|
|
|
|
|
|
# Basic search conditions |
|
|
|
search_conditions = Q(text__icontains=search_query) |
|
|
|
|
|
|
|
# For JSONFields, search in the JSON string representation |
|
|
|
# This will find matches in the "text" values within the JSON arrays |
|
|
|
search_conditions |= Q(title__icontains=search_query) |
|
|
|
search_conditions |= Q(title_narrator__icontains=search_query) |
|
|
|
search_conditions |= Q(translation__icontains=search_query) |
|
|
|
|
|
|
|
return queryset.filter(search_conditions) |
|
|
|
|
|
|
|
|
|
|
|
class HadisBasicView(RetrieveAPIView): |
|
|
|
""" |
|
|
|
API view to retrieve basic Hadis information by hadis_slug |
|
|
|
|