#!/usr/bin/env python3 """ Erstellt Standard-Schuljahre und setzt automatisch die aktive Periode. Dieses Skript ist idempotent: - Wenn keine Perioden existieren, werden Standard-Perioden erstellt. - Danach wird (bei jedem Lauf) die nicht-archivierte Periode aktiviert, die das heutige Datum abdeckt. """ from datetime import date from models.models import AcademicPeriod, AcademicPeriodType from server.database import Session import sys sys.path.append('/workspace') def _create_default_periods_if_missing(session): """Erstellt Standard-Schuljahre nur dann, wenn noch keine Perioden existieren.""" existing = session.query(AcademicPeriod).first() if existing: print("Academic periods already exist. Skipping creation.") return False periods = [ { 'name': 'Schuljahr 2024/25', 'display_name': 'SJ 24/25', 'start_date': date(2024, 9, 2), 'end_date': date(2025, 7, 4), 'period_type': AcademicPeriodType.schuljahr, 'is_active': False }, { 'name': 'Schuljahr 2025/26', 'display_name': 'SJ 25/26', 'start_date': date(2025, 9, 1), 'end_date': date(2026, 7, 3), 'period_type': AcademicPeriodType.schuljahr, 'is_active': False }, { 'name': 'Schuljahr 2026/27', 'display_name': 'SJ 26/27', 'start_date': date(2026, 9, 7), 'end_date': date(2027, 7, 2), 'period_type': AcademicPeriodType.schuljahr, 'is_active': False } ] for period_data in periods: period = AcademicPeriod(**period_data) session.add(period) session.flush() print(f"Successfully created {len(periods)} academic periods") return True def _activate_period_for_today(session): """Aktiviert genau eine Periode: die Periode, die heute abdeckt.""" today = date.today() period_for_today = ( session.query(AcademicPeriod) .filter( AcademicPeriod.is_archived == False, AcademicPeriod.start_date <= today, AcademicPeriod.end_date >= today, ) .order_by(AcademicPeriod.start_date.desc()) .first() ) # Immer zunächst alle aktiven Perioden deaktivieren, um den Zustand konsistent zu halten. session.query(AcademicPeriod).filter(AcademicPeriod.is_active == True).update( {AcademicPeriod.is_active: False}, synchronize_session=False, ) if period_for_today: period_for_today.is_active = True print( f"Activated academic period for today ({today}): {period_for_today.name} " f"[{period_for_today.start_date} - {period_for_today.end_date}]" ) else: print( f"WARNING: No academic period covers today ({today}). " "All periods remain inactive." ) def create_default_academic_periods(): """Erstellt Standard-Perioden (falls nötig) und setzt aktive Periode für heute.""" session = Session() try: _create_default_periods_if_missing(session) _activate_period_for_today(session) session.commit() # Zeige erstellte Perioden for period in session.query(AcademicPeriod).order_by(AcademicPeriod.start_date.asc()).all(): status = "AKTIV" if period.is_active else "inaktiv" print( f" - {period.name} ({period.start_date} - {period.end_date}) [{status}]") except Exception as e: session.rollback() print(f"Error creating academic periods: {e}") finally: session.close() if __name__ == "__main__": create_default_academic_periods()