Plugin archiv: 12-Monats-Autopilot mit Sicherungsdatei-Prinzip
- Eigene Migration 0001_archiv_tabellen: Spiegel-Tabellen archiv_neuheiten und archiv_planung (ohne FK, damit Archiv-Zeilen Benutzerlöschung überleben) - Service mit eingefrierbarer Uhr: Stichtag „jetzt minus 12 Monate“ in UTC, strenger Vergleich (genau 12 Monate bleibt aktiv); Neuheiten nach Erscheinungsjahr (großzügig Jahresende) sonst Eintragsdatum, Planung nach Eintragsdatum; Monatsarithmetik mit Klemmung (29. Februar) - Täglicher APScheduler-Cron-Job (Standard 03:00, konfigurierbar über SPIELE_ARCHIV_JOB_UHRZEIT / SPIELE_ARCHIV_JOB_AKTIV); je archiviertem Titel ein Audit-Log-Eintrag als System - Admin-Ansicht /archiv: vereinigte Liste beider Tabellen, Suche über Titel/Verlag/Autor, Herkunftsfilter, Wiederherstellen in die aktive Liste (BGG-Konflikt wird abgelehnt, verwaiste Rezensentenzuordnung übernimmt der Admin — gemeldet und auditiert); Rollen: nur Admin - Kern minimal erweitert: PluginContext.registry stellt Hintergrund-Jobs die Plugin-Registry bereit (keine Fachlogik im Kern) - 30 neue Tests mit eingefrorener Uhr (Grenzfälle, Zeitzonen, Schaltjahr, Job-Lauf, Wiederherstellen, Rollen, Suche/Filter); 171 Tests grün - README aktualisiert: neues Plugin-Kapitel, Env-Variablen, Fortschritt #7 ✅
This commit is contained in:
@@ -82,6 +82,7 @@ def create_app(settings: Settings | None = None) -> FastAPI:
|
||||
session_factory=session_factory,
|
||||
settings=settings,
|
||||
templates=templates,
|
||||
registry=registry,
|
||||
)
|
||||
|
||||
with engine.begin() as conn:
|
||||
|
||||
@@ -22,6 +22,7 @@ if TYPE_CHECKING:
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from redaktionskern.config import Settings
|
||||
from redaktionskern.plugin_loader import PluginRegistry
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -49,11 +50,16 @@ class PluginContext:
|
||||
session_factory: "sessionmaker",
|
||||
settings: "Settings",
|
||||
templates: "Jinja2Templates",
|
||||
registry: "PluginRegistry | None" = None,
|
||||
) -> None:
|
||||
self.engine = engine
|
||||
self.session_factory = session_factory
|
||||
self.settings = settings
|
||||
self.templates = templates
|
||||
#: Registry aller geladenen Plugins — damit auch Hintergrund-Jobs
|
||||
#: eines Plugins die öffentliche API anderer Plugins erreichen
|
||||
#: (in Anfragen geht das üblicherweise über request.app.state.registry).
|
||||
self.registry = registry
|
||||
|
||||
|
||||
class BasePlugin:
|
||||
|
||||
Reference in New Issue
Block a user