Browse Source

sync category tree api updated

master
Mohsen Taba 5 months ago
parent
commit
a2191824b4
  1. 38
      apps/hadis/admin/hadis.py
  2. 68
      apps/hadis/serializers/category.py
  3. 18
      apps/hadis/views/category.py

38
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 = {

68
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):

18
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,9 +142,10 @@ 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)
# serializer_instance already has context={'request': request}
base_data = serializer_instance.to_dict(category, request=self.request)
# Enhance children with additional information
# 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)
@ -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

Loading…
Cancel
Save