#!/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()