From 9468b6e1549fd0b19c2884eec08fe483141fd891 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sun, 15 Feb 2026 15:11:13 +0330 Subject: [PATCH] Add management commands for seeding calendar occasions - Introduced `seed_occasions.py` management command to populate the database with a comprehensive list of Persian, International, and Religious calendar occasions. - Created `__init__.py` files in the management and commands directories to ensure proper package structure. - Enhanced the seeding process with transaction management for data integrity during the creation of occasions. --- apps/dobodbi_calendar/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/seed_occasions.py | 143 ++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 apps/dobodbi_calendar/management/__init__.py create mode 100644 apps/dobodbi_calendar/management/commands/__init__.py create mode 100644 apps/dobodbi_calendar/management/commands/seed_occasions.py diff --git a/apps/dobodbi_calendar/management/__init__.py b/apps/dobodbi_calendar/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/dobodbi_calendar/management/commands/__init__.py b/apps/dobodbi_calendar/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/dobodbi_calendar/management/commands/seed_occasions.py b/apps/dobodbi_calendar/management/commands/seed_occasions.py new file mode 100644 index 0000000..bc2a3f6 --- /dev/null +++ b/apps/dobodbi_calendar/management/commands/seed_occasions.py @@ -0,0 +1,143 @@ +import json +from django.core.management.base import BaseCommand +from django.db import transaction +from apps.dobodbi_calendar.models import CalendarOccasions + +class Command(BaseCommand): + help = 'Seeds the database with realistic Persian, International, and Religious calendar occasions.' + + def handle(self, *args, **options): + self.stdout.write(self.style.WARNING('Starting to seed calendar occasions...')) + + # Data structure: (Title, Type, Event Type, Month, Day) + # Note: For 'georgian', we use the fixed Gregorian equivalents of Persian Solar events + # e.g., Nowruz (1 Farvardin) = 21 March + + occasions_data = [ + # --- JANUARY (Dey/Bahman) --- + ("آغاز سال میلادی", "georgian", "international", "01", "01"), + ("شهادت امیرکبیر", "georgian", "national", "01", "10"), # 20 Dey + ("روز گفتگوی تمدن‌ها", "georgian", "international", "01", "14"), + ("روز هوای پاک", "georgian", "national", "01", "19"), # 29 Dey + + # --- FEBRUARY (Bahman/Esfand) --- + ("بازگشت امام خمینی به ایران", "georgian", "national", "02", "01"), # 12 Bahman + ("روز نیروی هوایی", "georgian", "national", "02", "08"), # 19 Bahman + ("پیروزی انقلاب اسلامی", "georgian", "national", "02", "11"), # 22 Bahman + ("ولنتاین (روز عشق)", "georgian", "international", "02", "14"), + ("روز مهندس (بزرگداشت خواجه نصیر)", "georgian", "national", "02", "24"), # 5 Esfand + ("سپندارمذگان (روز عشق ایرانی)", "georgian", "national", "02", "24"), # 5 Esfand + + # --- MARCH (Esfand/Farvardin) --- + ("روز درختکاری", "georgian", "national", "03", "05"), # 15 Esfand + ("روز جهانی زن", "georgian", "international", "03", "08"), + ("روز ملی شدن صنعت نفت", "georgian", "national", "03", "20"), # 29 Esfand + ("عید نوروز (آغاز سال نو)", "georgian", "national", "03", "21"), # 1 Farvardin + ("عید دیدنی (تعطیلات نوروز)", "georgian", "national", "03", "22"), # 2 Farvardin + + # --- APRIL (Farvardin/Ordibehesht) --- + ("روز طبیعت (سیزده بدر)", "georgian", "national", "04", "02"), # 13 Farvardin + ("روز جهانی بهداشت", "georgian", "international", "04", "07"), + ("روز بزرگداشت عطار نیشابوری", "georgian", "national", "04", "14"), # 25 Farvardin + ("روز بزرگداشت سعدی", "georgian", "national", "04", "21"), # 1 Ordibehesht + ("روز ملی خلیج فارس", "georgian", "national", "04", "30"), # 10 Ordibehesht + + # --- MAY (Ordibehesht/Khordad) --- + ("روز جهانی کار و کارگر", "georgian", "international", "05", "01"), + ("شهادت استاد مطهری (روز معلم)", "georgian", "national", "05", "02"), # 12 Ordibehesht + ("روز بزرگداشت فردوسی", "georgian", "national", "05", "15"), # 25 Ordibehesht + ("روز بزرگداشت خیام", "georgian", "national", "05", "18"), # 28 Ordibehesht + + # --- JUNE (Khordad/Tir) --- + ("رحلت امام خمینی", "georgian", "national", "06", "04"), # 14 Khordad + ("قیام ۱۵ خرداد", "georgian", "national", "06", "05"), # 15 Khordad + ("روز جهانی محیط زیست", "georgian", "international", "06", "05"), + ("روز صنایع دستی", "georgian", "national", "06", "10"), # 20 Khordad + + # --- JULY (Tir/Mordad) --- + ("روز قلم", "georgian", "national", "07", "05"), # 14 Tir + ("جشن تیرگان", "georgian", "national", "07", "04"), # 13 Tir + ("روز بهزیستی و تامین اجتماعی", "georgian", "national", "07", "16"), # 25 Tir + + # --- AUGUST (Mordad/Shahrivar) --- + ("روز خبرنگار", "georgian", "national", "08", "08"), # 17 Mordad + ("روز جهانی چپ‌دست‌ها", "georgian", "international", "08", "13"), + ("روز عکاسی", "georgian", "international", "08", "19"), + ("روز بزرگداشت ابن سینا (روز پزشک)", "georgian", "national", "08", "23"), # 1 Shahrivar + + # --- SEPTEMBER (Shahrivar/Mehr) --- + ("روز داروسازی (زکریای رازی)", "georgian", "national", "09", "27"), # 5 Shahrivar (Late Aug/Early Sep) + ("روز ملی سینما", "georgian", "national", "09", "12"), # 21 Shahrivar + ("روز شعر و ادب فارسی (شهریار)", "georgian", "national", "09", "18"), # 27 Shahrivar + ("روز جهانی صلح", "georgian", "international", "09", "21"), + ("روز آتش‌نشانی و ایمنی", "georgian", "national", "09", "29"), # 7 Mehr + + # --- OCTOBER (Mehr/Aban) --- + ("روز جهانی کودک", "georgian", "international", "10", "08"), + ("روز بزرگداشت حافظ", "georgian", "national", "10", "12"), # 20 Mehr + ("روز جهانی استاندارد", "georgian", "international", "10", "14"), + ("روز آمار و برنامه‌ریزی", "georgian", "national", "10", "23"), # 1 Aban + + # --- NOVEMBER (Aban/Azar) --- + ("روز دانش‌آموز (۱۳ آبان)", "georgian", "national", "11", "04"), # 13 Aban + ("روز کتاب و کتابخوانی", "georgian", "national", "11", "15"), # 24 Aban + ("روز جهانی تلویزیون", "georgian", "international", "11", "21"), + ("روز نیروی دریایی", "georgian", "national", "11", "28"), # 7 Azar + + # --- DECEMBER (Azar/Dey) --- + ("روز دانشجو (۱۶ آذر)", "georgian", "national", "12", "07"), # 16 Azar + ("روز پژوهش", "georgian", "national", "12", "16"), # 25 Azar + ("شب یلدا (طولانی‌ترین شب سال)", "georgian", "national", "12", "21"), # 30 Azar + ("میلاد حضرت مسیح (ع)", "georgian", "religious", "12", "25"), + + # --- LUNAR EVENTS (Religious) --- + # Using standard Lunar Hijri months: + # 01: Muharram, 02: Safar, 03: Rabi-al-Awwal, etc. + ("تاسوعای حسینی", "lunar", "religious", "01", "09"), + ("عاشورای حسینی", "lunar", "religious", "01", "10"), + ("اربعین حسینی", "lunar", "religious", "02", "20"), + ("رحلت پیامبر اکرم (ص)", "lunar", "religious", "02", "28"), + ("میلاد پیامبر اکرم (ص)", "lunar", "religious", "03", "17"), + ("ولادت حضرت علی (ع) - روز پدر", "lunar", "religious", "07", "13"), + ("مبعث پیامبر اکرم (ص)", "lunar", "religious", "07", "27"), + ("ولادت حضرت قائم (عج)", "lunar", "religious", "08", "15"), + ("شهادت حضرت علی (ع)", "lunar", "religious", "09", "21"), + ("عید سعید فطر", "lunar", "religious", "10", "01"), + ("شهادت امام جعفر صادق (ع)", "lunar", "religious", "10", "25"), + ("عید سعید قربان", "lunar", "religious", "12", "10"), + ("عید سعید غدیر خم", "lunar", "religious", "12", "18"), + ] + + created_count = 0 + updated_count = 0 + + with transaction.atomic(): + for title, type_val, event_type, month, day in occasions_data: + # Prepare the dates field json structure + date_json = [ + { + "day": day, + "month": month, + "year": "" # Empty for yearly events + } + ] + + obj, created = CalendarOccasions.objects.update_or_create( + title=title, + defaults={ + "occasion_type": type_val, + "event_type": event_type, + "dates": date_json, + "is_yearly": True, + "is_global": True + } + ) + + if created: + created_count += 1 + else: + updated_count += 1 + + self.stdout.write(self.style.SUCCESS(f'Successfully seeded events.')) + self.stdout.write(self.style.SUCCESS(f'Created: {created_count}')) + self.stdout.write(self.style.SUCCESS(f'Updated: {updated_count}')) \ No newline at end of file