Notifications-App-Referenz¶
Die Notifications-App bietet ein In-App-Benachrichtigungssystem mit automatischen Auslösern, Deduplizierung, Massenverwaltung und AJAX-Unterstützung zum Markieren von Benachrichtigungen als gelesen oder zum Löschen.
Übersicht¶
Speicherort: app/notifications/
Zweck: In-App-Benachrichtigungssystem mit automatischen Auslösern, Deduplizierung und Bereinigung
Wichtiges Modell: Notification
Abhängigkeiten: organizations (Org-Zuordnung, Benutzer-Orgs), hives (Arbeiten, Durchsichten), warehouse (niedriger Bestand), dataexchange (Export-/Import-Jobs)
Dateistruktur¶
notifications/
├── models.py # Notification-Modell (1 Modell)
├── views.py # 5 Views
├── services.py # 7 Benachrichtigungs-Erstellungsfunktionen
├── signals.py # 2 aktive Signal-Handler (Export/Import)
├── context_processors.py # Ungelesen-Zähler + neueste Benachrichtigungen
├── urls.py # 5 URL-Patterns
├── admin.py # NotificationAdmin mit Fieldsets
├── apps.py # AppConfig (importiert Signale in ready())
├── management/
│ └── commands/
│ └── cleanup_old_notifications.py # Alte Benachrichtigungen archivieren/löschen
├── tests/
│ ├── test_models.py
│ ├── test_services.py
│ ├── test_signals.py
│ └── test_views.py
└── templates/notifications/
├── base_notifications.html
├── notification_list.html
└── _notification_item.html
Modelle¶
Notification¶
Speicherort: app/notifications/models.py
Kategorien: todo, dashboard, export_import, system
Prioritäten: low, medium, high, urgent
Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
recipient |
FK(User) | Benachrichtigungsempfänger |
organization |
FK(Organization) | Zugehörige Organisation |
category |
CharField(20) | Benachrichtigungskategorie |
priority |
CharField(10) | Dringlichkeitsstufe (Standard: medium) |
title |
CharField(200) | Benachrichtigungstitel |
message |
TextField | Vollständiger Nachrichtentext |
link |
CharField(500) | Interner URL-Pfad (z.B. /activities/123/) |
content_type |
FK(ContentType) | Für GenericForeignKey (nullable) |
object_id |
PositiveIntegerField | Für GenericForeignKey (nullable) |
is_read |
BooleanField | Gelesen-Status (Standard: False) |
read_at |
DateTimeField | Wann als gelesen markiert (nullable) |
is_archived |
BooleanField | Archiviert-Status (Standard: False) |
created_at |
DateTimeField | Automatisch bei Erstellung gesetzt |
updated_at |
DateTimeField | Automatisch beim Speichern gesetzt |
Methoden:
mark_as_read()-- Setzt is_read=True und read_at=nowmark_as_unread()-- Setzt is_read=False und read_at=Nonecategory_icon()-- Gibt Bootstrap-Icon-Klasse für Kategorie zurückpriority_color()-- Gibt Bootstrap-Farbklasse für Priorität zurückuser_can_view(user)-- Gibt True zurück, wenn der Benutzer der Empfänger ist
Indexe: (recipient, is_read, -created_at), (organization, -created_at), (category)
Views¶
| View | Zweck |
|---|---|
| NotificationListView | Paginierte Liste (20/Seite) mit Kategorie-/Status-/Archiv-Filtern. Liefert Zähler pro Kategorie. |
| NotificationMarkReadView | AJAX-POST zum Markieren einzelner Benachrichtigung als gelesen. Gibt JSON mit Ungelesen-Zähler zurück. |
| NotificationMarkAllReadView | POST zum Markieren aller Benutzerbenachrichtigungen als gelesen. Leitet zum Referrer weiter. |
| NotificationDeleteView | POST zum Löschen von Benachrichtigungen (AJAX-JSON-Antwort oder Formular-Weiterleitung). |
| NotificationDeleteCategoryView | POST zum Löschen aller Benachrichtigungen einer bestimmten Kategorie oder aller Benachrichtigungen. |
Services¶
Speicherort: app/notifications/services.py
Kernfunktionen¶
create_notification() -- Kernerstellung mit Deduplizierung. Prüft auf doppelte Benachrichtigungen (gleicher Empfänger, Organisation, Kategorie, Titel) innerhalb eines konfigurierbaren dedup_hours-Zeitfensters (Standard: 24 Stunden). Unterstützt Verknüpfung mit beliebigen Modellen über GenericForeignKey.
create_dashboard_notifications() -- Prüft drei Alarmbedingungen und erstellt Benachrichtigungen:
- Überfällige Arbeiten (geplant aber nicht abgeschlossen, Fälligkeitsdatum überschritten)
- Bienenstöcke, die Durchsicht benötigen (seit 7+ Tagen nicht kontrolliert oder nie kontrolliert)
- Artikel mit niedrigem Bestand (Menge unter Mindestmenge)
Spezialisierte Benachrichtigungsfunktionen¶
| Funktion | Zweck | Dedup-Zeitfenster |
|---|---|---|
notify_todo_item_completed() |
Benachrichtigen wenn Arbeits-Todo-Element abgeschlossen | 1 Stunde |
notify_todo_checklist_complete() |
Benachrichtigen wenn alle Checklisten-Elemente erledigt | 1 Stunde |
notify_new_todo_assigned() |
Beauftragten über neue Arbeit benachrichtigen (überspringt Selbstzuweisung) | 1 Stunde |
notify_export_job_complete() |
Bei Export-Abschluss oder -Fehler benachrichtigen | 1 Stunde |
notify_import_job_complete() |
Bei Import-Abschluss oder -Fehler benachrichtigen | 1 Stunde |
Signale¶
Speicherort: app/notifications/signals.py
Note
Todo-Signal-Handler wurden entfernt (Activities-App wurde zu arbeitsspezifischen Modellen migriert). Nur Export-/Import-Handler sind aktiv.
| Signal | Auslöser | Aktion |
|---|---|---|
| handle_export_job_saved | post_save auf ExportJob (nur Aktualisierung) |
Benachrichtigt bei Status 'completed' oder 'failed' |
| handle_import_job_saved | post_save auf ImportJob (nur Aktualisierung) |
Benachrichtigt bei Status 'completed' oder 'failed' |
Context Processors¶
Speicherort: app/notifications/context_processors.py
notification_context()¶
Fügt die folgenden Variablen zu allen Templates hinzu:
unread_notification_count-- Anzahl ungelesener, nicht archivierter Benachrichtigungen für den aktuellen Benutzerrecent_notifications-- 5 neueste Benachrichtigungen (ungelesene zuerst, dann nach Erstellungsdatum sortiert)
Gibt Nullen und leere Listen für anonyme Benutzer zurück. Filtert Benachrichtigungen nach den zugänglichen Organisationen des Benutzers.
Verwaltungsbefehle¶
cleanup_old_notifications¶
Archiviert und löscht alte Benachrichtigungen basierend auf der Aufbewahrungsrichtlinie.
# Änderungen anzeigen ohne Daten zu ändern
python manage.py cleanup_old_notifications --dry-run
# Mit Standardeinstellungen ausführen (Archivierung nach 90 Tagen, Löschung nach 180 Tagen)
python manage.py cleanup_old_notifications
# Benutzerdefinierte Aufbewahrungszeiträume
python manage.py cleanup_old_notifications --retention-days 60 --delete-after-days 120
Einstellungen (konfigurierbar über Django-Einstellungen):
| Einstellung | Standard | Beschreibung |
|---|---|---|
NOTIFICATION_RETENTION_DAYS |
90 | Tage bis Benachrichtigungen archiviert werden |
NOTIFICATION_DELETE_AFTER_DAYS |
180 | Tage bis Benachrichtigungen endgültig gelöscht werden |
URL-Patterns¶
notifications/ → NotificationListView (notification-list)
notifications/<int:pk>/mark-read/ → NotificationMarkReadView (notification-mark-read)
notifications/mark-all-read/ → NotificationMarkAllReadView (notification-mark-all-read)
notifications/<int:pk>/delete/ → NotificationDeleteView (notification-delete)
notifications/delete-category/<str:category>/ → NotificationDeleteCategoryView (notification-delete-category)
Admin¶
Das Notification-Modell ist in der Django-Admin-Oberfläche registriert und bietet:
- Listenanzeige: ID, Empfänger, Organisation, Kategorie, Priorität, Titel, Gelesen-Status, Archiviert-Status, Erstellungsdatum
- Filter: Kategorie, Priorität, Gelesen-Status, Archiviert-Status, Erstellungsdatum
- Suche: Titel, Nachricht, Empfänger-Benutzername
- Fieldsets: Empfänger, Benachrichtigungsinhalt, Verknüpftes Objekt (einklappbar), Status, Zeitstempel (einklappbar)
Wichtige Funktionen¶
- Automatische Auslöser: Export-/Import-Job-Abschlüsse lösen Benachrichtigungen über Signale aus
- Dashboard-Alarme: Überfällige Arbeiten, Durchsicht-Erinnerungen (7+ Tage), Warnungen bei niedrigem Bestand
- Deduplizierung: Verhindert doppelte Benachrichtigungen innerhalb konfigurierbarer Zeiträume (1-24 Stunden)
- AJAX-Unterstützung: Als gelesen markieren und Löschen via AJAX mit JSON-Antworten
- Massenoperationen: Alle als gelesen markieren, nach Kategorie löschen, alle Benachrichtigungen löschen
- Generische Verknüpfungen: Benachrichtigungen mit beliebigen Modellen über GenericForeignKey verknüpfen
- Prioritätssystem: Visuelle Indikatoren (farbcodiert) für Dringlichkeitsstufen
- Bereinigungsbefehl: Automatisierte Archivierung und Löschung alter Benachrichtigungen
- Context Processor: Ungelesen-Zähler und neueste Benachrichtigungen global in allen Templates verfügbar
Siehe auch¶
- DataExchange-App-Referenz - Löst Export-/Import-Benachrichtigungen aus
- Home-App-Referenz - Dashboard-Warnungen
- Organizations-App-Referenz - Organisations-Zuordnung