#!/usr/bin/env python3 """ Seed School Calendars Script Loads school calendars from CalendarRegistry into the database """ import asyncio import sys import os # Add parent directory to path to allow imports sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.core.database import database_manager from app.repositories.calendar_repository import CalendarRepository from app.registry.calendar_registry import CalendarRegistry import structlog logger = structlog.get_logger() async def seed_calendars(): """Seed school calendars from registry into database""" logger.info("Starting school calendar seeding...") # Get all calendars from registry calendars = CalendarRegistry.get_all_calendars() logger.info(f"Found {len(calendars)} calendars in registry") # Initialize database await database_manager.initialize() try: async with database_manager.get_session() as session: repo = CalendarRepository(session) seeded_count = 0 skipped_count = 0 for cal_def in calendars: logger.info( "Processing calendar", calendar_id=cal_def.calendar_id, city=cal_def.city_id, type=cal_def.school_type.value ) # Check if calendar already exists existing = await repo.get_calendar_by_city_type_year( city_id=cal_def.city_id, school_type=cal_def.school_type.value, academic_year=cal_def.academic_year ) if existing: logger.info( "Calendar already exists, skipping", calendar_id=cal_def.calendar_id ) skipped_count += 1 continue # Convert holiday periods to dict format holiday_periods = [ { "name": hp.name, "start_date": hp.start_date, "end_date": hp.end_date, "description": hp.description } for hp in cal_def.holiday_periods ] # Convert school hours to dict format school_hours = { "morning_start": cal_def.school_hours.morning_start, "morning_end": cal_def.school_hours.morning_end, "has_afternoon_session": cal_def.school_hours.has_afternoon_session, "afternoon_start": cal_def.school_hours.afternoon_start, "afternoon_end": cal_def.school_hours.afternoon_end } # Create calendar in database created_calendar = await repo.create_school_calendar( city_id=cal_def.city_id, calendar_name=cal_def.calendar_name, school_type=cal_def.school_type.value, academic_year=cal_def.academic_year, holiday_periods=holiday_periods, school_hours=school_hours, source=cal_def.source, enabled=cal_def.enabled ) logger.info( "Calendar seeded successfully", calendar_id=str(created_calendar.id), city=cal_def.city_id, type=cal_def.school_type.value ) seeded_count += 1 logger.info( "Calendar seeding completed", seeded=seeded_count, skipped=skipped_count, total=len(calendars) ) except Exception as e: logger.error("Error seeding calendars", error=str(e)) raise finally: await database_manager.close() if __name__ == "__main__": asyncio.run(seed_calendars())