diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index d634347..28ead78 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -49,11 +49,12 @@ class PinnedHadisCollectionSerializer(serializers.ModelSerializer): title = LocalizedField() summary = LocalizedField() thumbnail = serializers.SerializerMethodField() + hadis_ids = serializers.SerializerMethodField() class Meta: model = HadisCollection # فیلدهایی که برای نمایش در بخش پین شده (مثل اسلایدر یا لیست بالا) نیاز هست - fields = ['id', 'title', 'slug', 'summary', 'thumbnail', 'order', 'created_at'] + fields = ['id', 'title', 'slug', 'summary', 'thumbnail', 'order', 'created_at', 'hadis_ids'] def get_thumbnail(self, obj): if obj.thumbnail: @@ -63,14 +64,29 @@ class PinnedHadisCollectionSerializer(serializers.ModelSerializer): return absolute_https_url(obj.thumbnail.url) return None + def get_hadis_ids(self, obj): + # دریافت شناسه احادیث فعال متعلق به این کالکشن به ترتیب + if hasattr(obj, '_prefetched_objects_cache') and 'hadis_items' in obj._prefetched_objects_cache: + items = [ + item.hadis_id for item in obj.hadis_items.all() + if getattr(getattr(item, 'hadis', None), 'status', True) + ] + return items + return list( + obj.hadis_items.filter(hadis__status=True) + .order_by('order') + .values_list('hadis_id', flat=True) + ) + class HadisCollectionListSerializer(serializers.ModelSerializer): thumbnail = serializers.SerializerMethodField() title = LocalizedField() summary = LocalizedField() + hadis_ids = serializers.SerializerMethodField() class Meta: model = HadisCollection - fields = ['id', 'title', 'summary','slug', 'thumbnail'] + fields = ['id', 'title', 'summary', 'slug', 'thumbnail', 'hadis_ids'] def get_thumbnail(self, obj): if obj.thumbnail: @@ -80,6 +96,20 @@ class HadisCollectionListSerializer(serializers.ModelSerializer): return absolute_https_url(obj.thumbnail.url) return None + def get_hadis_ids(self, obj): + # دریافت شناسه احادیث فعال متعلق به این کالکشن به ترتیب + if hasattr(obj, '_prefetched_objects_cache') and 'hadis_items' in obj._prefetched_objects_cache: + items = [ + item.hadis_id for item in obj.hadis_items.all() + if getattr(getattr(item, 'hadis', None), 'status', True) + ] + return items + return list( + obj.hadis_items.filter(hadis__status=True) + .order_by('order') + .values_list('hadis_id', flat=True) + ) + class HadisSyncSerializer(serializers.ModelSerializer): """Serializer for syncing all hadis data (grouped fields)""" diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 290e52d..9510fbb 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -33,10 +33,17 @@ class PinnedHadisCollectionListView(ListAPIView): return self.list(request, *args, **kwargs) def get_queryset(self): + from django.db.models import Prefetch + from apps.hadis.models import HadisInCollection return HadisCollection.objects.filter( status=True, display_position=HadisCollection.DisplayPosition.PINNED, hadis_items__hadis__status=True + ).prefetch_related( + Prefetch( + 'hadis_items', + queryset=HadisInCollection.objects.filter(hadis__status=True).order_by('order') + ) ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): @@ -100,9 +107,16 @@ class HadisCollectionListView(ListAPIView): return self.list(request, *args, **kwargs) def get_queryset(self): + from django.db.models import Prefetch + from apps.hadis.models import HadisInCollection return HadisCollection.objects.filter( status=True, display_position=HadisCollection.DisplayPosition.MIDDLE + ).prefetch_related( + Prefetch( + 'hadis_items', + queryset=HadisInCollection.objects.filter(hadis__status=True).order_by('order') + ) ).order_by('order', '-created_at')