From 9422073bccb47639be71f19c1193066a1416777f Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Thu, 27 Aug 2026 15:20:20 +0330 Subject: [PATCH] feat(hadis): add ancestors category_path serialization from MPTT root to leaf --- apps/hadis/serializers/serializers_admin.py | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 36322ab..143abbc 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -45,6 +45,7 @@ class AdminHadisCategorySerializer(serializers.ModelSerializer): has_children = serializers.SerializerMethodField() is_leaf = serializers.SerializerMethodField() has_hadith = serializers.SerializerMethodField() + ancestors = serializers.SerializerMethodField() def get_has_children(self, obj): if hasattr(obj, "annotated_has_children"): @@ -61,6 +62,24 @@ class AdminHadisCategorySerializer(serializers.ModelSerializer): return bool(obj.annotated_has_hadith) return obj.hadis_set.exists() + def get_ancestors(self, obj): + if not obj: + return [] + ancestors_qs = obj.get_ancestors(include_self=True).select_related('sect') + return [ + { + "id": a.id, + "title": a.title, + "slug": a.slug, + "source_type": a.source_type, + "sect_type": a.sect.sect_type if a.sect else None, + "order": a.order, + "is_root": a.parent_id is None, + "level": getattr(a, a._mptt_meta.level_attr) if hasattr(a, '_mptt_meta') else 0, + } + for a in ancestors_qs + ] + class Meta: model = HadisCategory fields = [ @@ -76,6 +95,7 @@ class AdminHadisCategorySerializer(serializers.ModelSerializer): "has_children", "is_leaf", "has_hadith", + "ancestors", ] @@ -226,6 +246,7 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): required=False, ) collections_detail = serializers.SerializerMethodField() + category_path = serializers.SerializerMethodField() book_reference_id = serializers.PrimaryKeyRelatedField( queryset=BookReference.objects.all(), required=False, @@ -235,6 +256,24 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): bookmark_count = serializers.SerializerMethodField() + def get_category_path(self, obj): + if not obj.category: + return [] + ancestors_qs = obj.category.get_ancestors(include_self=True).select_related('sect') + return [ + { + "id": a.id, + "title": a.title, + "slug": a.slug, + "source_type": a.source_type, + "sect_type": a.sect.sect_type if a.sect else None, + "order": a.order, + "is_root": a.parent_id is None, + "level": getattr(a, a._mptt_meta.level_attr) if hasattr(a, '_mptt_meta') else 0, + } + for a in ancestors_qs + ] + class Meta: model = Hadis fields = [ @@ -243,6 +282,7 @@ class AdminHadisDetailSerializer(serializers.ModelSerializer): "slug", "category", "category_detail", + "category_path", "title_narrator", "title", "description",