From 25053022b629f9dee25274c37823614d71c4e695 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 27 Jun 2026 12:32:48 +0330 Subject: [PATCH] narrators arabic text shows and appears there --- .../commands/seed_transmitters_defaults.py | 83 +++++++++++++++++++ apps/hadis/serializers/category.py | 34 ++++++++ apps/hadis/serializers/hadis.py | 50 +++++++++-- 3 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 apps/hadis/management/commands/seed_transmitters_defaults.py diff --git a/apps/hadis/management/commands/seed_transmitters_defaults.py b/apps/hadis/management/commands/seed_transmitters_defaults.py new file mode 100644 index 0000000..ef92621 --- /dev/null +++ b/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!")) diff --git a/apps/hadis/serializers/category.py b/apps/hadis/serializers/category.py index 955a276..d0a3f01 100644 --- a/apps/hadis/serializers/category.py +++ b/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() diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 01355de..f9118b5 100644 --- a/apps/hadis/serializers/hadis.py +++ b/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,