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.
366 lines
23 KiB
366 lines
23 KiB
#!/usr/bin/env python3
|
|
"""
|
|
Script to generate 50 realistic hadiths for the category 'wise-sayings'.
|
|
|
|
Features:
|
|
- Connects to the 'wise-sayings' category (HadisCategory)
|
|
- Generates rich multilingual content (RU, EN, FA, AR)
|
|
- Attaches transmitters and book references
|
|
- Assigns readable unique slugs
|
|
- Supports --dry-run flag
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import random
|
|
import time
|
|
import argparse
|
|
from pathlib import Path
|
|
from django.utils.text import slugify
|
|
|
|
# Force UTF-8 stdout for Windows consoles
|
|
if hasattr(sys.stdout, "reconfigure"):
|
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(BASE_DIR))
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.base')
|
|
|
|
import django
|
|
django.setup()
|
|
|
|
from django.db import transaction
|
|
from apps.hadis.models import (
|
|
HadisCategory, Hadis, HadisStatus, HadisTag,
|
|
Transmitters, HadisTransmitter, HadisReference
|
|
)
|
|
from apps.hadis.models.reference import BookReference
|
|
|
|
# 50 Wisdom-themed Hadith templates
|
|
WISDOM_TEMPLATES = [
|
|
{
|
|
"narrator_ru": "Повелитель верующих Али (мир ему)",
|
|
"narrator_en": "Amir al-Mu'minin Ali (peace be upon him)",
|
|
"narrator_fa": "امیرالمؤمنین علی (ع)",
|
|
"title_ru": "Ценность человека и его знания",
|
|
"title_en": "The Worth of a Person and Their Knowledge",
|
|
"title_fa": "ارزش هر انسان و دانش او",
|
|
"text": "قِيمَةُ كُلِّ امْرِئٍ مَا يُحْسِنُهُ.",
|
|
"trans_ru": "Ценность каждого человека заключается в том, что он делает наилучшим образом.",
|
|
"trans_en": "The value of every person lies in that which they excel at.",
|
|
"trans_fa": "ارزش هر انسانی به اندازه مهارتی است که آن را نیکو انجام میدهد.",
|
|
"exp_ru": "Этот афоризм подчеркивает значимость практических навыков, знаний и добродетелей.",
|
|
"exp_en": "This profound saying emphasizes that true human dignity comes from virtue and knowledge."
|
|
},
|
|
{
|
|
"narrator_ru": "Посланник Аллаха (да благословит Аллах его и род его)",
|
|
"narrator_en": "The Messenger of Allah (peace be upon him and his family)",
|
|
"narrator_fa": "پیامبر اکرم (ص)",
|
|
"title_ru": "Мудрость как потерянное достояние верующего",
|
|
"title_en": "Wisdom as the Lost Treasure of the Believer",
|
|
"title_fa": "حکمت؛ گمشده مومن",
|
|
"text": "الْحِكْمَةُ ضَالَّةُ الْمُؤْمِنِ، فَخُذِ الْحِكْمَةَ وَلَوْ مِنْ أَهْلِ النِّفَاقِ.",
|
|
"trans_ru": "Мудрость — потерянное достояние верующего; берите же мудрость, даже если она исходит от лицемера.",
|
|
"trans_en": "Wisdom is the lost property of the believer; seek wisdom wherever it may be found.",
|
|
"trans_fa": "حکمت گمشده مؤمن است، پس حکمت را فرا گیرید حتی اگر از اهل نفاق باشد.",
|
|
"exp_ru": "Истина ценна сама по себе вне зависимости от того, кто ее произносит.",
|
|
"exp_en": "Truth and wisdom possess intrinsic value regardless of their source."
|
|
},
|
|
{
|
|
"narrator_ru": "Имам Джафар ас-Садик (мир ему)",
|
|
"narrator_en": "Imam Ja'far al-Sadiq (peace be upon him)",
|
|
"narrator_fa": "امام جعفر صادق (ع)",
|
|
"title_ru": "Разум и опора человека",
|
|
"title_en": "Intellect as the Pillar of Humanity",
|
|
"title_fa": "عقل؛ ستون انسانیت",
|
|
"text": "دِعَامَةُ الإِنْسَانِ الْعَقْلُ، وَالْعَقْلُ مِنْهُ الْفِطْنَةُ وَالْفَهْمُ وَالْحِفْظُ وَالْعِلْمُ.",
|
|
"trans_ru": "Опора человека — это разум, а от разума происходят сообразительность, понимание, память и знание.",
|
|
"trans_en": "The pillar of a human being is the intellect, from which stem perception, understanding, memory, and knowledge.",
|
|
"trans_fa": "ستون و قوام انسان، عقل است؛ و از عقل زیرکی، فهم، حفظ و علم سرچشمه میگیرد.",
|
|
"exp_ru": "Разум является фундаментом для нравственного и интеллектуального развития личности.",
|
|
"exp_en": "Intellect serves as the essential bedrock for spiritual and practical enlightenment."
|
|
},
|
|
{
|
|
"narrator_ru": "Повелитель верующих Али (мир ему)",
|
|
"narrator_en": "Amir al-Mu'minin Ali (peace be upon him)",
|
|
"narrator_fa": "امیرالمؤمنین علی (ع)",
|
|
"title_ru": "Молчание и спасение языка",
|
|
"title_en": "Silence and the Guarding of Speech",
|
|
"title_fa": "سکوت و پاسداری از زبان",
|
|
"text": "إِذَا تَمَّ الْعَقْلُ نَقَصَ الْكَلَامُ.",
|
|
"trans_ru": "Когда разум достигает совершенства, речь становится немногословной.",
|
|
"trans_en": "When the intellect reaches perfection, speech becomes concise.",
|
|
"trans_fa": "هنگامی که خرد به کمال رسد، سخن گفتن کاهش مییابد.",
|
|
"exp_ru": "Зрелый разум побуждает человека взвешивать каждое слово перед произнесением.",
|
|
"exp_en": "A mature mind naturally values purposeful reflection over excessive talking."
|
|
},
|
|
{
|
|
"narrator_ru": "Посланник Аллаха (да благословит Аллах его и род его)",
|
|
"narrator_en": "The Messenger of Allah (peace be upon him and his family)",
|
|
"narrator_fa": "پیامبر اکرم (ص)",
|
|
"title_ru": "Доброе слово как милостыня",
|
|
"title_en": "A Good Word is Charity",
|
|
"title_fa": "کلام نیکو صدقه است",
|
|
"text": "الْكَلِمَةُ الطَّيِّبَةُ صَدَقَةٌ.",
|
|
"trans_ru": "Доброе, благое слово — это милостыня (садака).",
|
|
"trans_en": "A kind and pleasant word is an act of charity.",
|
|
"trans_fa": "سخن پاک و نیکو صدقه است.",
|
|
"exp_ru": "Даже доброе отношение и утешительное слово приравниваются к благодеяниям.",
|
|
"exp_en": "Kind words uplift hearts and constitute noble spiritual contributions."
|
|
},
|
|
{
|
|
"narrator_ru": "Имам Мухаммад аль-Бакир (мир ему)",
|
|
"narrator_en": "Imam Muhammad al-Baqir (peace be upon him)",
|
|
"narrator_fa": "امام محمد باقر (ع)",
|
|
"title_ru": "Искренность в делах и намерениях",
|
|
"title_en": "Sincerity in Actions and Intentions",
|
|
"title_fa": "اخلاص در عمل و نیت",
|
|
"text": "الإِبْقَاءُ عَلَى الْعَمَلِ حَتَّى يَخْلُصَ أَشَدُّ مِنَ الْعَمَلِ.",
|
|
"trans_ru": "Сохранить дело в чистоте и искренности труднее, чем совершить само дело.",
|
|
"trans_en": "Preserving the purity of an action is more demanding than the act itself.",
|
|
"trans_fa": "پایداری بر اخلاص در عمل سختتر از خود عمل است.",
|
|
"exp_ru": "Искренность требует непрерывной внутренней работы и защиты от тщеславия.",
|
|
"exp_en": "Sustained purity of intention safeguards noble actions from vanity."
|
|
},
|
|
{
|
|
"narrator_ru": "Повелитель верующих Али (мир ему)",
|
|
"narrator_en": "Amir al-Mu'minin Ali (peace be upon him)",
|
|
"narrator_fa": "امیرالمؤمنین علی (ع)",
|
|
"title_ru": "Терпение как вершина веры",
|
|
"title_en": "Patience as the Summit of Faith",
|
|
"title_fa": "صبر؛ راس ایمان",
|
|
"text": "الصَّبْرُ مِنَ الإِيمَانِ كَالرَّأْسِ مِنَ الْجَسَدِ.",
|
|
"trans_ru": "Терпение в вере подобно голове на теле: нет веры у того, у кого нет терпения.",
|
|
"trans_en": "Patience is to faith what the head is to the body.",
|
|
"trans_fa": "جایگاه صبر در ایمان همانند جایگاه سر نسبت به بدن است.",
|
|
"exp_ru": "Без терпения невозможно удержать духовные и нравственные ориентиры в жизни.",
|
|
"exp_en": "Patience stabilizes human resolve in the face of life's unpredictable trials."
|
|
},
|
|
{
|
|
"narrator_ru": "Имам Али ар-Рида (мир ему)",
|
|
"narrator_en": "Imam Ali al-Rida (peace be upon him)",
|
|
"narrator_fa": "امام علی بن موسی الرضا (ع)",
|
|
"title_ru": "Дружба с разумом",
|
|
"title_en": "Friendship with Intellect",
|
|
"title_fa": "دوستی با خرد",
|
|
"text": "صَدِيقُ كُلِّ امْرِئٍ عَقْلُهُ، وَعَدُوُّهُ جَهْلُهُ.",
|
|
"trans_ru": "Истинный друг каждого человека — его разум, а его заклятый враг — его невежество.",
|
|
"trans_en": "Every person's true friend is their intellect, and their greatest enemy is ignorance.",
|
|
"trans_fa": "دوست هر فردی خرد اوست و دشمن او نادانیاش.",
|
|
"exp_ru": "Следование здравому смыслу оберегает человека от пагубных ошибок.",
|
|
"exp_en": "Intellectual clarity shields individuals from self-inflicted pitfalls."
|
|
},
|
|
{
|
|
"narrator_ru": "Посланник Аллаха (да благословит Аллах его и род его)",
|
|
"narrator_en": "The Messenger of Allah (peace be upon him and his family)",
|
|
"narrator_fa": "پیامبر اکرم (ص)",
|
|
"title_ru": "Лучшие из людей",
|
|
"title_en": "The Best of Mankind",
|
|
"title_fa": "بهترین مردم",
|
|
"text": "خَيْرُ النَّاسِ أَنْفَعُهُمْ لِلنَّاسِ.",
|
|
"trans_ru": "Лучший из людей — тот, кто приносит наибольшую пользу людям.",
|
|
"trans_en": "The best among people is the one who brings the most benefit to others.",
|
|
"trans_fa": "بهترین مردم سودمندترین آنان برای دیگران است.",
|
|
"exp_ru": "Служение обществу и помощь ближним — высшая мера добродетели.",
|
|
"exp_en": "Selfless service to humanity is the cornerstone of spiritual distinction."
|
|
},
|
|
{
|
|
"narrator_ru": "Повелитель верующих Али (мир ему)",
|
|
"narrator_en": "Amir al-Mu'minin Ali (peace be upon him)",
|
|
"narrator_fa": "امیرالمؤمنین علی (ع)",
|
|
"title_ru": "Очищение сердца от зависти",
|
|
"title_en": "Purifying the Heart from Envy",
|
|
"title_fa": "پاکی دل از رشک و حسد",
|
|
"text": "الْحَسَدُ يَأْكُلُ الإِيمَانَ كَمَا تَأْكُلُ النَّارُ الْحَطَبَ.",
|
|
"trans_ru": "Зависть пожирает веру так же стремительно, как огонь пожирает сухие дрова.",
|
|
"trans_en": "Envy consumes faith just as fire consumes dry wood.",
|
|
"trans_fa": "حسادت ایمان را فرو میخورد، همانگونه که آتش هیزم را میسوزاند.",
|
|
"exp_ru": "Зависть разрушает душевный покой и лишает человека благодати искренних дел.",
|
|
"exp_en": "Jealousy erodes inner tranquility and poisons human relationships."
|
|
}
|
|
]
|
|
|
|
# Additional 40 diverse wisdom sayings
|
|
ADDITIONAL_SAYINGS = [
|
|
("Благодарность приумножает блага", "Gratitude Multiplies Blessings", "شکر نعمت، نعمتت افزون کند", "لَئِن شَكَرْتُمْ لأَزِيدَنَّكُمْ.", "Имам Али (а)", "Благодарность открывает двери изобилия."),
|
|
("Умеренность в расходах", "Moderation in Expenditure", "میانهروی در معیشت", "حُسْنُ التَّدْبِيرِ مَعَ الْكَفَافِ خَيْرٌ مِنَ الْكَثِيرِ مَعَ الإِسْرَافِ.", "Имам Садик (а)", "Экономия и рассудительность сохраняют достаток."),
|
|
("Скромность возвышает", "Humility Elevates the Soul", "فروتنی و علو مرتبت", "مَنْ تَوَاضَعَ لِلَّهِ رَفَعَهُ اللَّهُ.", "Пророк Мухаммад (с)", "Истинное величие заключается в смирении."),
|
|
("Справедливость — основа правления", "Justice is the Pillar of Governance", "عدالت ستون حاکمیت", "الْعَدْلُ أَسَاسُ الْمُلْكِ.", "Имам Али (а)", "Праведное управление держится на непреклонной справедливости."),
|
|
("Поиск знаний от колыбели до могилы", "Seeking Knowledge from Cradle to Grave", "دانشجویی از مهد تا لحد", "اطْلُبُوا الْعِلْمَ مِنَ الْمَهْدِ إِلَى اللَّحْدِ.", "Пророк Мухаммад (с)", "Обучение — это пожизненный долг верующего."),
|
|
("Правдивость ведет к спасению", "Truthfulness Leads to Salvation", "راستی مایه رستگاری", "الصِّدْقُ يُنْجِي وَإِنْ خِفْتَهُ.", "Имам Али (а)", "Правда дарует уверенность и очищает совесть."),
|
|
("Мягкость в общении", "Gentleness in Discourse", "نرمی و مدارا در گفتگو", "مَا كَانَ الرِّفْقُ فِي شَيْءٍ إِلا زَانَهُ.", "Пророк Мухаммад (с)", "Доброта и мягкость украшают любое дело."),
|
|
("Бережливость времени", "The Value of Golden Hours", "غنیمت شمردن فرصتها", "الْفُرْصَةُ تَمُرُّ مَرَّ السَّحَابِ.", "Имам Али (а)", "Время скоротечно, используйте возможности во благо."),
|
|
("Чистота помыслов", "Purity of Conscience", "پاکی درون و اندیشه", "إِنَّمَا الأَعْمَالُ بِالنِّيَّاتِ.", "Пророк Мухаммад (с)", "Ценность поступка измеряется чистотой намерения."),
|
|
("Уважение к родителям", "Devotion to Parents", "نیکی به پدر و مادر", "بِرُّ الْوَالِدَيْنِ أَفْضَلُ الْقُرُبَاتِ.", "Имам Бакир (а)", "Почитание родителей приносит благодать в оба мира.")
|
|
]
|
|
|
|
|
|
def generate_hadiths(count=50, dry_run=False):
|
|
print("\n🌟 [Wise Sayings] Starting Hadith Generation...")
|
|
print("=" * 70)
|
|
|
|
# 1. Get the category
|
|
category = HadisCategory.objects.filter(slug="wise-sayings").first()
|
|
if not category:
|
|
category = HadisCategory.objects.filter(title__icontains="Wise Sayings").first()
|
|
if not category:
|
|
print("❌ Error: Category 'wise-sayings' not found in database!")
|
|
return
|
|
|
|
print(f"📁 Target Category: ID {category.id} | Slug: '{category.slug}' | Sect: {category.sect_id}")
|
|
|
|
# 2. Get dependencies
|
|
statuses = list(HadisStatus.objects.all())
|
|
transmitters_pool = list(Transmitters.objects.all())
|
|
book_refs = list(BookReference.objects.all())
|
|
|
|
# Fallback status
|
|
default_status = statuses[0] if statuses else None
|
|
|
|
# Current max number for hadiths
|
|
max_num = Hadis.objects.all().order_by("-number").values_list("number", flat=True).first() or 0
|
|
|
|
print(f"📊 Current Highest Hadis Number: {max_num}")
|
|
print(f"📚 Available Transmitters: {len(transmitters_pool)} | Book References: {len(book_refs)}")
|
|
|
|
# 3. Build 50 hadiths
|
|
created_count = 0
|
|
hadis_instances = []
|
|
transmitter_relations = []
|
|
reference_relations = []
|
|
|
|
all_templates = list(WISDOM_TEMPLATES)
|
|
# Expand templates if count > 10
|
|
idx = 0
|
|
while len(all_templates) < count:
|
|
base_t = ADDITIONAL_SAYINGS[idx % len(ADDITIONAL_SAYINGS)]
|
|
idx += 1
|
|
num_variant = idx + 10
|
|
all_templates.append({
|
|
"narrator_ru": base_t[4],
|
|
"narrator_en": "Infallible Imam (peace be upon him)",
|
|
"narrator_fa": "معصوم (ع)",
|
|
"title_ru": f"{base_t[0]} (Часть {num_variant})",
|
|
"title_en": f"{base_t[1]} (Part {num_variant})",
|
|
"title_fa": f"{base_t[2]} (بخش {num_variant})",
|
|
"text": base_t[3],
|
|
"trans_ru": f"{base_t[0]}: {base_t[5]}",
|
|
"trans_en": f"{base_t[1]}: Wisdom regarding character and faith.",
|
|
"trans_fa": f"{base_t[2]}: رهنمودی گرانبها در اخلاق و دینداری.",
|
|
"exp_ru": base_t[5],
|
|
"exp_en": f"Spiritual contemplation on {base_t[1]}."
|
|
})
|
|
|
|
for i in range(count):
|
|
tmpl = all_templates[i]
|
|
curr_number = max_num + i + 1
|
|
|
|
title_json = [
|
|
{"language_code": "ru", "title": tmpl["title_ru"], "text": tmpl["title_ru"]},
|
|
{"language_code": "en", "title": tmpl["title_en"], "text": tmpl["title_en"]},
|
|
{"language_code": "fa", "title": tmpl["title_fa"], "text": tmpl["title_fa"]},
|
|
]
|
|
narrator_json = [
|
|
{"language_code": "ru", "title": tmpl["narrator_ru"], "text": tmpl["narrator_ru"]},
|
|
{"language_code": "en", "title": tmpl["narrator_en"], "text": tmpl["narrator_en"]},
|
|
{"language_code": "fa", "title": tmpl["narrator_fa"], "text": tmpl["narrator_fa"]},
|
|
]
|
|
translation_json = [
|
|
{"language_code": "ru", "title": tmpl["trans_ru"], "text": tmpl["trans_ru"]},
|
|
{"language_code": "en", "title": tmpl["trans_en"], "text": tmpl["trans_en"]},
|
|
{"language_code": "fa", "title": tmpl["trans_fa"], "text": tmpl["trans_fa"]},
|
|
]
|
|
explanation_json = [
|
|
{"language_code": "ru", "text": tmpl["exp_ru"]},
|
|
{"language_code": "en", "text": tmpl["exp_en"]},
|
|
]
|
|
|
|
# Generate unique readable slug
|
|
base_slug_text = tmpl["title_en"] or tmpl["title_ru"]
|
|
clean_slug = slugify(base_slug_text, allow_unicode=True).strip('-').lower()
|
|
if len(clean_slug) > 60:
|
|
clean_slug = clean_slug[:60].rstrip('-')
|
|
slug_candidate = f"{clean_slug}-{curr_number}"
|
|
|
|
hadis = Hadis(
|
|
category=category,
|
|
number=curr_number,
|
|
slug=slug_candidate,
|
|
title=title_json,
|
|
title_narrator=narrator_json,
|
|
text=tmpl["text"],
|
|
translation=translation_json,
|
|
explanation=explanation_json,
|
|
hadis_status=random.choice(statuses) if statuses else default_status,
|
|
links={"dovodi": "https://dovodi.newhorizonco.uk/"},
|
|
status=True,
|
|
share_link=f"https://dovodi.newhorizonco.uk/arguments/hadith/{slug_candidate}"
|
|
)
|
|
hadis_instances.append((hadis, tmpl))
|
|
|
|
print(f"✨ Prepared {len(hadis_instances)} Hadith records.")
|
|
|
|
if dry_run:
|
|
print("\n[DRY RUN PREVIEW] First 5 Hadiths:")
|
|
for h, tmpl in hadis_instances[:5]:
|
|
print(f" • Hadis #{h.number:4d} | Slug: '{h.slug}' | Title: '{tmpl['title_en']}'")
|
|
print("\n✨ Dry run completed. No changes saved to database.")
|
|
return
|
|
|
|
# Execute DB save
|
|
with transaction.atomic():
|
|
print("💾 Saving Hadith records to database...")
|
|
# Save hadiths
|
|
saved_hadiths = []
|
|
for h, tmpl in hadis_instances:
|
|
h.save()
|
|
saved_hadiths.append(h)
|
|
|
|
# Attach transmitters and references
|
|
print("🔗 Linking transmitters and book references...")
|
|
for h in saved_hadiths:
|
|
# 2 to 4 transmitters
|
|
if transmitters_pool:
|
|
num_tr = min(len(transmitters_pool), random.randint(2, 4))
|
|
sampled_tr = random.sample(transmitters_pool, num_tr)
|
|
gap_pos = random.randint(0, num_tr - 1)
|
|
|
|
for pos, tr in enumerate(sampled_tr):
|
|
HadisTransmitter.objects.create(
|
|
hadis=h,
|
|
transmitter=tr,
|
|
chain_index=0,
|
|
order=pos,
|
|
is_gap=(pos == gap_pos)
|
|
)
|
|
|
|
# 1 Book reference
|
|
if book_refs:
|
|
ref = random.choice(book_refs)
|
|
HadisReference.objects.create(
|
|
hadis=h,
|
|
book_reference=ref,
|
|
volume=str(random.randint(1, 8)),
|
|
pages=str(random.randint(15, 450)),
|
|
hadith_number=str(h.number)
|
|
)
|
|
|
|
print("=" * 70)
|
|
print(f"✅ Successfully created {len(saved_hadiths)} Hadiths for category 'wise-sayings'!")
|
|
print(f"📌 Numbers range: #{saved_hadiths[0].number} to #{saved_hadiths[-1].number}")
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Generate 50 Hadiths for the category 'wise-sayings'.")
|
|
parser.add_argument("--count", type=int, default=50, help="Number of hadiths to generate (default: 50).")
|
|
parser.add_argument("--dry-run", action="store_true", help="Preview without saving to DB.")
|
|
args = parser.parse_args()
|
|
|
|
start_time = time.time()
|
|
generate_hadiths(count=args.count, dry_run=args.dry_run)
|
|
duration = time.time() - start_time
|
|
print(f"⏱ Completed in {duration:.2f} seconds.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|