from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ class AsyncTaskLog(models.Model): STATUS_CHOICES = [ ('started', _('Gestartet')), ('succeeded', _('Erfolgreich')), ('failed', _('Fehlgeschlagen')), ] task_name = models.CharField(max_length=255) task_id = models.CharField(max_length=255, blank=True) target_type = models.CharField(max_length=80, blank=True) target_id = models.PositiveIntegerField(null=True, blank=True) target_label = models.CharField(max_length=255, blank=True) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='started') error_message = models.TextField(blank=True) started_at = models.DateTimeField(auto_now_add=True) finished_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-started_at', '-id'] verbose_name = 'Async Task Log' verbose_name_plural = 'Async Task Logs' def __str__(self) -> str: return f'{self.task_name} | {self.status} | {self.target_label or self.target_type}' class AdminAuditLog(models.Model): actor = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name='admin_audit_logs') actor_display = models.CharField(max_length=255, blank=True) action = models.CharField(max_length=120) target_type = models.CharField(max_length=80, blank=True) target_id = models.PositiveIntegerField(null=True, blank=True) target_label = models.CharField(max_length=255, blank=True) details = models.JSONField(default=dict, blank=True) created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['-created_at', '-id'] verbose_name = 'Admin Audit Log' verbose_name_plural = 'Admin Audit Logs' def __str__(self) -> str: actor = self.actor_display or 'Unbekannt' return f'{self.created_at:%Y-%m-%d %H:%M} | {actor} | {self.action}'