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 |
|||
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, TransmitterOpinion, TransmitterOriginalText, OpinionStatus |
|||
# REPLACE 'apps.hadis.models' with your actual app path if different |
|||
from apps.hadis.models import Transmitters, TransmitterReliability |
|||
|
|||
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): |
|||
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(): |
|||
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