This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Benjamin Admin 21a844cb8a fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.

This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).

Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:51:32 +01:00

124 lines
3.1 KiB
Python

"""
Base Classes für Alert Actions.
Definiert das Interface für alle Action-Handler.
"""
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, Any, Optional, List
from enum import Enum
class ActionType(str, Enum):
"""Verfügbare Aktionstypen."""
EMAIL = "email"
WEBHOOK = "webhook"
SLACK = "slack"
TEAMS = "teams"
TAG = "tag"
ARCHIVE = "archive"
@dataclass
class ActionResult:
"""Ergebnis einer ausgeführten Aktion."""
success: bool
action_type: ActionType
message: str
timestamp: datetime = field(default_factory=datetime.utcnow)
details: Dict[str, Any] = field(default_factory=dict)
error: Optional[str] = None
def to_dict(self) -> Dict[str, Any]:
"""Konvertiert zu Dict für Logging/Speicherung."""
return {
"success": self.success,
"action_type": self.action_type.value,
"message": self.message,
"timestamp": self.timestamp.isoformat(),
"details": self.details,
"error": self.error,
}
@dataclass
class AlertContext:
"""Kontext für eine Aktion mit Alert-Informationen."""
alert_id: str
title: str
url: str
snippet: str
topic_name: str
relevance_score: Optional[float] = None
relevance_decision: Optional[str] = None
matched_rule: Optional[str] = None
tags: List[str] = field(default_factory=list)
def to_dict(self) -> Dict[str, Any]:
"""Konvertiert zu Dict für Templates."""
return {
"alert_id": self.alert_id,
"title": self.title,
"url": self.url,
"snippet": self.snippet,
"topic_name": self.topic_name,
"relevance_score": self.relevance_score,
"relevance_decision": self.relevance_decision,
"matched_rule": self.matched_rule,
"tags": self.tags,
}
class ActionHandler(ABC):
"""
Abstrakte Basisklasse für Action-Handler.
Jede Aktion (Email, Webhook, Slack) implementiert diese Schnittstelle.
"""
@property
@abstractmethod
def action_type(self) -> ActionType:
"""Gibt den Aktionstyp zurück."""
pass
@abstractmethod
async def execute(
self,
context: AlertContext,
config: Dict[str, Any],
) -> ActionResult:
"""
Führt die Aktion aus.
Args:
context: Alert-Kontext mit allen relevanten Informationen
config: Aktionsspezifische Konfiguration
Returns:
ActionResult mit Erfolgsstatus und Details
"""
pass
def validate_config(self, config: Dict[str, Any]) -> bool:
"""
Validiert die Aktions-Konfiguration.
Args:
config: Zu validierende Konfiguration
Returns:
True wenn gültig
"""
return True
def get_required_config_fields(self) -> List[str]:
"""
Gibt erforderliche Konfigurationsfelder zurück.
Returns:
Liste von Feldnamen
"""
return []