from django.db import models from django.conf import settings from django.core.serializers.json import DjangoJSONEncoder from django.utils.translation import gettext_lazy as _ from .safe_json_encoder import SafeJSONEncoder import datetime # --------------------------------------------------------------------------- # SafeJSONEncoder # --------------------------------------------------------------------------- class SafeJSONEncoder(DjangoJSONEncoder): """JSON encoder that can handle datetime.date properly.""" def default(self, obj): if isinstance(obj, datetime.date): return obj.isoformat() return super().default(obj) # --------------------------------------------------------------------------- # AuditLog # --------------------------------------------------------------------------- class AuditLog(models.Model): """Generic audit log entry for tracking changes.""" class Meta: verbose_name = _("Auditlog") verbose_name_plural = _("Auditlogs") ACTION_CHOICES = [ ("create", "Created"), ("update", "Updated"), ("delete", "Deleted"), ] user = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="audit_logs" ) action = models.CharField(max_length=10, choices=ACTION_CHOICES) model = models.CharField(max_length=100) object_id = models.CharField(max_length=50) changes = models.JSONField(null=True, blank=True, encoder=SafeJSONEncoder) timestamp = models.DateTimeField(auto_now_add=True) def __str__(self): return f"[{self.timestamp}] {self.user} {self.action} {self.model}({self.object_id})"