import uuid from django.db import models from django.utils import timezone class UUIDPrimaryKeyModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) class Meta: abstract = True class TimeStampedModel(UUIDPrimaryKeyModel): created_at = models.DateTimeField(auto_now_add=True, db_index=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True ordering = ["-created_at"] class ActiveManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(deleted_at__isnull=True) class SoftDeleteModel(TimeStampedModel): deleted_at = models.DateTimeField(null=True, blank=True, db_index=True) objects = ActiveManager() all_objects = models.Manager() def delete(self, using=None, keep_parents=False): self.deleted_at = timezone.now() self.save(update_fields=["deleted_at"]) def hard_delete(self): super().delete() def restore(self): self.deleted_at = None self.save(update_fields=["deleted_at"]) @property def is_deleted(self): return self.deleted_at is not None class Meta: abstract = True class AuditedModel(SoftDeleteModel): created_by = models.ForeignKey( "org.Staff", null=True, blank=True, on_delete=models.SET_NULL, related_name="%(app_label)s_%(class)s_created", db_index=True, ) updated_by = models.ForeignKey( "org.Staff", null=True, blank=True, on_delete=models.SET_NULL, related_name="%(app_label)s_%(class)s_updated", ) class Meta: abstract = True