Coverage for core/models/core.py: 100.00%
53 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-16 03:03 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-16 03:03 +0000
1import uuid
3from django.db import models
4from django.utils import timezone
7class DeletedModel(models.Model):
8 """
9 Flags a record as deleted. Soft delete is the default behavior that allows the user to restore the item, hard delete cannot be undone by the user, but by administrators only.
10 """
12 deleted_by = models.ForeignKey('core.CoreUser', on_delete=models.CASCADE, editable=False)
13 deleted_on = models.DateTimeField(null=False, default=timezone.now, editable=False)
14 hard_deleted = models.BooleanField(default=False)
15 soft_deleted = models.BooleanField(default=False)
18class CoreModelActiveManager(models.Manager):
19 """
20 Active instances of a CoreModel are not deleted.
21 """
23 def get_queryset(self):
24 return super().get_queryset().filter(deleted__isnull=True)
27class CoreModelManager(models.Manager):
28 @classmethod
29 def get_archived_items(self):
30 return self.objects.filter(archived=True)
32 @classmethod
33 def get_deleted_items(self):
34 return self.objects.filter(deleted__isnull=False)
36 @classmethod
37 def get_hard_deleted_items(self):
38 return self.objects.filter(deleted__hard_deleted=True)
40 @classmethod
41 def get_soft_deleted_items(self):
42 return self.objects.filter(deleted__soft_deleted=True)
45class CoreModel(models.Model):
46 class Meta:
47 abstract = True
49 active_objects = CoreModelActiveManager()
50 objects = CoreModelManager()
52 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
53 created_by = models.ForeignKey('core.CoreUser', on_delete=models.CASCADE, editable=False, related_name='%(class)s_created_by')
54 created_on = models.DateTimeField(null=False, default=timezone.now, editable=False)
55 archived = models.BooleanField(default=False)
56 deleted = models.ForeignKey(DeletedModel, on_delete=models.CASCADE, null=True, blank=True, db_index=False)
58 def delete(self, person_id):
59 """
60 Flags a record as deleted. Soft delete is the default behavior that allows the user to restore the item, hard delete cannot be undone by the user, but by administrators only.
61 """
63 self.soft_delete(person_id)
65 def hard_delete(self, person_id):
66 """
67 Flags a record as hard-deleted. Hard delete means only an administrator can restore the item.
68 """
70 self.deleted = DeletedModel.objects.create(
71 soft_deleted=False,
72 hard_deleted=True,
73 deleted_by_id=person_id,
74 )
75 self.save()
77 def soft_delete(self, person_id):
78 """
79 Flags a record as deleted. Soft delete is the default behavior that allows the user to restore the item, hard delete cannot be undone by the user, but by administrators only.
80 """
82 self.deleted = DeletedModel.objects.create(
83 soft_deleted=True,
84 hard_deleted=False,
85 deleted_by_id=person_id,
86 )
87 self.save()
89 def undo_hard_delete(self, person_id):
90 """
91 Resets a record as soft-deleted. Hard-deletes can only be reset by an administrator.
92 """
94 self.deleted = DeletedModel.objects.create(
95 soft_deleted=True,
96 hard_deleted=False,
97 deleted_by_id=person_id,
98 )
99 self.save()
101 def undo_soft_delete(self, person_id):
102 """
103 Restores a record that was deleted. A user can restore a soft-deleted record.
104 """
106 self.deleted = None
107 self.save()
110class Sequenced(CoreModel):
111 class Meta:
112 abstract = True
113 ordering = ['sequence']
115 sequence = models.PositiveIntegerField()