Browse Source

narrators arabic text shows and appears there

master
Mohsen Taba 4 weeks ago
parent
commit
25053022b6
  1. 83
      apps/hadis/management/commands/seed_transmitters_defaults.py
  2. 34
      apps/hadis/serializers/category.py
  3. 50
      apps/hadis/serializers/hadis.py

83
apps/hadis/management/commands/seed_transmitters_defaults.py

@ -0,0 +1,83 @@
from django.core.management.base import BaseCommand
from django.db import transaction
from apps.hadis.models import Transmitters
class Command(BaseCommand):
help = 'Populate default values for Transmitters fields (ar and en)'
def handle(self, *args, **options):
self.stdout.write(self.style.WARNING("Starting to update Transmitters default values..."))
default_values = {
'full_name': {
'ar': 'الإمام الحافظ أبو عيسى محمد بن عيسى بن سَوْرَة بن موسى بن الضحاك السُّلَمي الترمذي',
'en': 'Al-Imam al-Hafiz Abu Isa Muhammad ibn Isa ibn Sawrah ibn Musa ibn al-Dahhak al-Sulami al-Tirmidhi'
},
'kunya': {
'ar': 'أبو خالد',
'en': 'Abu Khalid'
},
'known_as': {
'ar': 'ابن هلال',
'en': 'ibn Hilal'
},
'nickname': {
'ar': 'البصري',
'en': 'Al-Basri'
},
'origin': {
'ar': 'البصرة، من قبيلة قريش',
'en': 'Basra, Quraysh tribe'
},
'freed_slave_of': {
'ar': 'غير مسجل',
'en': 'Not recorded'
},
'occupation': {
'ar': 'نجّار، تاجر',
'en': 'Carpenter, Merchant'
},
'features': {
'ar': 'أعرج، أعمى في عينٍ واحدة',
'en': 'Lame, blind in one eye'
}
}
def update_json_field(field_data, new_ar, new_en):
if not isinstance(field_data, list):
field_data = []
# Remove existing ar and en
field_data = [item for item in field_data if isinstance(item, dict) and item.get("language_code") not in ["ar", "en"]]
# Add new ar and en
field_data.append({"language_code": "ar", "text": new_ar})
field_data.append({"language_code": "en", "text": new_en})
return field_data
transmitters = Transmitters.objects.all()
count = transmitters.count()
self.stdout.write(self.style.WARNING(f"Found {count} Transmitters to update."))
with transaction.atomic():
for transmitter in transmitters:
transmitter.full_name = update_json_field(transmitter.full_name, default_values['full_name']['ar'], default_values['full_name']['en'])
transmitter.kunya = update_json_field(transmitter.kunya, default_values['kunya']['ar'], default_values['kunya']['en'])
transmitter.known_as = update_json_field(transmitter.known_as, default_values['known_as']['ar'], default_values['known_as']['en'])
transmitter.nickname = update_json_field(transmitter.nickname, default_values['nickname']['ar'], default_values['nickname']['en'])
transmitter.origin = update_json_field(transmitter.origin, default_values['origin']['ar'], default_values['origin']['en'])
# mawla status -> freed_slave_of
transmitter.freed_slave_of = update_json_field(transmitter.freed_slave_of, default_values['freed_slave_of']['ar'], default_values['freed_slave_of']['en'])
# profession -> occupation
transmitter.occupation = update_json_field(transmitter.occupation, default_values['occupation']['ar'], default_values['occupation']['en'])
# physical traits -> features
transmitter.features = update_json_field(transmitter.features, default_values['features']['ar'], default_values['features']['en'])
transmitter.save()
self.stdout.write(self.style.SUCCESS(f"✅ Successfully updated {count} Transmitters with new Arabic and English defaults!"))

34
apps/hadis/serializers/category.py

