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

1import uuid 

2 

3from django.db import models 

4from django.utils import timezone 

5 

6 

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 """ 

11 

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) 

16 

17 

18class CoreModelActiveManager(models.Manager): 

19 """ 

20 Active instances of a CoreModel are not deleted. 

21 """ 

22 

23 def get_queryset(self): 

24 return super().get_queryset().filter(deleted__isnull=True) 

25 

26 

27class CoreModelManager(models.Manager): 

28 @classmethod 

29 def get_archived_items(self): 

30 return self.objects.filter(archived=True) 

31 

32 @classmethod 

33 def get_deleted_items(self): 

34 return self.objects.filter(deleted__isnull=False) 

35 

36 @classmethod 

37 def get_hard_deleted_items(self): 

38 return self.objects.filter(deleted__hard_deleted=True) 

39 

40 @classmethod 

41 def get_soft_deleted_items(self): 

42 return self.objects.filter(deleted__soft_deleted=True) 

43 

44 

45class CoreModel(models.Model): 

46 class Meta: 

47 abstract = True 

48 

49 active_objects = CoreModelActiveManager() 

50 objects = CoreModelManager() 

51 

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) 

57 

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 """ 

62 

63 self.soft_delete(person_id) 

64 

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 """ 

69 

70 self.deleted = DeletedModel.objects.create( 

71 soft_deleted=False, 

72 hard_deleted=True, 

73 deleted_by_id=person_id, 

74 ) 

75 self.save() 

76 

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 """ 

81 

82 self.deleted = DeletedModel.objects.create( 

83 soft_deleted=True, 

84 hard_deleted=False, 

85 deleted_by_id=person_id, 

86 ) 

87 self.save() 

88 

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 """ 

93 

94 self.deleted = DeletedModel.objects.create( 

95 soft_deleted=True, 

96 hard_deleted=False, 

97 deleted_by_id=person_id, 

98 ) 

99 self.save() 

100 

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 """ 

105 

106 self.deleted = None 

107 self.save() 

108 

109 

110class Sequenced(CoreModel): 

111 class Meta: 

112 abstract = True 

113 ordering = ['sequence'] 

114 

115 sequence = models.PositiveIntegerField()