Zum Inhalt

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=now
  • mark_as_unread() -- Setzt is_read=False und read_at=None
  • category_icon() -- Gibt Bootstrap-Icon-Klasse für Kategorie zurück
  • priority_color() -- Gibt Bootstrap-Farbklasse für Priorität zurück
  • user_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 Benutzer
  • recent_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