11 changed files with 196 additions and 343 deletions
-
2apps/chat/migrations/0002_auto_20241125_1219.py
-
132apps/course/migrations/0004_alter_attachment_options_alter_glossary_options_and_more.py
-
42apps/course/migrations/0004_auto_20241122_1913.py
-
2apps/course/migrations/0005_add_database_indexes.py
-
2apps/course/migrations/0005_participant_unread_messages_count.py
-
82apps/hadis/management/commands/seed_hadis_transmitter.py
-
218apps/hadis/management/commands/seed_transmitters.py
-
4apps/hadis/models/hadis.py
-
8apps/hadis/models/transmitter.py
-
44apps/hadis/serializers/hadis.py
-
3entrypoint.sh
@ -1,132 +0,0 @@ |
|||||
# Generated by Django 5.1.8 on 2025-04-13 01:35 |
|
||||
|
|
||||
import django.db.models.deletion |
|
||||
import django.utils.timezone |
|
||||
from django.db import migrations, models |
|
||||
|
|
||||
|
|
||||
class Migration(migrations.Migration): |
|
||||
|
|
||||
dependencies = [ |
|
||||
('account', '0002_alter_user_phone_number'), |
|
||||
('course', '0003_alter_course_is_online_alter_course_timing_and_more'), |
|
||||
] |
|
||||
|
|
||||
operations = [ |
|
||||
migrations.AlterModelOptions( |
|
||||
name='attachment', |
|
||||
options={'verbose_name': 'Attachment', 'verbose_name_plural': 'Attachments'}, |
|
||||
), |
|
||||
migrations.AlterModelOptions( |
|
||||
name='glossary', |
|
||||
options={'verbose_name': 'Glossary', 'verbose_name_plural': 'Glossaries'}, |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='attachment', |
|
||||
name='course', |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='glossary', |
|
||||
name='course', |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='lesson', |
|
||||
name='course', |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='lesson', |
|
||||
name='is_active', |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='lesson', |
|
||||
name='priority', |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='attachment', |
|
||||
name='created_at', |
|
||||
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='attachment', |
|
||||
name='updated_at', |
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='glossary', |
|
||||
name='created_at', |
|
||||
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='glossary', |
|
||||
name='updated_at', |
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), |
|
||||
), |
|
||||
migrations.AlterField( |
|
||||
model_name='lesson', |
|
||||
name='content_type', |
|
||||
field=models.CharField(choices=[('youtube_link', 'Youtube Link'), ('video_file', 'Video File')], max_length=50, verbose_name='Content Type'), |
|
||||
), |
|
||||
migrations.CreateModel( |
|
||||
name='CourseAttachment', |
|
||||
fields=[ |
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), |
|
||||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), |
|
||||
('attachment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_attachments', to='course.attachment', verbose_name='Attachment')), |
|
||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='course.course', verbose_name='Course')), |
|
||||
], |
|
||||
options={ |
|
||||
'verbose_name': 'Course Attachment', |
|
||||
'verbose_name_plural': 'Course Attachments', |
|
||||
'ordering': ('-id',), |
|
||||
}, |
|
||||
), |
|
||||
migrations.CreateModel( |
|
||||
name='CourseGlossary', |
|
||||
fields=[ |
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), |
|
||||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), |
|
||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='glossaries', to='course.course', verbose_name='Course')), |
|
||||
('glossary', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_glossaries', to='course.glossary', verbose_name='Glossary')), |
|
||||
], |
|
||||
options={ |
|
||||
'verbose_name': 'Course Glossary', |
|
||||
'verbose_name_plural': 'Course Glossaries', |
|
||||
'ordering': ('-id',), |
|
||||
}, |
|
||||
), |
|
||||
migrations.CreateModel( |
|
||||
name='CourseLesson', |
|
||||
fields=[ |
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||
('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Course Lesson Title')), |
|
||||
('priority', models.IntegerField(blank=True, null=True, verbose_name='Priority')), |
|
||||
('is_active', models.BooleanField(default=True, verbose_name='Is Active')), |
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), |
|
||||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), |
|
||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='course.course', verbose_name='Course')), |
|
||||
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_lessons', to='course.lesson', verbose_name='Lesson')), |
|
||||
], |
|
||||
), |
|
||||
migrations.AlterUniqueTogether( |
|
||||
name='lessoncompletion', |
|
||||
unique_together=set(), |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='lessoncompletion', |
|
||||
name='course_lesson', |
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='completions', to='course.courselesson'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
migrations.AlterUniqueTogether( |
|
||||
name='lessoncompletion', |
|
||||
unique_together={('student', 'course_lesson')}, |
|
||||
), |
|
||||
migrations.RemoveField( |
|
||||
model_name='lessoncompletion', |
|
||||
name='lesson', |
|
||||
), |
|
||||
] |
|
||||
@ -1,42 +0,0 @@ |
|||||
# Generated by Django 3.2.4 on 2024-11-22 19:13 |
|
||||
|
|
||||
from django.db import migrations, models |
|
||||
import django.utils.timezone |
|
||||
|
|
||||
|
|
||||
class Migration(migrations.Migration): |
|
||||
|
|
||||
dependencies = [ |
|
||||
('course', '0003_participant'), |
|
||||
] |
|
||||
|
|
||||
operations = [ |
|
||||
migrations.AddField( |
|
||||
model_name='course', |
|
||||
name='created_at', |
|
||||
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='course', |
|
||||
name='updated_at', |
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='lesson', |
|
||||
name='created_at', |
|
||||
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='lesson', |
|
||||
name='updated_at', |
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), |
|
||||
), |
|
||||
migrations.AddField( |
|
||||
model_name='lessoncompletion', |
|
||||
name='created_at', |
|
||||
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), |
|
||||
preserve_default=False, |
|
||||
), |
|
||||
] |
|
||||
@ -1,109 +1,133 @@ |
|||||
import random |
import random |
||||
from django.core.management.base import BaseCommand |
from django.core.management.base import BaseCommand |
||||
from django.db import transaction |
from django.db import transaction |
||||
# REPLACE 'apps.hadis.models' WITH YOUR ACTUAL APP PATH |
|
||||
from apps.hadis.models import Transmitters, TransmitterOpinion, TransmitterOriginalText, OpinionStatus |
|
||||
|
# REPLACE 'apps.hadis.models' with your actual app path if different |
||||
|
from apps.hadis.models import Transmitters, TransmitterReliability |
||||
|
|
||||
class Command(BaseCommand): |
class Command(BaseCommand): |
||||
help = 'Seeds TransmitterOpinion and TransmitterOriginalText for transmitters 84-91' |
|
||||
|
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): |
def handle(self, *args, **options): |
||||
self.stdout.write("Starting Transmitter Details seeding...") |
|
||||
|
|
||||
# --------------------------------------------------------- |
|
||||
# 1. Fetch Target Objects |
|
||||
# --------------------------------------------------------- |
|
||||
transmitters = Transmitters.objects.filter(id__range=(84, 91)) |
|
||||
|
|
||||
if not transmitters.exists(): |
|
||||
self.stdout.write(self.style.ERROR("No Transmitters found in range 84-91.")) |
|
||||
return |
|
||||
|
self.stdout.write("Starting to seed transmitters...") |
||||
|
|
||||
# Fetch OpinionStatus objects |
|
||||
# We need these to populate the 'status' ForeignKey in TransmitterOpinion |
|
||||
statuses = list(OpinionStatus.objects.all()) |
|
||||
|
# 1. Fetch available reliability IDs (7-17) |
||||
|
# We assume these exist based on your prompt. |
||||
|
reliability_ids = list(range(7, 18)) |
||||
|
|
||||
# Fallback: If no statuses exist, we can't create opinions safely without knowing your Status model fields. |
|
||||
if not statuses: |
|
||||
self.stdout.write(self.style.ERROR("No 'OpinionStatus' objects found! Please create some via Admin first.")) |
|
||||
return |
|
||||
|
|
||||
self.stdout.write(f"Found {transmitters.count()} Transmitters and {len(statuses)} Opinion Statuses.") |
|
||||
|
|
||||
# --------------------------------------------------------- |
|
||||
# 2. Data Generators (Helpers) |
|
||||
# --------------------------------------------------------- |
|
||||
scholars = [ |
|
||||
{"en": "Al-Dhahabi", "ar": "الذهبي", "fa": "ذهبی"}, |
|
||||
{"en": "Ibn Hajar", "ar": "ابن حجر", "fa": "ابن حجر"}, |
|
||||
{"en": "Al-Tusi", "ar": "الطوسي", "fa": "طوسی"}, |
|
||||
{"en": "Al-Najashi", "ar": "النجاشي", "fa": "نجاشی"}, |
|
||||
] |
|
||||
|
|
||||
opinion_texts = [ |
|
||||
{"en": "He is trustworthy and reliable.", "ar": "هو ثقة ثبت.", "fa": "او ثقه و مورد اعتماد است."}, |
|
||||
{"en": "His memory was weak in later years.", "ar": "كان سيء الحفظ في آخره.", "fa": "حافظه او در اواخر عمر ضعیف بود."}, |
|
||||
{"en": "Unknown status.", "ar": "مجهول الحال.", "fa": "مجهول است."}, |
|
||||
{"en": "Highly praised by scholars.", "ar": "ممدوح عند العلماء.", "fa": "مورد ستایش علما است."}, |
|
||||
] |
|
||||
|
|
||||
book_titles = [ |
|
||||
{"en": "Book of Traditions", "ar": "كتاب الحديث", "fa": "کتاب حدیث"}, |
|
||||
{"en": "Treatise on Rights", "ar": "رسالة الحقوق", "fa": "رساله حقوق"}, |
|
||||
{"en": "The Clarification", "ar": "التبين", "fa": "تبیین"}, |
|
||||
{"en": "Collection of Virtues", "ar": "مجموع الفضائل", "fa": "مجموعه فضائل"}, |
|
||||
|
# 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", "آمل", "Амоль"), |
||||
] |
] |
||||
|
|
||||
def make_json_field(data_dict): |
|
||||
"""Converts simple dict {'en': 'X', 'fa': 'Y'} to your model's JSON structure""" |
|
||||
return [ |
|
||||
{"language_code": "en", "text": data_dict.get("en", "")}, |
|
||||
{"language_code": "ar", "text": data_dict.get("ar", "")}, |
|
||||
{"language_code": "fa", "text": data_dict.get("fa", "")}, |
|
||||
] |
|
||||
|
|
||||
# --------------------------------------------------------- |
|
||||
# 3. Creation Loop |
|
||||
# --------------------------------------------------------- |
|
||||
counts = {'opinions': 0, 'texts': 0} |
|
||||
|
|
||||
|
# 3. Execution Loop |
||||
|
created_count = 0 |
||||
with transaction.atomic(): |
with transaction.atomic(): |
||||
for t in transmitters: |
|
||||
self.stdout.write(f"Processing {t.full_name[0]['text'] if t.full_name else t.id}...") |
|
||||
|
|
||||
# --- A. Create TransmitterOpinion (1 to 2 per person) --- |
|
||||
for _ in range(random.randint(1, 2)): |
|
||||
scholar = random.choice(scholars) |
|
||||
text = random.choice(opinion_texts) |
|
||||
status = random.choice(statuses) |
|
||||
|
|
||||
TransmitterOpinion.objects.create( |
|
||||
transmitter=t, |
|
||||
scholar_name=make_json_field(scholar), |
|
||||
opinion_text=make_json_field(text), |
|
||||
status=status |
|
||||
) |
|
||||
counts['opinions'] += 1 |
|
||||
|
|
||||
# --- B. Create TransmitterOriginalText (1 to 2 per person) --- |
|
||||
for _ in range(random.randint(1, 2)): |
|
||||
title = random.choice(book_titles) |
|
||||
# Simple dummy text |
|
||||
body = { |
|
||||
"en": f"This is an excerpt from {title['en']}...", |
|
||||
"ar": f"هذا مقتطف من {title['ar']}...", |
|
||||
"fa": f"این بخشی از {title['fa']} است..." |
|
||||
} |
|
||||
|
|
||||
TransmitterOriginalText.objects.create( |
|
||||
transmitter=t, |
|
||||
title=make_json_field(title), |
|
||||
text=make_json_field(body), |
|
||||
translation=make_json_field(body), # Using same text for translation as placeholder |
|
||||
# Note: 'slug' and 'share_link' are handled by your model's save() method automatically |
|
||||
) |
|
||||
counts['texts'] += 1 |
|
||||
|
|
||||
self.stdout.write(self.style.SUCCESS( |
|
||||
f"Done! Created {counts['opinions']} Opinions and {counts['texts']} Original Texts." |
|
||||
)) |
|
||||
|
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!")) |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue