You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
9.2 KiB
197 lines
9.2 KiB
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."
|
|
))
|