diff --git a/apps/hadis/admin/hadis.py b/apps/hadis/admin/hadis.py index 3d7f581..ef25376 100644 --- a/apps/hadis/admin/hadis.py +++ b/apps/hadis/admin/hadis.py @@ -30,28 +30,28 @@ class HadisAdminForm(forms.ModelForm): # Schema for translation JSON field translation_schema = { - "type": "array", - "title": "Translations", - "items": { - "type": "object", - "title": "Translation", - "properties": { - "language_code": { - "type": "string", - "title": "Language Code", - "enum": ["en", "fa", "ar", "ur"], - "options": { - "enum_titles": ["English", "Persian", "Arabic", "Urdu"] + "type": "array", + "title": "Translations", + "items": { + "type": "object", + "title": "Translation", + "properties": { + "language_code": { + "type": "string", + "title": "Language Code", + "enum": ["en", "fa", "ar", "ur"], + "options": { + "enum_titles": ["English", "Persian", "Arabic", "Urdu"] + } + }, + "text": { # <‑‑ use text, not title + "type": "string", + "title": "Translation Text" } }, - "title": { - "type": "string", - "title": "Translation Text" - } - }, - "required": ["language_code", "title"] + "required": ["language_code", "text"] # <‑‑ update required key + } } - } # Schema for links JSON field (array of objects with title and link) links_schema = { diff --git a/apps/hadis/serializers/category.py b/apps/hadis/serializers/category.py index 720ac54..c48b146 100644 --- a/apps/hadis/serializers/category.py +++ b/apps/hadis/serializers/category.py @@ -4,6 +4,39 @@ from django.utils.translation import gettext_lazy as _ # from django.db.models import Count from ..models import HadisSect, HadisCategory, Hadis , HadisCategory +from django.utils.translation import get_language + +def get_localized_text(json_list, request=None, fallback_lang="en"): + """ + Extract localized text from a JSON list based on request's language. + + Expects: [{"language_code": "en", "text": "..."}, ...] + Returns: Single text string or None + """ + if not json_list or not isinstance(json_list, list): + return None + + # Get target language + language_code = getattr(request, "LANGUAGE_CODE", None) if request else None + if not language_code: + language_code = get_language() or fallback_lang + + # 1) Exact match + for item in json_list: + if isinstance(item, dict) and item.get("language_code") == language_code: + return item.get("text") + + # 2) Fallback to English + for item in json_list: + if isinstance(item, dict) and item.get("language_code") == "en": + return item.get("text") + + # 3) First available + if json_list and isinstance(json_list[0], dict): + return json_list[0].get("text") + + return None + class LocalizedField(serializers.Field): """ @@ -136,23 +169,28 @@ class HadisCategoryTreeSerializer(serializers.ModelSerializer): ).order_by('number').values_list('number', flat=True) ) - def to_dict(self, c): - """Convert category to dictionary""" - children = c.get_children().filter(sect=c.sect).order_by('order') + def to_dict(self, category, request=None): + """Convert category to dict, applying localization""" + if request is None: + request = self.context.get('request') + return { - 'id': c.id, - 'name': self.get_name(c), - 'description': c.description, - 'source_type': c.source_type, - 'hadis_count': self.get_hadis_count(c), - 'has_hadis': self.get_has_hadis(c), - 'order': c.order, - 'thumbnail': self.get_thumbnail(c), - 'xmind_file': self.get_xmind_file(c), - 'has_xmind_file': self.get_has_xmind_file(c), - 'children_count': 0 if not children else len([self.to_dict(i) for i in children]), - 'children': [] if not children else [self.to_dict(i) for i in children], + 'id': category.id, + 'title': get_localized_text(category.title, request), # <-- use helper + 'description': get_localized_text(category.description, request), # <-- use helper + 'slug': category.slug, + 'source_type': category.source_type, + 'hadis_count': self.get_hadis_count(category), + 'has_hadis': self.get_has_hadis(category), + 'order': category.order, + 'thumbnail': self.get_thumbnail(category), + 'xmind_file': self.get_xmind_file(category), + 'has_xmind_file': self.get_has_xmind_file(category), + 'children': [ + self.to_dict(child, request) # recursively apply + for child in category.children.all() + ] } class HadisCategorySelectSerializer(serializers.ModelSerializer): diff --git a/apps/hadis/views/category.py b/apps/hadis/views/category.py index b32e270..fcae763 100644 --- a/apps/hadis/views/category.py +++ b/apps/hadis/views/category.py @@ -4,7 +4,14 @@ from django.shortcuts import get_object_or_404 from utils.pagination import NoPagination from ..models import HadisSect, HadisCategory -from ..serializers import HadisCategorySectListSerializer, HadisCategoryTreeSerializer, CategorySerializer , HadisCategorySelectSerializer , HadisCategorySelectSourceSerializer +from ..serializers import ( + HadisCategorySectListSerializer, + HadisCategoryTreeSerializer, + CategorySerializer , + HadisCategorySelectSerializer , + HadisCategorySelectSourceSerializer, + get_localized_text + ) from ..docs import ( hadis_sect_list_swagger, hadis_category_tree_swagger, @@ -103,7 +110,7 @@ class HadisCategoryTreeView(ListAPIView): grouped_data[sect_type]['sects'][sect_id] = { 'id': category.sect.id, 'sect_type': category.sect.sect_type, - 'title': category.sect.title, + 'title': get_localized_text(category.sect.title,self.request), 'description': category.sect.description, 'order': category.sect.order } @@ -135,14 +142,15 @@ class HadisCategoryTreeView(ListAPIView): def build_enhanced_category_tree(self, category, serializer_instance): """Build enhanced category tree with father category info and hadis details""" - base_data = serializer_instance.to_dict(category) - - # Enhance children with additional information + # serializer_instance already has context={'request': request} + base_data = serializer_instance.to_dict(category, request=self.request) + + # Rest of the code... enhanced_children = [] for child_data in base_data.get('children', []): enhanced_child = self.enhance_child_data(child_data, category, serializer_instance) enhanced_children.append(enhanced_child) - + base_data['children'] = enhanced_children return base_data @@ -152,7 +160,7 @@ class HadisCategoryTreeView(ListAPIView): # Add father category information child_data['father_category'] = { 'id': parent_category.id, - 'name': parent_category.title, + 'title': get_localized_text(parent_category.title,self.request), 'sect_id': parent_category.sect.id, 'sect_type': parent_category.sect.sect_type, 'source_type': parent_category.source_type