BUG: 4 Core→Plugin-Imports in core/jobs.py DSAR-Sammlung — direkte Model-Imports statt Contracts #356
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Live gemessen 2026-08-27 (
python scripts/check_cross_plugin_imports.pyvor Fix: 4 Verstöße):Kontext: Die DSAR-Datenkategorie-Sammlung (G1-b: mail_accounts, tasks, calendar_entries, comm_messages) importierte Plugin-Models direkt statt über die bestehende Contract-Registry (Kritikpunkt 15). Verstoß gegen Core→Plugin-Grenze; bei inaktivem Plugin wäre zudem der ImportError-Fallback nie sauber greifen können.
P16-Klassifizierung (manuelle Prüfung):
from app.models.contact import Contactin core/jobs.py:172/377 und core/worker.py:399 sind KEINE Verstöße — Contact-Models liegen historisch im Core-Models-Layer (app/models/), nicht unterapp.plugins.*. Der Checker erlaubt sie korrekt. Keine Aktion nötig.Fix: Die 4 Blöcke nutzen jetzt
get_contract("mail"|"tasks"|"calendar"|"kommunikation")(bestehende Registry, lazy-load + ARCH-014-Resurrection-Schutz). MailContract exponiert zusätzlichMailAccount(einzeilig, bestehendes Muster). ImportError-Fallback-Semantik unverändert: Plugin inaktiv → Kategorie wird übersprungen wie bisher. Queries/Serialisierung byte-identisch.Verifikation: Checker nach Fix: 0 Verstöße (480 Dateien). DSAR-Suite test_g1_dsar.py 4/4 passed (Funktionserhalt). Ruff: nur 2 Vorbestand-N811 (PyUUID) verbleiben.
Gefixt in Commit
092c2d2— deployed und live verifiziert (2026-08-27 17:40):Fix
core/jobs.pynutzen jetztget_contract("mail"/"tasks"/"calendar"/"kommunikation")über die bestehende Contract-Registry (lazy-load + ARCH-014-Resurrection-Schutz).MailAccountexponiert (einzeilig, bestehendes Contract-Muster).get_contract()liefert None → bewusstesraise ImportError→ bestehender except-Zweig überspringt die Kategorie wie bisher. Queries/Serialisierung byte-identisch.Verifikation (Live-Messung)
tests/test_g1_dsar.py: 4/4 passed (Access/Deletion/Dispatch — Funktionserhalt bewiesen)Vertiefung nach Review-Einspruch: Plugin-Fachlogik gehört vollständig aus dem Core — umgesetzt.
Kritik berechtigt
Der erste Fix (
092c2d2) bog nur den Import-Weg auf Contracts um, aber die Fachlogik (welche DSAR-Kategorien existieren, welche Felder gesammelt/gelöscht werden, mit welchen Limits) lag weiterhin hart im Core. Damit kannte der Core Plugin-Details — gegen die Architektur.Die echte Korrektur
Core sammelt/löscht jetzt NUR Core-eigene Daten (Profil, Audit-Log, Notifications, User-Anonymisierung). Alle Plugin-Kategorien wandern in die besitzenden Contracts:
ContactsContractdsar_collect()+dsar_erase()(Kontakte sind Plugin-eigen — is_core=True heißt Pflichtplugin, nicht Core-Verdrahtung)MailContractdsar_collect()(mail_accounts)TasksContractdsar_collect()(tasks)CalendarContractdsar_collect()(calendar_entries)KommunikationContractdsar_collect()(comm_messages)core/jobs.py iteriert generisch:
registry.list_discovered()→get_contract()→ fallsdsar_collect/dsar_erasevorhanden → Kategorie beitragen. Ein neues Plugin kann DSAR-Kategorien beitragen, ohne eine einzige Core-Datei zu ändern. Inaktive Plugins tragen nichts bei (gleiche Semantik wie bisher); Fehler in einem Plugin skippen nur dessen Kategorie (warning + weiter).Counts-/Category-Keys unverändert (
contacts,mail_accounts, ...,contacts_soft_deleted) — API- und Nachrichten-Vertrag stabil.Verifikation (Live-Messung)
test_g1_dsar.py: 4/4 passed — beweist u.a. dasscontacts_soft_deletedvia ContactsContract.dsar_erase identisch funktioniert (Art. 17 Soft-Delete) und Collect alle Core-Kategorien liefertcreate_app()OK · ruff: nur 2 Vorbestand-N811 (PyUUID) verbleibentasks/contracts.py(unterminated triple-quote, von ast.parse gefangen) komplett sauber neu geschrieben