Browse Source
Add management command to seed multilingual opinion data
Add management command to seed multilingual opinion data
- Introduced a new management command to seed OpinionStatus, TransmitterOpinion, and TransmitterOriginalText with multilingual data. - Implemented logic to create opinion statuses with corresponding colors and titles in English, Farsi, and Russian. - Added functionality to generate random opinions and original texts for transmitters, ensuring unique titles for each transmitter. - Enhanced data handling for better integration with existing models and improved seeding process.master
1 changed files with 197 additions and 0 deletions
@ -0,0 +1,197 @@ |
|||||
|
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." |
||||
|
)) |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue