""" Vorkonfigurierte Alert-Templates (Playbooks) für den Guided Mode. Diese Templates ermöglichen Lehrern und Schulleitungen einen schnellen Einstieg ohne RSS-Feeds oder Keywords manuell konfigurieren zu müssen. Alle Texte in B1/B2 Deutsch, keine IT-Fachbegriffe. """ from typing import List, Dict, Any from sqlalchemy.orm import Session import uuid # Standard Importance-Mapping (Score → 5 Stufen) DEFAULT_IMPORTANCE_CONFIG = { "kritisch": 0.90, # Ab 90% → Kritisch "dringend": 0.75, # 75-90% → Dringend "wichtig": 0.60, # 60-75% → Wichtig "pruefen": 0.40, # 40-60% → Zu prüfen # Alles unter 40% → Info } # Importance-Mapping für zeitkritische Templates (z.B. Fristen) DEADLINE_IMPORTANCE_CONFIG = { "kritisch": 0.85, "dringend": 0.70, "wichtig": 0.55, "pruefen": 0.35, } # Importance-Mapping für IT-Security (höhere Schwellen) SECURITY_IMPORTANCE_CONFIG = { "kritisch": 0.95, "dringend": 0.85, "wichtig": 0.70, "pruefen": 0.50, } ALERT_TEMPLATES: List[Dict[str, Any]] = [ # ========================================================================= # 1. Förderprogramme & Fristen # ========================================================================= { "slug": "foerderprogramme", "name": "Förderprogramme & Fristen", "description": "Bleiben Sie informiert über Förderanträge, Deadlines und neue Programme für Schulen. Verpassen Sie keine Fristen mehr.", "icon": "💰", "category": "administration", "target_roles": ["schulleitung"], "topics_config": [ { "name": "DigitalPakt & Bundes-Förderprogramme", "keywords": ["DigitalPakt", "Förderprogramm Schule", "Bundesförderung Bildung", "BMBF Schule"], }, { "name": "Landesförderung Bildung", "keywords": ["Landesförderung Schule", "Kultusministerium Förderung", "Schulträger Fördermittel"], }, { "name": "EU & Stiftungen", "keywords": ["Erasmus+ Schule", "EU-Förderung Bildung", "Stiftung Schule", "ESF Bildung"], }, ], "rules_config": [ { "name": "Fristen priorisieren", "conditions": [{"field": "title", "op": "in", "value": ["Frist", "Deadline", "bis zum", "Antragsfrist", "endet am"]}], "action_type": "tag", "action_config": {"tags": ["frist"]}, "priority": 100, }, { "name": "Ausschluss Stellenanzeigen", "conditions": [{"field": "title", "op": "in", "value": ["Stellenanzeige", "Wir suchen", "Job"]}], "action_type": "drop", "priority": 90, }, ], "profile_config": { "priorities": [ {"label": "Fördermittel", "weight": 0.95, "keywords": ["Fördermittel", "Zuschuss", "Antrag", "Förderung"], "description": "Finanzielle Förderung für Schulen"}, {"label": "Fristen", "weight": 0.90, "keywords": ["Frist", "Deadline", "Stichtag", "Bewerbungsschluss"], "description": "Zeitkritische Informationen"}, {"label": "Digitalisierung", "weight": 0.80, "keywords": ["DigitalPakt", "Tablet", "WLAN", "digitale Ausstattung"], "description": "IT-Ausstattung und Infrastruktur"}, ], "exclusions": ["Stellenanzeige", "Werbung", "Seminar buchen", "Anzeige"], }, "importance_config": DEADLINE_IMPORTANCE_CONFIG, "max_cards_per_day": 8, "sort_order": 1, }, # ========================================================================= # 2. Abitur & Prüfungs-Updates # ========================================================================= { "slug": "abitur-updates", "name": "Abitur & Prüfungs-Updates", "description": "Aktuelle Informationen zu Abitur-Regelungen, Prüfungsformaten, EPA und KMK-Beschlüssen. Wichtig für alle Oberstufenlehrkräfte.", "icon": "📝", "category": "teaching", "target_roles": ["lehrkraft", "schulleitung"], "topics_config": [ { "name": "Abitur-Vorgaben", "keywords": ["Abitur Vorgaben", "Prüfungsaufgaben Abitur", "Abiturprüfung Änderung"], }, { "name": "KMK & EPA", "keywords": ["KMK Beschluss", "EPA Abitur", "Bildungsstandards Abitur", "Operatoren Abitur"], }, { "name": "Prüfungsformate", "keywords": ["Prüfungsformat Schule", "Klausur Oberstufe", "mündliche Prüfung Abitur"], }, ], "rules_config": [ { "name": "Kernfächer priorisieren", "conditions": [{"field": "title", "op": "in", "value": ["Deutsch", "Mathematik", "Englisch", "Leistungskurs"]}], "action_type": "tag", "action_config": {"tags": ["kernfach"]}, "priority": 80, }, ], "profile_config": { "priorities": [ {"label": "Abitur-Änderungen", "weight": 0.95, "keywords": ["Abitur", "Prüfung", "Zentralabitur"], "description": "Änderungen an Prüfungsregelungen"}, {"label": "KMK-Beschlüsse", "weight": 0.85, "keywords": ["KMK", "Kultusministerkonferenz", "Bildungsstandards"], "description": "Bundesweite Regelungen"}, {"label": "Bewertung", "weight": 0.75, "keywords": ["Bewertung", "Notenschlüssel", "Erwartungshorizont"], "description": "Bewertungskriterien"}, ], "exclusions": ["Nachhilfe", "Abiturtraining", "Lernhilfe kaufen"], }, "importance_config": DEFAULT_IMPORTANCE_CONFIG, "max_cards_per_day": 6, "sort_order": 2, }, # ========================================================================= # 3. Fortbildungen für Lehrkräfte # ========================================================================= { "slug": "fortbildungen", "name": "Fortbildungen für Lehrkräfte", "description": "Relevante Fortbildungsangebote in Ihrer Region. Filtern Sie nach Fach, Format und Anbieter.", "icon": "🎓", "category": "teaching", "target_roles": ["lehrkraft"], "topics_config": [ { "name": "Landesinstitut Fortbildungen", "keywords": ["Fortbildung Lehrer", "Landesinstitut Lehrerfortbildung", "Pädagogische Fortbildung"], }, { "name": "Digitale Kompetenzen", "keywords": ["Fortbildung digital", "Medienkompetenz Lehrer", "digitale Bildung Fortbildung"], }, { "name": "Fachfortbildungen", "keywords": ["Fachfortbildung", "Unterrichtsentwicklung", "Didaktik Fortbildung"], }, ], "rules_config": [ { "name": "Online-Formate taggen", "conditions": [{"field": "title", "op": "in", "value": ["Online", "Webinar", "digital", "virtuell"]}], "action_type": "tag", "action_config": {"tags": ["online"]}, "priority": 70, }, { "name": "Kostenpflichtige ausschließen", "conditions": [{"field": "snippet", "op": "in", "value": ["kostenpflichtig", "Teilnahmegebühr", "€"]}], "action_type": "tag", "action_config": {"tags": ["kostenpflichtig"]}, "priority": 60, }, ], "profile_config": { "priorities": [ {"label": "Kostenlose Fortbildungen", "weight": 0.90, "keywords": ["kostenlos", "kostenfrei", "Landesinstitut"], "description": "Staatliche Angebote"}, {"label": "Digitale Medien", "weight": 0.80, "keywords": ["digital", "Tablet", "Medienkompetenz"], "description": "Digitale Bildung"}, {"label": "Inklusion", "weight": 0.75, "keywords": ["Inklusion", "Förderbedarf", "Differenzierung"], "description": "Inklusiver Unterricht"}, ], "exclusions": ["Studium", "Bachelor", "Master", "Referendariat"], }, "importance_config": DEFAULT_IMPORTANCE_CONFIG, "max_cards_per_day": 10, "sort_order": 3, }, # ========================================================================= # 4. Datenschutz & Rechtsupdates # ========================================================================= { "slug": "datenschutz-recht", "name": "Datenschutz & Rechtsupdates", "description": "DSGVO-relevante Änderungen, Schulrecht und rechtliche Entwicklungen. Wichtig für Datenschutzbeauftragte und Schulleitungen.", "icon": "⚖️", "category": "administration", "target_roles": ["schulleitung", "it_beauftragte"], "topics_config": [ { "name": "DSGVO Schule", "keywords": ["DSGVO Schule", "Datenschutz Schüler", "Einwilligung Eltern", "personenbezogene Daten Schule"], }, { "name": "Schulrecht", "keywords": ["Schulgesetz Änderung", "Schulordnung neu", "Schulrecht Urteil"], }, { "name": "Cloud & Software", "keywords": ["Cloud Schule DSGVO", "Microsoft 365 Schule", "Videokonferenz Datenschutz"], }, ], "rules_config": [ { "name": "Urteile priorisieren", "conditions": [{"field": "title", "op": "in", "value": ["Urteil", "Gericht", "Beschluss", "Aufsichtsbehörde"]}], "action_type": "tag", "action_config": {"tags": ["urteil"]}, "priority": 90, }, { "name": "Handlungsbedarf markieren", "conditions": [{"field": "title", "op": "in", "value": ["ab sofort", "verpflichtend", "muss", "Frist"]}], "action_type": "tag", "action_config": {"tags": ["handlungsbedarf"]}, "priority": 85, }, ], "profile_config": { "priorities": [ {"label": "DSGVO-Compliance", "weight": 0.95, "keywords": ["DSGVO", "Datenschutz", "Aufsichtsbehörde", "Bußgeld"], "description": "Datenschutzrechtliche Vorgaben"}, {"label": "Schulrecht", "weight": 0.90, "keywords": ["Schulgesetz", "Verordnung", "Erlass"], "description": "Rechtliche Änderungen"}, {"label": "Cloud-Dienste", "weight": 0.80, "keywords": ["Cloud", "Microsoft", "Google", "Zoom"], "description": "Software und Dienste"}, ], "exclusions": ["Werbung", "Seminar buchen", "Beratung anfragen"], }, "importance_config": DEADLINE_IMPORTANCE_CONFIG, "max_cards_per_day": 8, "sort_order": 4, }, # ========================================================================= # 5. IT-Security Warnungen # ========================================================================= { "slug": "it-security", "name": "IT-Security Warnungen", "description": "Sicherheitswarnungen und Patches für Schul-IT-Systeme. Kritisch für IT-Beauftragte und Administratoren.", "icon": "🔒", "category": "it", "target_roles": ["it_beauftragte"], "topics_config": [ { "name": "BSI & CERT Warnungen", "keywords": ["BSI Warnung", "CERT-Bund", "Sicherheitslücke", "CVE Schule"], }, { "name": "Schul-Software Security", "keywords": ["Moodle Sicherheit", "IServ Update", "WebUntis Sicherheit", "Nextcloud Patch"], }, { "name": "Phishing & Malware", "keywords": ["Phishing Schule", "Ransomware Bildung", "Malware Warnung"], }, ], "rules_config": [ { "name": "CVE-Meldungen priorisieren", "conditions": [{"field": "title", "op": "regex", "value": "CVE-\\d{4}-\\d+"}], "action_type": "tag", "action_config": {"tags": ["cve"]}, "priority": 100, }, { "name": "Kritische Patches", "conditions": [{"field": "title", "op": "in", "value": ["kritisch", "Notfall-Patch", "sofort", "0-day"]}], "action_type": "tag", "action_config": {"tags": ["kritisch"]}, "priority": 95, }, ], "profile_config": { "priorities": [ {"label": "CVE-Warnungen", "weight": 0.98, "keywords": ["CVE", "Sicherheitslücke", "Schwachstelle", "Exploit"], "description": "Bekannte Sicherheitslücken"}, {"label": "Schul-Software", "weight": 0.90, "keywords": ["Moodle", "IServ", "WebUntis", "Nextcloud", "Schulportal"], "description": "Häufig genutzte Schulsoftware"}, {"label": "Patches", "weight": 0.85, "keywords": ["Patch", "Update", "Sicherheitsupdate", "Hotfix"], "description": "Sicherheitsupdates"}, ], "exclusions": ["Werbung", "Schulung kaufen", "Penetrationstest Angebot"], }, "importance_config": SECURITY_IMPORTANCE_CONFIG, "max_cards_per_day": 5, "sort_order": 5, }, # ========================================================================= # 6. Wettbewerbe & Projekte # ========================================================================= { "slug": "wettbewerbe-projekte", "name": "Wettbewerbe & Projekte", "description": "MINT-Wettbewerbe, Erasmus-Projekte, Schülerwettbewerbe und Schulpartnerschaften. Entdecken Sie Chancen für Ihre Schüler.", "icon": "🏆", "category": "teaching", "target_roles": ["lehrkraft", "schulleitung"], "topics_config": [ { "name": "MINT-Wettbewerbe", "keywords": ["MINT Wettbewerb Schule", "Jugend forscht", "Mathematik Olympiade", "Informatik Biber"], }, { "name": "Erasmus & Austausch", "keywords": ["Erasmus+ Schule", "Schüleraustausch", "Schulpartnerschaft Europa"], }, { "name": "Kreativ & Sozial", "keywords": ["Schülerwettbewerb Kunst", "Vorlesewettbewerb", "Umweltpreis Schule", "Sozialer Tag"], }, ], "rules_config": [ { "name": "Anmeldefristen", "conditions": [{"field": "title", "op": "in", "value": ["Anmeldung", "Bewerbung", "Frist", "bis zum"]}], "action_type": "tag", "action_config": {"tags": ["frist"]}, "priority": 85, }, ], "profile_config": { "priorities": [ {"label": "Wettbewerbe", "weight": 0.90, "keywords": ["Wettbewerb", "Preis", "Auszeichnung", "Gewinner"], "description": "Schülerwettbewerbe"}, {"label": "Erasmus+", "weight": 0.85, "keywords": ["Erasmus", "EU-Programm", "Mobilität", "Austausch"], "description": "Europäische Programme"}, {"label": "MINT", "weight": 0.80, "keywords": ["MINT", "Naturwissenschaft", "Technik", "Informatik"], "description": "MINT-Bereich"}, ], "exclusions": ["Stellenanzeige", "Praktikum", "Ausbildung"], }, "importance_config": DEADLINE_IMPORTANCE_CONFIG, "max_cards_per_day": 8, "sort_order": 6, }, # ========================================================================= # 7. Personalmarkt (Optional/Premium) # ========================================================================= { "slug": "personalmarkt", "name": "Personalmarkt & Stellen", "description": "Stellenangebote für Lehrkräfte und Vertretungsstellen in Ihrer Region. Ideal für Schulleitungen mit Personalbedarf.", "icon": "👥", "category": "administration", "target_roles": ["schulleitung"], "is_premium": True, "topics_config": [ { "name": "Lehrerstellen", "keywords": ["Lehrerstelle", "Lehrkraft gesucht", "Einstellung Lehrer"], }, { "name": "Vertretungslehrkräfte", "keywords": ["Vertretungslehrkraft", "befristete Stelle Lehrer", "Krankheitsvertretung Schule"], }, { "name": "Schulsozialarbeit", "keywords": ["Schulsozialarbeiter", "Sozialpädagoge Schule", "Schulpsychologe"], }, ], "rules_config": [], "profile_config": { "priorities": [ {"label": "Festanstellung", "weight": 0.90, "keywords": ["unbefristet", "Festanstellung", "Planstelle"], "description": "Feste Stellen"}, {"label": "Region", "weight": 0.85, "keywords": [], "description": "Stellen in der Region"}, ], "exclusions": ["Nachhilfe", "Privatlehrer", "freiberuflich"], }, "importance_config": DEFAULT_IMPORTANCE_CONFIG, "max_cards_per_day": 10, "sort_order": 7, }, # ========================================================================= # 8. Krisenkommunikation (Optional/Premium) # ========================================================================= { "slug": "krisenkommunikation", "name": "Krisenkommunikation", "description": "Wichtige Meldungen für Schulen in Krisensituationen: Unwetter, Streiks, Verkehrsstörungen, Gesundheitswarnungen.", "icon": "⚠️", "category": "administration", "target_roles": ["schulleitung"], "is_premium": True, "topics_config": [ { "name": "Wetter & Naturereignisse", "keywords": ["Unwetterwarnung Schule", "Schulausfall Wetter", "Hitzefrei"], }, { "name": "Verkehr & ÖPNV", "keywords": ["Streik ÖPNV", "Verkehrsstörung", "Busausfall Schule"], }, { "name": "Gesundheit", "keywords": ["Gesundheitswarnung Schule", "Infektionsgefahr", "Hygienemaßnahme"], }, ], "rules_config": [ { "name": "Sofortmeldungen", "conditions": [{"field": "title", "op": "in", "value": ["Warnung", "Achtung", "Sofort", "Gefahr", "Ausfall"]}], "action_type": "tag", "action_config": {"tags": ["sofort"]}, "priority": 100, }, ], "profile_config": { "priorities": [ {"label": "Schulausfall", "weight": 0.98, "keywords": ["Schulausfall", "unterrichtsfrei", "Schule geschlossen"], "description": "Schulschließungen"}, {"label": "Warnungen", "weight": 0.95, "keywords": ["Warnung", "Gefahr", "Achtung"], "description": "Wichtige Warnungen"}, ], "exclusions": ["Werbung", "Versicherung"], }, "importance_config": SECURITY_IMPORTANCE_CONFIG, # Schnelle Eskalation "max_cards_per_day": 5, "sort_order": 8, }, ] def seed_templates(db: Session, force_update: bool = False) -> int: """ Fügt die vordefinierten Templates in die Datenbank ein. Args: db: SQLAlchemy Session force_update: Wenn True, werden bestehende Templates aktualisiert Returns: Anzahl der eingefügten/aktualisierten Templates """ from alerts_agent.db.models import AlertTemplateDB count = 0 for template_data in ALERT_TEMPLATES: existing = db.query(AlertTemplateDB).filter_by(slug=template_data["slug"]).first() if existing and not force_update: continue if existing and force_update: # Update existing template for key, value in template_data.items(): if hasattr(existing, key): setattr(existing, key, value) count += 1 else: # Create new template template = AlertTemplateDB( id=str(uuid.uuid4()), **template_data ) db.add(template) count += 1 db.commit() return count def get_templates_for_role(role: str) -> List[Dict[str, Any]]: """ Gibt empfohlene Templates für eine bestimmte Rolle zurück. Args: role: "lehrkraft", "schulleitung", oder "it_beauftragte" Returns: Liste der passenden Templates (sortiert nach Empfehlung) """ return [ t for t in ALERT_TEMPLATES if role in t.get("target_roles", []) and not t.get("is_premium", False) ] def get_template_by_slug(slug: str) -> Dict[str, Any] | None: """ Gibt ein Template anhand seines Slugs zurück. """ for t in ALERT_TEMPLATES: if t["slug"] == slug: return t return None