import random from django.core.management.base import BaseCommand from django.db import transaction # REPLACE 'apps.hadis.models' with your actual app path from apps.hadis.models import ( Transmitters, OpinionStatus, TransmitterOpinion, TransmitterOriginalText ) class Command(BaseCommand): help = 'Seeds OpinionStatus, TransmitterOpinion, and TransmitterOriginalText with multilingual data' def create_json(self, en, fa, ru): """Helper to create the standard JSON structure""" return [ {"text": en, "language_code": "en"}, {"text": fa, "language_code": "fa"}, {"text": ru, "language_code": "ru"} ] def handle(self, *args, **options): self.stdout.write("Starting generation of Transmitter details...") # ========================================== # 1. SEED OPINION STATUSES (7 Colors) # ========================================== self.stdout.write("Seeding Opinion Statuses...") # Mapping colors to Rijal Terminology status_data = [ { "color": OpinionStatus.ColorChoices.GREEN, "en": "Thiqah (Trustworthy)", "fa": "ثقه (مورد اعتماد)", "ru": "Сика (Достоверный)" }, { "color": OpinionStatus.ColorChoices.BLUE, "en": "Hasan (Good/Acceptable)", "fa": "حسن (نیکو)", "ru": "Хасан (Хороший)" }, { "color": OpinionStatus.ColorChoices.YELLOW, "en": "Da'if (Weak)", "fa": "ضعیف", "ru": "Даиф (Слабый)" }, { "color": OpinionStatus.ColorChoices.ORANGE, "en": "Majhul (Unknown)", "fa": "مجهول (ناشناخته)", "ru": "Маджхуль (Неизвестный)" }, { "color": OpinionStatus.ColorChoices.RED, "en": "Kadhdhab (Liar/Fabricator)", "fa": "کذاب (دروغگو)", "ru": "Каззаб (Лжец)" }, { "color": OpinionStatus.ColorChoices.PURPLE, "en": "Mukhtalit (Confused)", "fa": "مختلط (آشفته)", "ru": "Мухталит (Запутанный)" }, { "color": OpinionStatus.ColorChoices.GRAY, "en": "Matruk (Abandoned)", "fa": "متروک", "ru": "Матрук (Оставленный)" }, ] created_statuses = [] for item in status_data: # Check if a status with this color already exists to avoid duplication status, created = OpinionStatus.objects.get_or_create( color=item["color"], defaults={ "title": self.create_json(item["en"], item["fa"], item["ru"]) } ) created_statuses.append(status) self.stdout.write(f"Ensured {len(created_statuses)} Opinion Statuses exist.") # ========================================== # DATA POOLS FOR GENERATION # ========================================== scholars_pool = [ {"en": "Al-Najashi", "fa": "نجاشی", "ru": "Аль-Наджаши"}, {"en": "Sheikh Al-Tusi", "fa": "شیخ طوسی", "ru": "Шейх ат-Туси"}, {"en": "Al-Dhahabi", "fa": "ذهبی", "ru": "Аз-Захаби"}, {"en": "Ibn Hajar", "fa": "ابن حجر", "ru": "Ибн Хаджар"}, {"en": "Al-Kashi", "fa": "کشی", "ru": "Аль-Кашши"}, ] opinion_texts_pool = [ { "en": "He is reliable in narration and clear in method.", "fa": "او در روایت موثق و در روش واضح است.", "ru": "Он надежен в передаче и ясен в методе." }, { "en": "There is weakness in his memory regarding dates.", "fa": "در حافظه او در مورد تاریخ‌ها ضعف وجود دارد.", "ru": "В его памяти есть слабость касательно дат." }, { "en": "He narrates strange reports (Manakir) from trustworthy people.", "fa": "او روایات عجیب (مناکیر) را از افراد موثق نقل می‌کند.", "ru": "Он передает странные сообщения (манакир) от надежных людей." }, { "en": "Highly truthful, but he makes mistakes.", "fa": "بسیار راستگو است، اما مرتکب اشتباه می‌شود.", "ru": "Очень правдивый, но совершает ошибки." }, { "en": "His status is unknown to the earlier scholars.", "fa": "وضعیت او بر علمای متقدم نامعلوم است.", "ru": "Его статус неизвестен ранним ученым." } ] original_text_titles = [ {"en": "Extract from Kitab al-Rijal", "fa": "برگزیده از کتاب الرجال", "ru": "Отрывок из Китаб ар-Риджаль"}, {"en": "Narration on Jurisprudence", "fa": "روایتی در باب فقه", "ru": "Предание о юриспруденции"}, {"en": "Commentary on Monotheism", "fa": "شرحی بر توحید", "ru": "Комментарий к Единобожию"}, {"en": "Biographical Note", "fa": "یادداشت زندگی‌نامه‌ای", "ru": "Биографическая заметка"}, ] original_text_bodies = [ { "en": "He narrated: 'Knowledge is the root of all good.'", "fa": "او روایت کرد: «دانش ریشه تمام خوبی‌هاست.»", "ru": "Он передал: 'Знание — корень всего блага'." }, { "en": "I heard him say in the gathering of Kufa...", "fa": "شنیدم که در مجلس کوفه می‌گفت...", "ru": "Я слышал, как он говорил в собрании Куфы..." }, { "en": "His writing was preserved in the scrolls of his students.", "fa": "نوشته‌های او در صحیفه‌های شاگردانش محفوظ ماند.", "ru": "Его писания сохранились в свитках его учеников." } ] # ========================================== # 2. SEED TRANSMITTERS # ========================================== transmitters = Transmitters.objects.all() total_transmitters = transmitters.count() if total_transmitters == 0: self.stdout.write(self.style.WARNING("No transmitters found. Please seed transmitters first.")) return self.stdout.write(f"Processing {total_transmitters} Transmitters...") opinions_created = 0 texts_created = 0 for i, transmitter in enumerate(transmitters, 1): if i % 50 == 0: self.stdout.write(f"Processing {i}/{total_transmitters}...") with transaction.atomic(): # --- A. Generate 3 Opinions --- for _ in range(3): scholar = random.choice(scholars_pool) op_text = random.choice(opinion_texts_pool) status = random.choice(created_statuses) TransmitterOpinion.objects.create( transmitter=transmitter, scholar_name=self.create_json(scholar["en"], scholar["fa"], scholar["ru"]), opinion_text=self.create_json(op_text["en"], op_text["fa"], op_text["ru"]), status=status ) opinions_created += 1 # --- B. Generate 3 Original Texts --- for k in range(3): title_base = random.choice(original_text_titles) body_base = random.choice(original_text_bodies) # Make title unique per transmitter to help slug generation t_en = f"{title_base['en']} - {transmitter.id}-{k}" t_fa = f"{title_base['fa']} - {transmitter.id}-{k}" t_ru = f"{title_base['ru']} - {transmitter.id}-{k}" TransmitterOriginalText.objects.create( transmitter=transmitter, title=self.create_json(t_en, t_fa, t_ru), text=self.create_json(body_base["en"], body_base["fa"], body_base["ru"]), # Source text translation=self.create_json(body_base["en"], body_base["fa"], body_base["ru"]), # Translations ) texts_created += 1 self.stdout.write(self.style.SUCCESS( f"Done! Created {opinions_created} Opinions and {texts_created} Original Texts." ))