Browse Source

hadis arguments optimized.

master
Mohsen Taba 5 months ago
parent
commit
ba893162eb
  1. 95
      apps/hadis/serializers/hadis.py
  2. 46
      apps/hadis/views/hadis.py

95
apps/hadis/serializers/hadis.py

@ -159,82 +159,49 @@ class HadisListSerializer(serializers.ModelSerializer):
translation = LocalizedField()
title = LocalizedField()
title_narrator = LocalizedField()
title_narrator = LocalizedField()
class Meta:
model = Hadis
fields = ['id', 'number', 'slug', 'title','title_narrator', 'text' ,
'translation','category','status','share_link']
fields = ['id', 'number', 'slug', 'title', 'title_narrator', 'text',
'translation', 'category', 'status', 'share_link']
def get_category(self, obj):
"""Get category id and title"""
if obj.category:
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
out = None
for i in obj.category.title:
if i['language_code']== lang:
out = i['text']
if not out :
out = ''
return {
'id': obj.category.id,
'title': out,
'slug':obj.category.slug,
'source_type':obj.category.source_type,
'sect_type':obj.category.sect.sect_type
}
return None
if not obj.category:
return None
request = self.context.get('request')
# Use your helper method
title = get_localized_text(obj.category.title, request) or ""
# Safe access for sect_type to prevent crashes if sect is missing
# Note: Ensure your view uses .select_related('category__sect') for speed!
sect_type = obj.category.sect.sect_type if obj.category.sect else None
return {
'id': obj.category.id,
'title': title,
'slug': obj.category.slug,
'source_type': obj.category.source_type,
'sect_type': sect_type
}
def get_status(self, obj):
"""Get status id and title"""
if obj.hadis_status:
request = self.context.get('request')
language_code = getattr(request, "LANGUAGE_CODE", None) if request else None
if not language_code:
from django.utils.translation import get_language
language_code = get_language() or 'en'
title = None
if obj.hadis_status.title and isinstance(obj.hadis_status.title, list):
# 1) Exact match
for item in obj.hadis_status.title:
if isinstance(item, dict) and item.get("language_code") == language_code:
title = item.get("text")
break
# 2) Fallback to English
if not title:
for item in obj.hadis_status.title:
if isinstance(item, dict) and item.get("language_code") == "en":
title = item.get("text")
break
# 3) First available
if not title and obj.hadis_status.title and isinstance(obj.hadis_status.title[0], dict):
title = obj.hadis_status.title[0].get("text")
if not obj.hadis_status:
return None
return {
'id': obj.hadis_status.id,
'title': title,
'color': obj.hadis_status.color
}
return None
# def get_translation(self, obj):
# """Get translation based on request language"""
# request = self.context.get('request')
# language_code = getattr(request, 'LANGUAGE_CODE', 'en')
# return obj.translation.get(language_code)
# def get_title(self,obj):
# # ✅ Get language from request
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
# # ✅ CALL THE MODEL METHOD!
# return obj.get_title(lang)
# Use your helper method
title = get_localized_text(obj.hadis_status.title, request)
return {
'id': obj.hadis_status.id,
'title': title,
'color': obj.hadis_status.color
}
class HadisStatusSerializer(serializers.ModelSerializer):
"""Serializer for HadisStatus"""

46
apps/hadis/views/hadis.py

@ -120,7 +120,8 @@ class HadisMainListView(ListAPIView):
return self.list(request, *args, **kwargs)
def get_queryset(self):
queryset = Hadis.objects.select_related('category', 'hadis_status')
# queryset = Hadis.objects.select_related('category', 'hadis_status')
queryset = Hadis.objects.select_related('category__sect', 'hadis_status')
# Get search parameters
search_query = self.request.query_params.get('search', None)
@ -158,15 +159,17 @@ class HadisMainListView(ListAPIView):
# Modify the paginated response to include our custom data
response_data = paginated_response.data
# response_data['category_titles'] = self.get_cached_category_titles(request)
# response_data['status_titles'] = self.get_cached_status_titles(request)
return Response(response_data)
# Fallback for when pagination is disabled
serializer = self.get_serializer(queryset, many=True)
response_data = {
return Response({
'count': queryset.count(),
'results': serializer.data
}
})
return Response(response_data)
@ -213,6 +216,41 @@ class HadisMainListView(ListAPIView):
return queryset.filter(search_conditions)
#we add this later
# def get_cached_category_titles(self, request):
# """Fetches categories, cached for 1 hour to reduce DB load"""
# lang = getattr(request, "LANGUAGE_CODE", "en")
# cache_key = f"hadis_meta_categories_{lang}"
# data = cache.get(cache_key)
# if not data:
# # If not in cache, fetch from DB
# from ..models import HadisCategory
# categories = HadisCategory.objects.all().only('id', 'title') # Fetch only needed fields
# # Build list
# data = [get_localized_text(c.title, request) for c in categories]
# # Save to cache
# cache.set(cache_key, data, timeout=60 * 60) # 1 Hour
# return data
# def get_cached_status_titles(self, request):
# """Fetches statuses, cached for 1 hour"""
# lang = getattr(request, "LANGUAGE_CODE", "en")
# cache_key = f"hadis_meta_statuses_{lang}"
# data = cache.get(cache_key)
# if not data:
# from ..models import HadisStatus
# statuses = HadisStatus.objects.all().order_by('order')
# data = [get_localized_text(s.title, request) for s in statuses]
# cache.set(cache_key, data, timeout=60 * 60)
# return data
class HadisBasicView(RetrieveAPIView):
"""

Loading…
Cancel
Save