Home-App-Referenz¶
Die Home-App stellt das Haupt-Dashboard, Progressive Web App (PWA)-Funktionalität, gemeinsame View- und Formular-Mixins, Template-Tags, einen Health-Check-Endpunkt und rechtliche Seiten bereit, die in der gesamten Anwendung verwendet werden.
Übersicht¶
Speicherort: app/home/
Zweck: Dashboard, PWA-Unterstützung, gemeinsame Mixins, Template-Tags, Health-Check, rechtliche Seiten
URL-Namespace: home:
Abhängigkeiten: hives, breeding, warehouse, organizations, notifications, systemconfig, users, dataexchange
Modelle¶
Die Home-App hat keine Datenbankmodelle. Sie aggregiert Daten aus anderen Apps.
Dateistruktur¶
home/
├── views.py # Dashboard-Views (home, work)
├── views_pwa.py # PWA-Views (manifest, offline, CSRF)
├── views_health.py # Health-Check-Endpunkt für Container-Orchestrierung
├── views_legal.py # Rechtliche Seiten (Cookie-Richtlinie)
├── mixins.py # Gemeinsame View-Mixins für alle Apps
├── form_mixins.py # Gemeinsame Formular-Mixins (Datumsbereich-Validierung)
├── urls.py # URL-Routing + PWA-Routen
├── context_processors.py # Globaler Template-Kontext (10 Prozessoren)
├── templatetags/
│ ├── icon_tags.py # Zentralisiertes Entity-Icon-Register
│ ├── status_tags.py # Status-Badge-Farben
│ └── table_helpers.py # Sortierbare Tabellenkopf-Tags
├── management/
│ └── commands/
│ └── load_sample_data.py # Beispieldaten-Lader
├── static/home/
│ ├── main.css # Haupt-Anwendungsstile
│ ├── sidebar.css # Seitenleisten-Navigationsstile
│ ├── sidebar.js # Seitenleisten-Toggle-Logik
│ └── quick_create.js # Schnellerstellung + Offline-Unterstützung
├── static/vendor/ # Lokal gehostete Drittanbieter-Bibliotheken (DSGVO)
│ ├── bootstrap/ # Bootstrap CSS + JS-Bundle
│ ├── bootstrap-icons/ # Bootstrap Icons Schriftart (CSS + woff/woff2)
│ ├── chart.js/ # Chart.js UMD-Bundle
│ ├── chartjs-adapter-date-fns/ # Chart.js Datums-Adapter
│ ├── leaflet/ # Leaflet Karten (CSS, JS, Marker-Bilder)
│ └── vis-network/ # vis-network Graph-Bibliothek (Standalone UMD)
├── static/pwa/
│ ├── service-worker.js # Service Worker mit Caching-Strategien
│ ├── pwa-init.js # PWA-Registrierung & Update-Handling
│ ├── offline-sync.js # IndexedDB Offline-Warteschlange
│ └── icons/ # PWA-App-Icons (192x192, 512x512)
├── templates/home/
│ ├── base.html # Haupt-Layout mit PWA-Meta-Tags
│ ├── _sidebar.html # Seitenleisten-Navigation mit Badge
│ ├── _quick_create_panel.html
│ ├── home.html # Dashboard-View
│ └── cookie_policy.html # Cookie-Richtlinie-Seite
└── templates/pwa/
├── manifest.json # Dynamisches PWA-Manifest (Django-Template)
└── offline.html # Offline-Fallback-Seite
Views¶
Dashboard-Views¶
home(request) (views.py)
Haupt-Dashboard-View mit aggregierten Statistiken über alle Benutzerorganisationen.
- URL:
/-- Name:home-home - Authentifizierung: Optional (Startseite für anonyme, Dashboard für authentifizierte Benutzer)
- Template:
home/home.html
Kontextdaten (authentifizierte Benutzer):
| Variable | Typ | Beschreibung |
|---|---|---|
total_hives |
int | Bienenstöcke gesamt über alle Organisationen |
active_hives |
int | Aktive Bienenstöcke (is_active=True) |
hives_needing_inspection |
int | Bienenstöcke ohne Durchsicht in den letzten 7 Tagen |
total_honey_harvested |
Decimal | Gesamte Honigernte (kg) dieses Jahr |
recent_harvests |
QuerySet | Letzte 5 Ernteeinträge |
batches_this_year |
dict | Chargen-Statistiken: total, open_count |
jars_in_inventory |
int | Gläser mit Status 'in_inventory' |
upcoming_activities |
list | Nächste 5 anstehende Arbeiten (sortiert nach Plandatum) |
overdue_activities |
int | Anzahl überfälliger Arbeiten |
hives_by_health |
dict | Bienenstockanzahl nach Gesundheitsstatus |
health_status_choices |
QuerySet | Konfigurierte Gesundheitsstatus-Optionen |
queens_by_health |
dict | Königinnenanzahl nach Gesundheitsstatus |
total_queens |
int | Aktive Königinnen gesamt |
queens_young |
int | Königinnen unter 1 Jahr |
queens_prime |
int | Königinnen 1-2 Jahre |
aging_queens |
int | Königinnen älter als 2 Jahre |
recent_inspections |
QuerySet | Letzte 5 Durchsichten |
active_breeding |
int | Aktive Zuchtprogramme |
recent_splits |
int | Völkerteilungen in den letzten 7 Tagen |
low_stock_items |
int | Inventarartikel unter Mindestmenge |
total_sales |
Decimal | Gesamtverkaufsbetrag dieses Jahr |
recent_sales |
QuerySet | Letzte 5 Produktverkäufe |
current_year |
int | Aktuelles Jahr |
work(request) (views.py)
Arbeits-Dashboard-View. Derzeit ein Platzhalter für Aufgaben-/Projektverwaltung.
- URL:
/work-- Name:home-work
Health-Check-View¶
health_check(request) (views_health.py)
Einfacher Health-Check-Endpunkt für Container-Orchestrierung (Docker, Kubernetes).
- URL:
/health/-- Name:health-check - Authentifizierung: Nicht erforderlich
- CSRF: Ausgenommen
- Antwort: JSON mit Gesundheitsstatus und Datenbankverbindung
- HTTP-Status: 200 (gesund) oder 503 (nicht gesund)
- Cache: 10 Sekunden (
Cache-Control: public, max-age=10)
Rechtliche Views¶
cookie_policy(request) (views_legal.py)
Zeigt die Cookie-Richtlinie-Seite für DSGVO-Konformität an.
- URL:
/cookie-policy/-- Name:cookie-policy - Authentifizierung: Nicht erforderlich
PWA-Views¶
manifest_json(request) (views_pwa.py)
Liefert ein dynamisches PWA-Web-App-Manifest.
- URL:
/pwa/manifest.json-- Name:pwa-manifest - Fügt
org_colors.primaryalstheme_colorein - Unterstützt i18n (sprachspezifische Beschreibungen)
- Content-Type:
application/manifest+json
offline_view(request) (views_pwa.py)
Offline-Fallback-Seite, wenn der Benutzer keine Netzwerkverbindung hat.
- URL:
/pwa/offline/-- Name:pwa-offline - Listet verfügbare gecachte Seiten
- Lädt automatisch neu bei Verbindungswiederherstellung
csrf_token_view(request) (views_pwa.py)
Stellt frische CSRF-Tokens für Offline-Formular-Sync bereit.
- URL:
/accounts/csrf/-- Name:csrf-token - Nie gecacht (
Cache-Control: no-store) - Gibt JSON-Antwort zurück
Gemeinsame View-Mixins¶
Speicherort: app/home/mixins.py
Diese Mixins werden in allen Apps für konsistente Berechtigungsprüfung und Listen-Funktionalität verwendet.
Berechtigungs-Mixins¶
| Mixin | Zweck | Verwendet von |
|---|---|---|
| OrgCreatePermissionMixin | Prüft Org-Level-Erstellungsberechtigung | CreateViews |
| ViewPermissionMixin | Prüft Objekt-Level-Ansichtsberechtigung | DetailViews |
| EditPermissionMixin | Prüft Objekt-Level-Bearbeitungsberechtigung | UpdateViews |
| DeletePermissionMixin | Prüft Objekt-Level-Löschberechtigung | DeleteViews |
| OrgFilterMixin | Filtert QuerySet nach Benutzerorganisationen | ListViews |
Listen-View-Mixins¶
| Mixin | Zweck | Verwendet von |
|---|---|---|
| SortableListMixin | Spaltensortierung via GET-Parameter (sort, order) | Sortierbare Tabellen |
| FilterableListMixin | Filter-Formular-Unterstützung für ListViews | Gefilterte Listen |
| SortableFilterableListMixin | Kombinierte Sortierung + Filterung | Listen mit beidem |
Gemeinsame Formular-Mixins¶
Speicherort: app/home/form_mixins.py
Wiederverwendbare Formular-Mixins für gängige Validierungs- und Initialisierungsmuster.
| Mixin | Zweck | Verwendet von |
|---|---|---|
| DateRangeValidationMixin | Validiert, dass Enddatum nicht vor Startdatum liegt | Filterformulare mit Datumsbereichen |
| DefaultDateRangeMixin | Setzt Standard-Startdatum (1 Jahr zurück) und Enddatum (heute) | Filterformulare mit Standardwerten |
| DateRangeFilterMixin | Kombinierte Standardwerte + Validierung (empfohlen) | Alle Datumsbereich-Filterformulare |
Template-Tags¶
Icon-Tags (templatetags/icon_tags.py)¶
Zentralisiertes Entity-Icon-Register für konsistente visuelle Sprache.
Tags:
| Tag | Zweck | Verwendung |
|---|---|---|
entity_icon |
Icon-Klassen-String abrufen | {% entity_icon 'hive' %} gibt bi-hexagon zurück |
entity_icon_html |
Vollständiges HTML-Element abrufen | {% entity_icon_html 'queen' 'me-1' %} |
get_entity_icon_map |
Vollständige Map für JS/Iteration abrufen | {% get_entity_icon_map as icons %} |
Icon-Map (vollständig):
| Entity | Icon |
|---|---|
| hive | bi-hexagon |
| queen | bi-star |
| breeding_hive | bi-hexagon-half |
| harvest | bi-droplet |
| batch | bi-archive |
| bucket | bi-bucket |
| jar | bi-cup |
| feeding | bi-cup-straw |
| treatment | bi-capsule |
| maintenance | bi-tools |
| inspection | bi-clipboard-check |
| breeding | bi-diagram-3 |
| split | bi-diagram-2 |
| lineage | bi-diagram-3 |
| warehouse | bi-box-seam |
| inventory | bi-box-seam |
| location | bi-geo-alt |
| transaction | bi-arrow-left-right |
| sale | bi-currency-dollar |
| organization | bi-building |
| weight | bi-speedometer2 |
| info | bi-info-circle |
| notes | bi-journal-text |
| reports | bi-graph-up |
| dashboard | bi-speedometer2 |
| settings | bi-gear |
| system | bi-gear |
Status-Tags (templatetags/status_tags.py)¶
Status-Badge-Farben für konsistentes Styling in allen Templates.
Tags:
| Tag/Filter | Zweck | Verwendung |
|---|---|---|
status_color |
Bootstrap-Farbklasse abrufen | {% status_color 'completed' %} gibt success zurück |
status_badge |
Vollständiges HTML-Badge | {% status_badge jar.status jar.get_status_display %} |
priority_badge |
Prioritäts-Badge (Komfort-Wrapper) | {% priority_badge feeding.priority %} |
get_item (Filter) |
Wörterbuchzugriff mit dynamischem Schlüssel | {{ hives_by_health|get_item:choice.value }} |
Tabellen-Hilfsfunktionen (templatetags/table_helpers.py)¶
Tags für sortierbare Tabellenköpfe und Query-String-Verwaltung bei Seitenumbrüchen.
Tags:
| Tag/Filter | Zweck | Verwendung |
|---|---|---|
sortable_header |
Sortierbares <th> mit Link und Sort-Icon |
{% sortable_header 'name' 'Item Name' current_sort current_order %} |
query_string |
Query-String unter Beibehaltung von GET-Parametern erstellen | {% query_string page=2 %} |
table_sort_icon |
Nur Sort-Icon-Klasse abrufen | {% table_sort_icon 'name' current_sort current_order %} |
next_sort_order (Filter) |
Zwischen asc/desc umschalten | {{ current_order|next_sort_order }} |
Context Processors¶
Speicherort: app/home/context_processors.py
10 Context Processors, registriert in settings.py. In allen Templates verfügbar:
| Variable | Beschreibung |
|---|---|
DOCS_URL |
Dokumentations-Link mit Sprachsuffix (/de/ für Deutsch) |
user_role |
Benutzerrolle in aktueller Organisation |
user_is_org_manager |
True wenn Benutzer Besitzer/Admin irgendeiner Organisation ist |
user_is_org_owner |
True wenn Benutzer Besitzer der aktuellen Organisation ist |
user_is_org_admin |
True wenn Benutzer Admin der aktuellen Organisation ist |
org_colors |
Organisations-Farbschema (primär, sekundär) |
VERSION |
Anwendungsversion |
allow_self_registration |
Ob Selbstregistrierung aktiviert ist |
disable_standard_login |
Verbirgt Standard-Anmeldeformular für reine OIDC-Konfigurationen |
COOKIE_CONSENT_VERSION |
Cookie-Zustimmungsversion für DSGVO-Banner |
COOKIE_CONSENT_ANALYTICS_ENABLED |
Ob Analyse-Cookies konfiguriert sind |
user_theme_preference |
Benutzer-Theme: 'light', 'dark' oder 'system' |
show_changelog_modal |
True wenn Benutzer das Changelog der aktuellen Version noch nicht gesehen hat |
changelog_version |
Aktuelle Anwendungsversionszeichenfolge |
Verwaltungsbefehle¶
load_sample_data¶
Lädt Beispieldaten für Entwicklung und Demonstration.
Erstellt 5 Benutzer, 2 Organisationen und umfassende Imkereidaten einschließlich Bienenstöcke, Königinnen, Durchsichten, Ernten, Honigchargen, Zuchteinträge, Inventarartikel, Arbeiten und Benachrichtigungen. Delegiert an dataexchange.services.sample_data_service.
Progressive Web App (PWA)¶
Service Worker (static/pwa/service-worker.js)¶
Caching-Strategien:
- Network-First: HTML-Seiten (3-Sekunden-Timeout, dann Cache-Fallback)
- Cache-First: Statische Assets (CSS, JS, Bilder, Fonts, CDN-Ressourcen)
- Network-Only: Admin, Auth, Mutations-Anfragen (POST/PUT/DELETE)
Vor-gecachte Assets: Home-Dashboard, Work-Dashboard, Offline-Seite, Main-CSS, Logo, lokale Vendor-Assets
Message-Handler:
ORG_SWITCH: Löscht dynamischen Cache, cacht Seiten für neue Organisation neuLANG_CHANGE: Löscht HTML-Cache zur Aktualisierung der ÜbersetzungenSKIP_WAITING: Erzwingt sofortige Aktivierung bei Update
Offline-Sync (static/pwa/offline-sync.js)¶
IndexedDB-Schema:
- Datenbank:
bifolk-offline - Store:
pending-operations - Unterstützte Typen: feeding, treatment, maintenance, inspection, harvest
Sync-Verhalten:
- Sync bei Seitenladung (wenn online)
- Sync bei Verbindungswiederherstellung (
online-Event) - Manueller Sync via Seitenleisten-Schaltfläche
- Wiederholung mit exponentiellem Backoff (max. 3 Versuche)
- CSRF-Token Auto-Refresh bei 403-Antwort
Globale API: window.bifolkOfflineSync stellt addOperation(), getPendingOperations(), getPendingCount(), syncPendingOperations() bereit
Quick-Create Offline-Unterstützung (static/home/quick_create.js)¶
Bei Offline-Zustand zeigt die Arbeitserfassung ein Modal statt weiterzuleiten. Der Benutzer gibt Datum und Notizen ein, und die Arbeit wird in IndexedDB für spätere Synchronisation eingereiht.