import random from django.core.management.base import BaseCommand from django.core.exceptions import ObjectDoesNotExist # Ensure these imports match your actual app structure from apps.hadis.models import ( NarratorLayer, Transmitters, HadisTransmitter, TransmitterOpinion, TransmitterOriginalText, Hadis ) class Command(BaseCommand): help = 'Seeds the database with mock Transmitters, Layers, and Chains' def create_json_field(self, en_text, fa_text, ru_text): """Helper to create your specific JSON format with Russian added""" 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 Transmitters Mock Data Generation (Trilingual) ---") # --------------------------------------------------------- # 1. Create Narrator Layers (Tabaqat) # --------------------------------------------------------- self.stdout.write("Creating Narrator Layers...") layers_data = [ (1, "Companions", "صحابه", "Сподвижники", "Companions of the Prophet", "یاران پیامبر", "Сподвижники Пророка"), (2, "Successors", "تابعین", "Табиины", "The generation after Companions", "نسل بعد از صحابه", "Поколение после сподвижников"), (3, "Successors of Successors", "تابع تابعین", "Таби ат-Табиин", "The third generation", "نسل سوم", "Третье поколение передатчиков"), (4, "Students of the Imams", "شاگردان ائمه", "Ученики Имамов", "Direct students of the Imams", "شاگردان مستقیم ائمه", "Прямые ученики Имамов"), (5, "Minor Narrators", "راویان جزئی", "Малые передатчики", "Lesser known narrators", "راویان کمتر شناخته شده", "Малоизвестные передатчики"), ] created_layers = [] for num, en, fa, ru, en_d, fa_d, ru_d in layers_data: layer, created = NarratorLayer.objects.get_or_create( number=num, defaults={ 'name': self.create_json_field(en, fa, ru), 'description': self.create_json_field(en_d, fa_d, ru_d) } ) created_layers.append(layer) self.stdout.write(self.style.SUCCESS(f"Verified {len(created_layers)} layers.")) # --------------------------------------------------------- # 2. Create Transmitters # --------------------------------------------------------- self.stdout.write("Creating Transmitters...") transmitters_list = [ { "full_name": ("Zurarah bin Ayan", "زرارة بن اعین", "Зурара ибн Аян"), "kunya": ("Abu Ali", "ابو علی", "Абу Али"), "origin": ("Kufa", "کوفه", "Куфа"), "reliability": Transmitters.ReliabilityLevel.VERY_RELIABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 150, "layer": 4 }, { "full_name": ("Muhammad bin Muslim", "محمد بن مسلم", "Мухаммад ибн Муслим"), "kunya": ("Abu Ja'far", "ابو جعفر", "Абу Джафар"), "origin": ("Kufa", "کوفه", "Куфа"), "reliability": Transmitters.ReliabilityLevel.VERY_RELIABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 150, "layer": 4 }, { "full_name": ("Abu Basir Al-Asadi", "ابو بصیر الاسدی", "Абу Басир Аль-Асади"), "kunya": ("Abu Muhammad", "ابو محمد", "Абу Мухаммад"), "origin": ("Kufa", "کوفه", "Куфа"), "reliability": Transmitters.ReliabilityLevel.RELIABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 150, "layer": 4 }, { "full_name": ("Yunus bin Abd al-Rahman", "یونس بن عبدالرحمن", "Юнус ибн Абд ар-Рахман"), "kunya": ("Abu Muhammad", "ابو محمد", "Абу Мухаммад"), "origin": ("Baghdad", "بغداد", "Багдад"), "reliability": Transmitters.ReliabilityLevel.VERY_RELIABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 208, "layer": 3 }, { "full_name": ("Hammad bin Isa", "حماد بن عیسی", "Хаммад ибн Иса"), "kunya": ("Abu Amin", "ابو امین", "Абу Амин"), "origin": ("Basra", "بصره", "Басра"), "reliability": Transmitters.ReliabilityLevel.RELIABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 209, "layer": 3 }, { "full_name": ("Ibrahim bin Hashim", "ابراهیم بن هاشم", "Ибрагим ибн Хашим"), "kunya": ("Abu Ishaq", "ابو اسحاق", "Абу Исхак"), "origin": ("Qom", "قم", "Кум"), "reliability": Transmitters.ReliabilityLevel.ACCEPTABLE, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 250, "layer": 2 }, { "full_name": ("Sahl bin Ziyad", "سهل بن زیاد", "Сахль ибн Зияд"), "kunya": ("Abu Sa'id", "ابو سعید", "Абу Саид"), "origin": ("Rayy", "ری", "Рей"), "reliability": Transmitters.ReliabilityLevel.WEAK, "madhhab": Transmitters.MadhhabChoices.SHIA, "died": 255, "layer": 2 }, { "full_name": ("Jabir bin Hayyan", "جابر بن حیان", "Джабир ибн Хайян"), "kunya": ("Abu Musa", "ابو موسی", "Абу Муса"), "origin": ("Tus", "توس", "Тус"), "reliability": Transmitters.ReliabilityLevel.UNKNOWN, "madhhab": Transmitters.MadhhabChoices.OTHER, "died": 195, "layer": 3 }, ] created_transmitters = [] for t_data in transmitters_list: # Check if exists by simple slug check (EN name) en_name = t_data["full_name"][0] # Replace spaces with dash for rough slug matching slug_guess = en_name.lower().replace(' ', '-') existing = Transmitters.objects.filter(slug__startswith=slug_guess) if existing.exists(): self.stdout.write(f"Skipping {en_name}, likely exists.") created_transmitters.append(existing.first()) continue transmitter = Transmitters( full_name=self.create_json_field(*t_data["full_name"]), kunya=self.create_json_field(*t_data["kunya"]), origin=self.create_json_field(*t_data["origin"]), lived_in=self.create_json_field(*t_data["origin"]), died_in=self.create_json_field("Unknown", "نامشخص", "Неизвестно"), reliability=t_data["reliability"], madhhab=t_data["madhhab"], death_year_hijri=t_data["died"], description=self.create_json_field( f"A narrator from {t_data['origin'][0]}", f"راوی اهل {t_data['origin'][1]}", f"Передатчик из города {t_data['origin'][2]}" ) ) transmitter.save() created_transmitters.append(transmitter) self.stdout.write(self.style.SUCCESS(f"Created transmitter: {en_name}")) # --------------------------------------------------------- # 3. Create Opinions # --------------------------------------------------------- self.stdout.write("Adding Opinions...") if created_transmitters: t_target = created_transmitters[0] # Zurarah TransmitterOpinion.objects.create( transmitter=t_target, scholar_name=self.create_json_field("Al-Najashi", "النجاشی", "Аль-Наджаши"), opinion_text=self.create_json_field( "He is the master of our companions and their teacher.", "او بزرگ اصحاب ما و استاد آنان است.", "Он — господин наших сподвижников и их учитель." ), status=TransmitterOpinion.OpinionStatus.CONFIRMED ) t_weak = next((t for t in created_transmitters if t.reliability == 'weak'), None) if t_weak: TransmitterOpinion.objects.create( transmitter=t_weak, scholar_name=self.create_json_field("Ibn al-Ghadairi", "ابن الغضائری", "Ибн аль-Гадаири"), opinion_text=self.create_json_field( "Weak in hadith, extremist in belief.", "ضعیف در حدیث، غالی در مذهب.", "Слаб в хадисах, экстремист в убеждениях." ), status=TransmitterOpinion.OpinionStatus.REJECTED ) # --------------------------------------------------------- # 4. Create Original Texts # --------------------------------------------------------- self.stdout.write("Adding Original Texts...") if created_transmitters: t_author = created_transmitters[1] # Muhammad bin Muslim TransmitterOriginalText.objects.create( transmitter=t_author, title=self.create_json_field( "Book of Four Hundred Problems", "کتاب چهارصد مسئله", "Книга четырехсот вопросов" ), text=self.create_json_field( "Content of the book regarding jurisprudence...", "محتوای کتاب در مورد فقه...", "Содержание книги по исламскому праву..." ), translation=self.create_json_field( "English Translation...", "ترجمه فارسی...", "Русский перевод..." ), ) # --------------------------------------------------------- # 5. Link Transmitters to Hadis # --------------------------------------------------------- self.stdout.write("Linking Transmitters to Hadis (1877-1888)...") target_hadis_ids = range(1877, 1889) for hadis_id in target_hadis_ids: try: hadis_obj = Hadis.objects.get(id=hadis_id) except ObjectDoesNotExist: self.stdout.write(self.style.WARNING(f"Hadis ID {hadis_id} not found. Skipping.")) continue HadisTransmitter.objects.filter(hadis=hadis_obj).delete() # Create a random chain of 3 transmitters chain_length = 3 chain_narrators = random.sample(created_transmitters, min(len(created_transmitters), chain_length)) for index, narrator in enumerate(chain_narrators): layer_obj = NarratorLayer.objects.get(number=5-index) if index < 5 else None HadisTransmitter.objects.create( hadis=hadis_obj, transmitter=narrator, narrator_layer=layer_obj, order=index + 1, status=HadisTransmitter.ReliabilityStatus.RELIABLE, is_gap=False ) self.stdout.write(f"Created chain for Hadis {hadis_id} with {len(chain_narrators)} transmitters.") self.stdout.write(self.style.SUCCESS("--- Mock Data Generation Complete ---"))