219 lines
7.1 KiB
Python
219 lines
7.1 KiB
Python
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from bird.models import BirdStatus
|
|
|
|
|
|
class StatisticIndividual(models.Model):
|
|
"""
|
|
Definiert Gruppierungen von BirdStatus für die Statistik-Anzeige der Vogelarten.
|
|
Ermöglicht die flexible Konfiguration der Balkendiagramm-Kategorien.
|
|
"""
|
|
name = models.CharField(
|
|
max_length=100,
|
|
verbose_name=_("Gruppenname"),
|
|
help_text=_("Name der Gruppe (z.B. 'Gerettet', 'Verstorben')")
|
|
)
|
|
|
|
color = models.CharField(
|
|
max_length=7,
|
|
default="#28a745",
|
|
verbose_name=_("Farbe"),
|
|
help_text=_("Hex-Farbcode (z.B. #28a745 für Grün)")
|
|
)
|
|
|
|
order = models.PositiveIntegerField(
|
|
default=0,
|
|
verbose_name=_("Reihenfolge"),
|
|
help_text=_("Bestimmt die Reihenfolge der Gruppen in den Balkendiagrammen")
|
|
)
|
|
|
|
status_list = models.ManyToManyField(
|
|
BirdStatus,
|
|
verbose_name=_("Status"),
|
|
help_text=_("Welche Status gehören zu dieser Gruppe?")
|
|
)
|
|
|
|
is_active = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Aktiv"),
|
|
help_text=_("Soll diese Gruppe in der Statistik angezeigt werden?")
|
|
)
|
|
|
|
created = models.DateTimeField(auto_now_add=True, verbose_name=_("Erstellt am"))
|
|
updated = models.DateTimeField(auto_now=True, verbose_name=_("Geändert am"))
|
|
|
|
class Meta:
|
|
verbose_name = _("Statistik-Individuum")
|
|
verbose_name_plural = _("Statistik-Individuen")
|
|
ordering = ['order', 'name']
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.get_status_names()})"
|
|
|
|
def get_status_names(self):
|
|
"""Gibt eine kommaseparierte Liste der Status-Namen zurück."""
|
|
return ", ".join(self.status_list.values_list('description', flat=True))
|
|
|
|
def get_css_color(self):
|
|
"""Gibt die CSS-Farbe für die Anzeige zurück."""
|
|
return self.color
|
|
|
|
|
|
class StatisticYearGroup(models.Model):
|
|
"""
|
|
Definiert Gruppierungen von BirdStatus für die Jahres-Übersichtskarten.
|
|
"""
|
|
name = models.CharField(
|
|
max_length=100,
|
|
verbose_name=_("Gruppenname"),
|
|
help_text=_("Name der Gruppe für die Jahresstatistik")
|
|
)
|
|
|
|
color = models.CharField(
|
|
max_length=7,
|
|
default="#007bff",
|
|
verbose_name=_("Farbe"),
|
|
help_text=_("Hex-Farbcode für die Anzeige")
|
|
)
|
|
|
|
order = models.PositiveIntegerField(
|
|
default=0,
|
|
verbose_name=_("Reihenfolge"),
|
|
help_text=_("Bestimmt die Reihenfolge der Karten in der Jahresübersicht")
|
|
)
|
|
|
|
status_list = models.ManyToManyField(
|
|
BirdStatus,
|
|
verbose_name=_("Status"),
|
|
help_text=_("Welche Status gehören zu dieser Jahresgruppe?")
|
|
)
|
|
|
|
is_active = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Aktiv"),
|
|
help_text=_("Soll diese Gruppe in der Jahresstatistik angezeigt werden?")
|
|
)
|
|
|
|
created = models.DateTimeField(auto_now_add=True, verbose_name=_("Erstellt am"))
|
|
updated = models.DateTimeField(auto_now=True, verbose_name=_("Geändert am"))
|
|
|
|
class Meta:
|
|
verbose_name = _("Statistik-Jahr Gruppe")
|
|
verbose_name_plural = _("Statistik-Jahr")
|
|
ordering = ['order', 'name']
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.get_status_names()})"
|
|
|
|
def get_status_names(self):
|
|
"""Gibt eine kommaseparierte Liste der Status-Namen zurück."""
|
|
return ", ".join(self.status_list.values_list('description', flat=True))
|
|
|
|
|
|
class StatisticTotalGroup(models.Model):
|
|
"""
|
|
Definiert Gruppierungen von BirdStatus für die Gesamt-Übersichtskarten.
|
|
"""
|
|
name = models.CharField(
|
|
max_length=100,
|
|
verbose_name=_("Gruppenname"),
|
|
help_text=_("Name der Gruppe für die Gesamtstatistik")
|
|
)
|
|
|
|
color = models.CharField(
|
|
max_length=7,
|
|
default="#28a745",
|
|
verbose_name=_("Farbe"),
|
|
help_text=_("Hex-Farbcode für die Anzeige")
|
|
)
|
|
|
|
order = models.PositiveIntegerField(
|
|
default=0,
|
|
verbose_name=_("Reihenfolge"),
|
|
help_text=_("Bestimmt die Reihenfolge der Karten in der Gesamtübersicht")
|
|
)
|
|
|
|
status_list = models.ManyToManyField(
|
|
BirdStatus,
|
|
verbose_name=_("Status"),
|
|
help_text=_("Welche Status gehören zu dieser Gesamtgruppe?")
|
|
)
|
|
|
|
is_active = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Aktiv"),
|
|
help_text=_("Soll diese Gruppe in der Gesamtstatistik angezeigt werden?")
|
|
)
|
|
|
|
created = models.DateTimeField(auto_now_add=True, verbose_name=_("Erstellt am"))
|
|
updated = models.DateTimeField(auto_now=True, verbose_name=_("Geändert am"))
|
|
|
|
class Meta:
|
|
verbose_name = _("Statistik-Insgesamt Gruppe")
|
|
verbose_name_plural = _("Statistik-Insgesamt")
|
|
ordering = ['order', 'name']
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.get_status_names()})"
|
|
|
|
def get_status_names(self):
|
|
"""Gibt eine kommaseparierte Liste der Status-Namen zurück."""
|
|
return ", ".join(self.status_list.values_list('description', flat=True))
|
|
|
|
|
|
class StatisticConfiguration(models.Model):
|
|
"""
|
|
Globale Konfiguration für die Statistik-Anzeige.
|
|
"""
|
|
# Jahresstatistik Einstellungen
|
|
show_year_total_patients = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Gesamtanzahl Patienten dieses Jahr anzeigen"),
|
|
help_text=_("Zeigt die Gesamtanzahl aller aufgenommenen Patienten des aktuellen Jahres")
|
|
)
|
|
|
|
# Gesamtstatistik Einstellungen
|
|
show_total_patients = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Gesamtanzahl aller Patienten anzeigen"),
|
|
help_text=_("Zeigt die Gesamtanzahl aller Patienten seit Beginn der Aufzeichnungen")
|
|
)
|
|
|
|
# Weitere Anzeige-Optionen
|
|
show_percentages = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Prozentangaben anzeigen"),
|
|
help_text=_("Sollen Prozentangaben in den Balkendiagrammen angezeigt werden?")
|
|
)
|
|
|
|
show_absolute_numbers = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Absolute Zahlen anzeigen"),
|
|
help_text=_("Sollen absolute Zahlen in den Balkendiagrammen angezeigt werden?")
|
|
)
|
|
|
|
is_active = models.BooleanField(
|
|
default=True,
|
|
verbose_name=_("Aktive Konfiguration"),
|
|
help_text=_("Nur eine Konfiguration kann gleichzeitig aktiv sein")
|
|
)
|
|
|
|
created = models.DateTimeField(auto_now_add=True, verbose_name=_("Erstellt am"))
|
|
updated = models.DateTimeField(auto_now=True, verbose_name=_("Geändert am"))
|
|
|
|
class Meta:
|
|
verbose_name = _("Statistik-Konfiguration")
|
|
verbose_name_plural = _("Statistik-Konfiguration")
|
|
|
|
def __str__(self):
|
|
return "Statistik Konfiguration"
|
|
|
|
def save(self, *args, **kwargs):
|
|
# Stelle sicher, dass nur eine Konfiguration aktiv ist
|
|
if self.is_active:
|
|
StatisticConfiguration.objects.filter(is_active=True).update(is_active=False)
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
# Backward Compatibility Alias (temporär für Migration)
|
|
StatisticGroup = StatisticIndividual
|