import random from django.core.management.base import BaseCommand from django.db import transaction # REPLACE 'apps.hadis.models' with your actual app path if different from apps.hadis.models import Transmitters, TransmitterReliability class Command(BaseCommand): help = 'Seeds database with 50 famous Islamic transmitters and scholars' def create_json_field(self, en_text, fa_text, ru_text): """Helper to create the standard JSON structure""" return [ {"text": en_text, "language_code": "en"}, {"text": fa_text, "language_code": "fa"}, {"text": ru_text, "language_code": "ru"} ] def handle(self, *args, **options): self.stdout.write("Starting to seed transmitters...") # 1. Fetch available reliability IDs (7-17) # We assume these exist based on your prompt. reliability_ids = list(range(7, 18)) # Verify reliabilities exist, or create a fallback existing_reliabilities = list(TransmitterReliability.objects.filter(id__in=reliability_ids)) if not existing_reliabilities: self.stdout.write(self.style.WARNING("No TransmitterReliability found in range 7-17. Creating a default one...")) default_rel = TransmitterReliability.objects.create( id=7, title=self.create_json_field("Trustworthy", "ثقه", "Надежный"), color='green' ) existing_reliabilities = [default_rel] # 2. Data Definition (List of 50) # Structure: (EN Name, FA Name, RU Name, Death Year, Origin EN, Origin FA, Origin RU) data_source = [ ("Abu Hurairah", "ابو هریره", "Абу Хурайра", 59, "Yemen", "یمن", "Йемен"), ("Anas ibn Malik", "انس بن مالک", "Анас ибн Малик", 93, "Medina", "مدینه", "Медина"), ("Aisha bint Abi Bakr", "عایشه بنت ابی‌بکر", "Аиша бинт Абу Бакр", 58, "Mecca", "مکه", "Мекка"), ("Abdullah ibn Umar", "عبدالله بن عمر", "Абдуллах ибн Умар", 73, "Mecca", "مکه", "Мекка"), ("Abdullah ibn Abbas", "عبدالله بن عباس", "Абдуллах ибн Аббас", 68, "Mecca", "مکه", "Мекка"), ("Jabir ibn Abdullah", "جابر بن عبدالله", "Джабир ибн Абдуллах", 78, "Medina", "مدینه", "Медина"), ("Abu Sa'id al-Khudri", "ابو سعید خدری", "Абу Саид аль-Худри", 74, "Medina", "مدینه", "Медина"), ("Abdullah ibn Mas'ud", "عبدالله بن مسعود", "Абдуллах ибн Масуд", 32, "Mecca", "مکه", "Мекка"), ("Ali ibn Abi Talib", "علی بن ابی‌طالب", "Али ибн Абу Талиб", 40, "Mecca", "مکه", "Мекка"), ("Umar ibn al-Khattab", "عمر بن خطاب", "Умар ибн аль-Хаттаб", 23, "Mecca", "مکه", "Мекка"), ("Abu Bakr as-Siddiq", "ابوبکر صدیق", "Абу Бакр ас-Сиддик", 13, "Mecca", "مکه", "Мекка"), ("Uthman ibn Affan", "عثمان بن عفان", "Усман ибн Аффан", 35, "Mecca", "مکه", "Мекка"), ("Salman al-Farsi", "سلمان فارسی", "Салман аль-Фариси", 36, "Isfahan", "اصفهان", "Исфахан"), ("Bilal ibn Rabah", "بلال حبشی", "Билал ибн Рабах", 20, "Mecca", "مکه", "Мекка"), ("Ammar ibn Yasir", "عمار یاسر", "Аммар ибн Ясир", 37, "Mecca", "مکه", "Мекка"), ("Abu Dharr al-Ghifari", "ابوذر غفاری", "Абу Зарр аль-Гифари", 32, "Ghifar", "غفار", "Гифар"), ("Miqdad ibn Aswad", "مقداد بن اسود", "Микдад ибн Асвад", 33, "Mecca", "مکه", "Мекка"), ("Talhah ibn Ubaydullah", "طلحه بن عبیدالله", "Талха ибн Убайдуллах", 36, "Mecca", "مکه", "Мекка"), ("Zubayr ibn al-Awam", "زبیر بن عوام", "Зубайр ибн аль-Аввам", 36, "Mecca", "مکه", "Мекка"), ("Sa'd ibn Abi Waqqas", "سعد بن ابی‌وقاص", "Саад ибн Абу Ваккас", 55, "Mecca", "مکه", "Мекка"), ("Saeed ibn al-Musayyib", "سعید بن مسیب", "Саид ибн аль-Мусаййиб", 94, "Medina", "مدینه", "Медина"), ("Urwah ibn al-Zubayr", "عروه بن زبیر", "Урва ибн аз-Зубайр", 94, "Medina", "مدینه", "Медина"), ("Al-Hasan al-Basri", "حسن بصری", "Аль-Хасан аль-Басри", 110, "Medina", "مدینه", "Медина"), ("Muhammad ibn Sirin", "محمد بن سیرین", "Мухаммад ибн Сирин", 110, "Basra", "بصره", "Басра"), ("Ibn Shihab al-Zuhri", "ابن شهاب زهری", "Ибн Шихаб аз-Зухри", 124, "Medina", "مدینه", "Медина"), ("Nafi Mawla Ibn Umar", "نافع مولی ابن عمر", "Нафи мавля Ибн Умар", 117, "Medina", "مدینه", "Медина"), ("Malik ibn Anas", "مالک بن انس", "Малик ибн Анас", 179, "Medina", "مدینه", "Медина"), ("Al-Shafi'i", "محمد بن ادریس شافعی", "Аш-Шафии", 204, "Gaza", "غزه", "Газа"), ("Ahmad ibn Hanbal", "احمد بن حنبل", "Ахмад ибн Ханбаль", 241, "Baghdad", "بغداد", "Багдад"), ("Sufyan al-Thawri", "سفیان ثوری", "Суфьян ас-Саури", 161, "Kufa", "کوفه", "Куфа"), ("Sufyan ibn Uyaynah", "سفیان بن عیینه", "Суфьян ибн Уйайна", 198, "Kufa", "کوفه", "Куфа"), ("Abdullah ibn al-Mubarak", "عبدالله بن مبارک", "Абдуллах ибн аль-Мубарак", 181, "Merv", "مرو", "Мерв"), ("Waki ibn al-Jarrah", "وکیع بن جراح", "Ваки ибн аль-Джаррах", 197, "Kufa", "کوفه", "Куфа"), ("Shu'bah ibn al-Hajjaj", "شعبه بن حجاج", "Шуба ибн аль-Хаджадж", 160, "Wasit", "واسط", "Васит"), ("Yahya ibn Ma'in", "یحیی بن معین", "Яхья ибн Маин", 233, "Baghdad", "بغداد", "Багдад"), ("Ali ibn al-Madini", "علی بن مدینی", "Али ибн аль-Мадини", 234, "Basra", "بصره", "Басра"), ("Muhammad al-Bukhari", "محمد بخاری", "Мухаммад аль-Бухари", 256, "Bukhara", "بخارا", "Бухара"), ("Muslim ibn al-Hajjaj", "مسلم نیشابوری", "Муслим ибн аль-Хаджадж", 261, "Nishapur", "نیشابور", "Нишапур"), ("Abu Dawood", "ابوداوود سجستانی", "Абу Дауд", 275, "Sistan", "سیستان", "Систан"), ("Al-Tirmidhi", "ترمذی", "Ат-Тирмизи", 279, "Termez", "ترمز", "Термез"), ("Al-Nasa'i", "نسائی", "Ан-Насаи", 303, "Nasa", "نسا", "Наса"), ("Ibn Majah", "ابن ماجه", "Ибн Маджа", 273, "Qazvin", "قزوین", "Казвин"), ("Al-Daraqutni", "دارقطنی", "Ад-Даракутни", 385, "Baghdad", "بغداد", "Багдад"), ("Al-Bayhaqi", "بیهقی", "Аль-Байхаки", 458, "Bayhaq", "بیهق", "Байхак"), ("Al-Hakim al-Nishapuri", "حاکم نیشابوری", "Аль-Хаким ан-Нишапури", 405, "Nishapur", "نیشابور", "Нишапур"), ("Al-Nawawi", "نووی", "Ан-Навави", 676, "Nawa", "نوا", "Нава"), ("Al-Dhahabi", "ذهبی", "Аз-Захаби", 748, "Damascus", "دمشق", "Дамаск"), ("Ibn Hajar al-Asqalani", "ابن حجر عسقلانی", "Ибн Хаджар аль-Аскаляни", 852, "Cairo", "قاهره", "Каир"), ("Ibn Kathir", "ابن کثیر", "Ибн Касир", 774, "Damascus", "دمشق", "Дамаск"), ("Al-Tabari", "طبری", "Ат-Табари", 310, "Amol", "آمل", "Амоль"), ] # 3. Execution Loop created_count = 0 with transaction.atomic(): for entry in data_source: en_name, fa_name, ru_name, death_year, en_origin, fa_origin, ru_origin = entry # Check if exists (by English Name) to allow re-running script if Transmitters.objects.filter(full_name__contains=[{"text": en_name, "language_code": "en"}]).exists(): self.stdout.write(f"Skipping {en_name} (already exists)") continue # Prepare JSON fields full_name_json = self.create_json_field(en_name, fa_name, ru_name) origin_json = self.create_json_field(en_origin, fa_origin, ru_origin) # Simple defaults for other text fields desc_json = self.create_json_field( f"A renowned scholar/narrator from {en_origin}", f"از راویان/علمای مشهور اهل {fa_origin}", f"Известный передатчик/ученый из {ru_origin}" ) # Randomly pick reliability reliability = random.choice(existing_reliabilities) # Create Object Transmitters.objects.create( full_name=full_name_json, origin=origin_json, lived_in=origin_json, # Assume lived where born for simplicity died_in=self.create_json_field("Unknown", "نامشخص", "Неизвестно"), death_year_hijri=death_year, description=desc_json, reliability=reliability, # Setting defaults for required JSON fields kunya=self.create_json_field("", "", ""), known_as=self.create_json_field("", "", ""), nickname=self.create_json_field("", "", ""), madhhab='unknown', # Default as per your choices ) created_count += 1 self.stdout.write(self.style.SUCCESS(f"Successfully created {created_count} new Transmitters!"))