diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 935ec83..97d1210 100644 --- a/apps/hadis/serializers/hadis.py +++ b/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""" diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 7f26eb2..432565d 100644 --- a/apps/hadis/views/hadis.py +++ b/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): """