@ -52,6 +52,22 @@ def get_localized_text(json_list, request=None, fallback_lang="en", language_cod
return None
def get_arabic_localized_text(json_list):
if not json_list or not isinstance(json_list, list):
return None
# 1) Exact match for 'ar'
for item in json_list:
if isinstance(item, dict) and item.get("language_code") == "ar":
value = _get_localized_item_value(item)
if value: return value
# 2) Fallback to the last item registered
if json_list and isinstance(json_list[-1], dict):
return _get_localized_item_value(json_list[-1])
return None
class LocalizedField(serializers.Field):
"""
@ -89,6 +105,24 @@ class LocalizedField(serializers.Field):
first = value[0]
return _get_localized_item_value(first)
class ArabicLocalizedField(serializers.Field):
"""
Extracts the Arabic ('ar') language from a JSON list,
or falls back to the last item in the list if 'ar' is not found.
"""
def to_representation(self, value):
if not value or not isinstance(value, list):
return None
for item in value:
if item.get("language_code") == "ar":
localized_value = _get_localized_item_value(item)
if localized_value:
return localized_value
last = value[-1]
return _get_localized_item_value(last)
class SimpleCategory(serializers.ModelSerializer):
title = LocalizedField()
description = LocalizedField()

50
apps/hadis/serializers/hadis.py

@ -4,8 +4,8 @@ import json
from django.utils.translation import gettext_lazy as _
from rest_framework.fields import SerializerMethodField
from urllib3 import request
from .category import LocalizedField
from .category import get_localized_text
from .category import LocalizedField, ArabicLocalizedField
from .category import get_localized_text, get_arabic_localized_text
from .category import get_localized_text
from apps.bookmark.serializers.bookmark import BookmarkStatusSerializer
@ -335,16 +335,19 @@ class HadisTagSerializer(serializers.ModelSerializer):
class TransmitterSerializer(serializers.ModelSerializer):
"""Serializer for Transmitters"""
full_name = LocalizedField()
arabic_full_name = ArabicLocalizedField(source='full_name')
known_as = LocalizedField()
arabic_known_as = ArabicLocalizedField(source='known_as')
nickname = LocalizedField()
arabic_nickname = ArabicLocalizedField(source='nickname')
reliability = serializers.SerializerMethodField()
share_link = serializers.CharField(read_only=True)
class Meta:
model = Transmitters
fields = [
'id', 'full_name', 'slug','birth_year_hijri', 'death_year_hijri',
"known_as",'nickname','reliability','madhhab','generation','share_link'
'id', 'full_name', 'arabic_full_name', 'slug','birth_year_hijri', 'death_year_hijri',
"known_as", 'arabic_known_as', 'nickname', 'arabic_nickname', 'reliability','madhhab','generation','share_link'
]
def get_reliability(self, obj):
@ -361,14 +364,17 @@ class TransmitterSerializer(serializers.ModelSerializer):
class TransmitterShortSerializer(serializers.ModelSerializer):
"""Serializer for Transmitters"""
full_name = LocalizedField()
arabic_full_name = ArabicLocalizedField(source='full_name')
known_as = LocalizedField()
arabic_known_as = ArabicLocalizedField(source='known_as')
nickname = LocalizedField()
arabic_nickname = ArabicLocalizedField(source='nickname')
class Meta:
model = Transmitters
fields = [
'id', 'full_name', 'slug','birth_year_hijri', 'death_year_hijri',
"known_as",'nickname','reliability'
'id', 'full_name', 'arabic_full_name', 'slug','birth_year_hijri', 'death_year_hijri',
"known_as", 'arabic_known_as', 'nickname', 'arabic_nickname', 'reliability'
]
class TransmitterOpinionSerializer(serializers.ModelSerializer):
""" Serializer for TransmitterOpinions """
@ -419,10 +425,23 @@ class TransmitterDetailSerializer(serializers.ModelSerializer):
""" Serializer for Details of Transmitters """
full_name = LocalizedField()
arabic_full_name = ArabicLocalizedField(source='full_name')
known_as = LocalizedField()
arabic_known_as = ArabicLocalizedField(source='known_as')
nickname = LocalizedField()
arabic_nickname = ArabicLocalizedField(source='nickname')
kunya = LocalizedField()
arabic_kunya = ArabicLocalizedField(source='kunya')
origin = LocalizedField()
arabic_origin = ArabicLocalizedField(source='origin')
mawla_status = LocalizedField(source='freed_slave_of')
arabic_mawla_status = ArabicLocalizedField(source='freed_slave_of')
profession = LocalizedField(source='occupation')
arabic_profession = ArabicLocalizedField(source='occupation')
physical_traits = LocalizedField(source='features')
arabic_physical_traits = ArabicLocalizedField(source='features')
lived_in = LocalizedField()
died_in = LocalizedField()
description = LocalizedField()
@ -432,8 +451,9 @@ class TransmitterDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Transmitters
fields = [
'id','full_name','kunya','known_as','nickname',
'origin','lived_in','died_in','birth_year_hijri',
'id','full_name', 'arabic_full_name', 'kunya', 'arabic_kunya', 'known_as', 'arabic_known_as', 'nickname', 'arabic_nickname',
'origin', 'arabic_origin', 'mawla_status', 'arabic_mawla_status', 'profession', 'arabic_profession', 'physical_traits', 'arabic_physical_traits',
'lived_in','died_in','birth_year_hijri',
'death_year_hijri','age_at_death','reliability',
'madhhab',"in_sahih_muslim","in_sahih_bukhari",
"description",'generation','share_link'
@ -460,13 +480,14 @@ class TransmitterSyncSerializer(serializers.ModelSerializer):
scholars_opinions = serializers.SerializerMethodField()
original_texts = serializers.SerializerMethodField()
full_name = LocalizedField()
arabic_full_name = ArabicLocalizedField(source='full_name')
hadis = serializers.SerializerMethodField()
relations = serializers.SerializerMethodField()
class Meta:
model = Transmitters
fields = [
'id', 'full_name','slug' ,'biographical', 'scholars_opinions', 'original_texts','hadis','relations'
'id', 'full_name', 'arabic_full_name', 'slug', 'biographical', 'scholars_opinions', 'original_texts','hadis','relations'
]
def get_biographical(self, obj):
@ -484,10 +505,21 @@ class TransmitterSyncSerializer(serializers.ModelSerializer):
return {
'full_name': get_localized_text(obj.full_name, request),
'arabic_full_name': get_arabic_localized_text(obj.full_name),
'kunya': get_localized_text(obj.kunya, request),
'arabic_kunya': get_arabic_localized_text(obj.kunya),
'known_as': get_localized_text(obj.known_as, request),
'arabic_known_as': get_arabic_localized_text(obj.known_as),
'nickname': get_localized_text(obj.nickname, request),
'arabic_nickname': get_arabic_localized_text(obj.nickname),
'origin': get_localized_text(obj.origin, request),
'arabic_origin': get_arabic_localized_text(obj.origin),
'mawla_status': get_localized_text(obj.freed_slave_of, request),
'arabic_mawla_status': get_arabic_localized_text(obj.freed_slave_of),
'profession': get_localized_text(obj.occupation, request),
'arabic_profession': get_arabic_localized_text(obj.occupation),
'physical_traits': get_localized_text(obj.features, request),
'arabic_physical_traits': get_arabic_localized_text(obj.features),
'lived_in': get_localized_text(obj.lived_in, request),
'died_in': get_localized_text(obj.died_in, request),
'birth_year_hijri': obj.birth_year_hijri,

Loading…
Cancel
Save