#!/usr/bin/env python3 """ Script to update all transmitters in the database with 80+ distinct, authentic narrator names across English (en), Arabic (ar), and Russian (ru). Strictly conforms to the project's multilingual JSON structure: [ {"language_code": "en", "text": "..."}, {"language_code": "ar", "text": "..."}, {"language_code": "ru", "text": "..."} ] and regenerates unique, clean slugs for each transmitter. """ import os import sys import argparse from pathlib import Path # Force UTF-8 encoding for console output on Windows if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(encoding="utf-8") if hasattr(sys.stderr, "reconfigure"): sys.stderr.reconfigure(encoding="utf-8") BASE_DIR = Path(__file__).resolve().parent.parent sys.path.insert(0, str(BASE_DIR)) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.base") import django django.setup() from django.db import transaction from django.utils.text import slugify from apps.hadis.models import Transmitters # 90 Authentic, prominent Hadith narrators and scholars TRANSMITTER_NAMES = [ { "en": "Zurarah ibn A'yan", "ar": "زرارة بن أعين", "ru": "Зурара ибн Аян", }, { "en": "Muhammad ibn Muslim", "ar": "محمد بن مسلم", "ru": "Мухаммад ибн Муслим", }, { "en": "Abu Basir al-Asadi", "ar": "أبو بصير الأسدي", "ru": "Абу Басир аль-Асади", }, { "en": "Jamil ibn Darraj", "ar": "جميل بن دراج", "ru": "Джамиль ибн Даррадж", }, { "en": "Burayd ibn Mu'awiyah al-Ijli", "ar": "بريد بن معاوية العجلي", "ru": "Бурайд ибн Муавия аль-Иджли", }, { "en": "Al-Fudayl ibn Yasar", "ar": "الفضيل بن يسار", "ru": "Аль-Фудайль ибн Йасар", }, { "en": "Aban ibn Taghlib", "ar": "أبان بن تغلب", "ru": "Абан ибн Таглиб", }, { "en": "Hisham ibn al-Hakam", "ar": "هشام بن الحكم", "ru": "Хишам ибн аль-Хакам", }, { "en": "Hisham ibn Salim al-Jawaliqi", "ar": "هشام بن سالم الجواليقي", "ru": "Хишам ибн Салим аль-Джавалики", }, { "en": "Yunus ibn Abd al-Rahman", "ar": "يونس بن عبد الرحمن", "ru": "Йунус ибн Абд ар-Рахман", }, { "en": "Safwan ibn Yahya", "ar": "صفوان بن يحيى", "ru": "Сафван ибн Йахья", }, { "en": "Muhammad ibn Abi Umayr", "ar": "محمد بن أبي عمير", "ru": "Мухаммад ибн Аби Умайр", }, { "en": "Ahmad ibn Muhammad ibn Abi Nasr al-Bazanti", "ar": "أحمد بن محمد بن أبي نصر البزنطي", "ru": "Ахмад ибн Мухаммад аль-Базанти", }, { "en": "Hammad ibn Isa", "ar": "حماد بن عيسى", "ru": "Хаммад ибн Иса", }, { "en": "Hammad ibn Uthman", "ar": "حماد بن عثمان", "ru": "Хаммад ибн Усман", }, { "en": "Mu'awiyah ibn Ammar", "ar": "معاوية بن عمار", "ru": "Муавия ибн Аммар", }, { "en": "Ali ibn Yaqtin", "ar": "علي بن يقطين", "ru": "Али ибн Йактин", }, { "en": "Zakariya ibn Adam al-Qummi", "ar": "زكريا بن آدم القمي", "ru": "Закария ибн Адам аль-Кумми", }, { "en": "Al-Fadl ibn Shadhan", "ar": "الفضل بن شاذان", "ru": "Аль-Фадль ибн Шазан", }, { "en": "Muhammad ibn Ya'qub al-Kulayni", "ar": "محمد بن يعقوب الكليني", "ru": "Мухаммад ибн Йакуб аль-Кулайни", }, { "en": "Al-Shaykh al-Saduq (Muhammad ibn Ali ibn Babawayh)", "ar": "الشيخ الصدوق (محمد بن علي بن بابويه)", "ru": "Аш-Шейх ас-Садук", }, { "en": "Al-Shaykh al-Mufid (Muhammad ibn Muhammad al-Nu'man)", "ar": "الشيخ المفيد (محمد بن محمد النعمان)", "ru": "Аш-Шейх аль-Муфид", }, { "en": "Ali ibn al-Husayn al-Sharif al-Murtada", "ar": "الشريف المرتضى (علي بن الحسين)", "ru": "Аш-Шариф аль-Муртада", }, { "en": "Al-Shaykh al-Tusi (Muhammad ibn al-Hasan)", "ar": "الشيخ الطوسي (محمد بن الحسن)", "ru": "Аш-Шейх ат-Туси", }, { "en": "Al-Allamah al-Hilli (Al-Hasan ibn Yusuf)", "ar": "العلامة الحلي (الحسن بن يوسف)", "ru": "Аль-Аллама аль-Хилли", }, { "en": "Al-Muhaqqiq al-Hilli (Ja'far ibn al-Hasan)", "ar": "المحقق الحلي (جعفر بن الحسن)", "ru": "Аль-Мухаккик аль-Хилли", }, { "en": "Al-Shahid al-Awwal (Muhammad ibn Makki)", "ar": "الشهيد الأول (محمد بن مكي)", "ru": "Аш-Шахид аль-Авваль", }, { "en": "Al-Shahid al-Thani (Zayn al-Din al-Jubba'i)", "ar": "الشهيد الثاني (زين الدين الجبعي)", "ru": "Аш-Шахид ас-Сани", }, { "en": "Muhammad Baqir al-Majlisi", "ar": "محمد باقر المجلسي", "ru": "Мухаммад Бакир аль-Маджлиси", }, { "en": "Al-Hurr al-Amili (Muhammad ibn al-Hasan)", "ar": "الحر العاملي (محمد بن الحسن)", "ru": "Аль-Хурр аль-Амили", }, { "en": "Abu al-Qasim al-Khu'i", "ar": "أبو القاسم الخوئي", "ru": "Абу аль-Касим аль-Хои", }, { "en": "Salman al-Farsi", "ar": "سلمان الفارسي", "ru": "Салман аль-Фарси", }, { "en": "Abu Dharr al-Ghifari", "ar": "أبو ذر الغفاري", "ru": "Абу Зарр аль-Гифари", }, { "en": "Al-Miqdad ibn al-Aswad", "ar": "المقداد بن الأسود", "ru": "Аль-Микдад ибн аль-Асвад", }, { "en": "Ammar ibn Yasir", "ar": "عمار بن ياسر", "ru": "Аммар ибн Йасир", }, { "en": "Jabir ibn Abd Allah al-Ansari", "ar": "جابر بن عبد الله الأنصاري", "ru": "Джабир ибн Абдуллах аль-Ансари", }, { "en": "Hudhayfah ibn al-Yaman", "ar": "حذيفة بن اليمان", "ru": "Хузайфа ибн аль-Йаман", }, { "en": "Malik al-Ashtar al-Nakha'i", "ar": "مالك الأشتر النخعي", "ru": "Малик аль-Аштар", }, { "en": "Kumayl ibn Ziyad al-Nakha'i", "ar": "كميل بن زياد النخعي", "ru": "Кумайль ибн Зийад", }, { "en": "Maytham al-Tammar", "ar": "ميثم التمار", "ru": "Майсам ат-Таммар", }, { "en": "Sa'id ibn Jubayr", "ar": "سعيد بن جبير", "ru": "Саид ибн Джубайр", }, { "en": "Tawus ibn Kaysan", "ar": "طاووس بن كيسان", "ru": "Тавус ибн Кайсан", }, { "en": "Sulaym ibn Qays al-Hilali", "ar": "سليم بن قيس الهلالي", "ru": "Сулейм ибн Кайс аль-Хилали", }, { "en": "Al-Asbagh ibn Nubatah", "ar": "الأصبغ بن نباتة", "ru": "Аль-Асбаг ибн Нубата", }, { "en": "Jabir ibn Yazid al-Ju'fi", "ar": "جابر بن يزيد الجعفي", "ru": "Джабир ибн Йазид аль-Джуфи", }, { "en": "Abu Hamzah al-Thumali (Thabit ibn Dinar)", "ar": "أبو حمزة الثمالي (ثابت بن دينار)", "ru": "Абу Хамза ас-Сумали", }, { "en": "Zayd ibn Ali ibn al-Husayn", "ar": "زيد بن علي بن الحسين", "ru": "Зайд ибн Али", }, { "en": "Dawud ibn Sarhan", "ar": "داود بن سرحان", "ru": "Давуд ибн Сархан", }, { "en": "Abd Allah ibn Sinan", "ar": "عبد الله بن سنان", "ru": "Абдуллах ибн Синан", }, { "en": "Abd Allah ibn Bukayr", "ar": "عبد الله بن بكير", "ru": "Абдуллах ибн Букайр", }, { "en": "Abd Allah ibn Mughirah", "ar": "عبد الله بن المغيرة", "ru": "Абдуллах ибн аль-Мугира", }, { "en": "Al-Husayn ibn Sa'id al-Ahwazi", "ar": "الحسين بن سعيد الأهوازي", "ru": "Аль-Хусейн ибн Саид аль-Ахвази", }, { "en": "Ali ibn Mahziyar al-Ahwazi", "ar": "علي بن مهزيار الأهوازي", "ru": "Али ибн Махзийар аль-Ахвази", }, { "en": "Ibrahim ibn Hashim al-Qummi", "ar": "إبراهيم بن هاشم القمي", "ru": "Ибрахим ибн Хашим аль-Кумми", }, { "en": "Ali ibn Ibrahim al-Qummi", "ar": "علي بن إبراهيم القمي", "ru": "Али ибн Ибрахим аль-Кумми", }, { "en": "Sa'd ibn Abd Allah al-Ash'ari", "ar": "سعد بن عبد الله الأشعري", "ru": "Саад ибн Абдуллах аль-Ашари", }, { "en": "Al-Hasan ibn Mahbub al-Sarrad", "ar": "الحسن بن محبوب السراد", "ru": "Аль-Хасан ибн Махбуб", }, { "en": "Al-Hasan ibn Ali ibn Faddal", "ar": "الحسن بن علي بن فضال", "ru": "Аль-Хасан ибн Али ибн Фаддаль", }, { "en": "Ali ibn al-Hasan ibn Faddal", "ar": "علي بن الحسن بن فضال", "ru": "Али ибн аль-Хасан ибн Фаддаль", }, { "en": "Muhammad ibn Ahmad ibn Yahya al-Ash'ari", "ar": "محمد بن أحمد بن يحيى الأشعري", "ru": "Мухаммад ибн Ахмад ибн Йахья", }, { "en": "Ahmad ibn Muhammad ibn Isa al-Ash'ari", "ar": "أحمد بن محمد بن عيسى الأشعري", "ru": "Ахмад ибн Мухаммад ибн Иса аль-Ашари", }, { "en": "Ahmad ibn Muhammad ibn Khalid al-Barqi", "ar": "أحمد بن محمد بن خالد البرقي", "ru": "Ахмад ибн Мухаммад аль-Барки", }, { "en": "Muhammad ibn Yahya al-Attar al-Qummi", "ar": "محمد بن يحيى العطار القمي", "ru": "Мухаммад ибн Йахья аль-Аттар", }, { "en": "Al-Husayn ibn Muhammad al-Ash'ari", "ar": "الحسين بن محمد الأشعري", "ru": "Аль-Хусейн ибн Мухаммад аль-Ашари", }, { "en": "Ali ibn al-Husayn ibn Babawayh al-Qummi", "ar": "علي بن الحسين بن بابويه القمي", "ru": "Али ибн аль-Хусейн ибн Бабавейх", }, { "en": "Ja'far ibn Muhammad ibn Qulawayh", "ar": "جعفر بن محمد بن قولويه", "ru": "Джафар ибн Мухаммад ибн Кулавейх", }, { "en": "Muhammad ibn al-Hasan al-Saffar", "ar": "محمد بن الحسن الصفار", "ru": "Мухаммад ибн аль-Хасан ас-Саффар", }, { "en": "Muhammad ibn Umar al-Kashshi", "ar": "محمد بن عمر الكشي", "ru": "Мухаммад ибн Умар аль-Кашши", }, { "en": "Ahmad ibn Ali al-Najashi", "ar": "أحمد بن علي النجاشي", "ru": "Ахмад ибн Али ан-Наджаши", }, { "en": "Muhammad ibn Ibrahim al-Nu'mani", "ar": "محمد بن إبراهيم النعماني", "ru": "Мухаммад ибн Ибрахим ан-Нумани", }, { "en": "Qutb al-Din al-Rawandi", "ar": "قطب الدين الراوندي", "ru": "Кутб ад-Дин ар-Раванди", }, { "en": "Al-Fadl ibn al-Hasan al-Tabrisi", "ar": "الفضل بن الحسن الطبرسي", "ru": "Аль-Фадль ибн аль-Хасан ат-Табарси", }, { "en": "Ibn Shahrashub al-Mazandarani", "ar": "ابن شهرآشوب المازندراني", "ru": "Ибн Шахрашуб аль-Мазандарани", }, { "en": "Ali ibn Musa ibn Tawus", "ar": "علي بن موسى بن طاووس", "ru": "Али ибн Муса ибн Тавус", }, { "en": "Ahmad ibn Muhammad al-Ardabili", "ar": "أحمد بن محمد الأردبيلي", "ru": "Ахмад ибн Мухаммад аль-Ардабили", }, { "en": "Al-Muhsin al-Fayd al-Kashani", "ar": "المحسن الفيض الكاشاني", "ru": "Аль-Файд аль-Кашани", }, { "en": "Yusuf ibn Ahmad al-Bahrani", "ar": "يوسف بن أحمد البحراني", "ru": "Йусуф ибн Ахмад аль-Бахрани", }, { "en": "Murtada al-Ansari", "ar": "مرتضى الأنصاري", "ru": "Муртаза аль-Ансари", }, { "en": "Muhammad Hasan al-Shirazi", "ar": "محمد حسن الشيرازي", "ru": "Мухаммад Хасан аль-Ширази", }, { "en": "Muhsin al-Amin al-Amili", "ar": "محسن الأمين العاملي", "ru": "Мухсин аль-Амин аль-Амили", }, { "en": "Abd al-Husayn Sharaf al-Din al-Musawi", "ar": "عبد الحسين شرف الدين الموسوي", "ru": "Абд аль-Хусейн Шараф ад-Дин", }, { "en": "Muhammad Baqir al-Sadr", "ar": "محمد باقر الصدر", "ru": "Мухаммад Бакир ас-Садр", }, { "en": "Muhammad Husayn al-Tabataba'i", "ar": "محمد حسين الطباطبائي", "ru": "Мухаммад Хусейн ат-Табатабаи", }, { "en": "Al-Hasan ibn Zayn al-Din (Sahib al-Ma'alim)", "ar": "الحسن بن زين الدين (صاحب المعالم)", "ru": "Аль-Хасан ибн Зайн ад-Дин", }, { "en": "Muhammad Baqir al-Sabzawari", "ar": "محمد باقر السبزواري", "ru": "Мухаммад Бакир ас-Сабзавари", }, { "en": "Al-Sharif al-Radi (Muhammad ibn al-Husayn)", "ar": "الشريف الرضي (محمد بن الحسين)", "ru": "Аш-Шариф ар-Ради", }, { "en": "Ibn Abi Aqil al-Umani", "ar": "ابن أبي عقيل العماني", "ru": "Ибн Аби Акиль аль-Умани", }, { "en": "Ibn al-Junayd al-Iskafi", "ar": "ابن الجنيد الإسكافي", "ru": "Ибн аль-Джунайд аль-Искафи", }, { "en": "Al-Qadi Ibn al-Barraj", "ar": "القاضي ابن البراج", "ru": "Аль-Кади ибн аль-Баррадж", }, { "en": "Sallar ibn Abd al-Aziz al-Daylami", "ar": "سلار بن عبد العزيز الديلمي", "ru": "Саллар ибн Абд аль-Азиз", }, ] def update_transmitters(dry_run: bool = False): transmitters = list(Transmitters.objects.all().order_by("id")) total_count = len(transmitters) print(f"Found {total_count} transmitters in database.") print(f"Loaded {len(TRANSMITTER_NAMES)} curated narrator names.") if total_count > len(TRANSMITTER_NAMES): print(f"Warning: Database has {total_count} transmitters, but we have {len(TRANSMITTER_NAMES)} names.") updated = 0 with transaction.atomic(): for idx, transmitter in enumerate(transmitters): name_data = TRANSMITTER_NAMES[idx % len(TRANSMITTER_NAMES)] en_name = name_data["en"] ar_name = name_data["ar"] ru_name = name_data["ru"] # Format strictly adheres to the multilingual JSON schema: # [{"language_code": "...", "text": "..."}] new_full_name = [ {"language_code": "en", "text": en_name}, {"language_code": "ar", "text": ar_name}, {"language_code": "ru", "text": ru_name}, ] transmitter.full_name = new_full_name # Generating a clean, unique slug from the English name base_slug = slugify(en_name, allow_unicode=True) or f"transmitter-{transmitter.id}" # Check for conflict excluding current transmitter candidate_slug = base_slug[:240] counter = 1 while Transmitters.objects.filter(slug=candidate_slug).exclude(pk=transmitter.pk).exists(): candidate_slug = f"{base_slug[:230]}-{counter}" counter += 1 transmitter.slug = candidate_slug if dry_run: print(f"[DRY RUN] ID {transmitter.id}: {en_name} | {ar_name} | {ru_name} -> slug: {candidate_slug}") else: transmitter.save() print(f"[UPDATED] ID {transmitter.id}: {en_name} | {ar_name} | {ru_name} -> slug: {transmitter.slug}") updated += 1 if dry_run: print(f"\n[DRY RUN COMPLETE] {updated} transmitters would be updated. No changes were committed.") transaction.set_rollback(True) else: print(f"\n[SUCCESS] Successfully updated {updated} transmitters with unique multilingual names and slugs.") def main(): parser = argparse.ArgumentParser(description="Update transmitters with unique multilingual names.") parser.add_argument("--dry-run", action="store_true", help="Simulate updates without committing to database.") args = parser.parse_args() update_transmitters(dry_run=args.dry_run) if __name__ == "__main__": main()