Coverage for core\models.py: 79%

29 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-05 09:19 +0800

1import uuid 

2from django.db import models 

3from django.utils import timezone 

4 

5class UUIDModel(models.Model): 

6 """Abstract model with a UUID primary key.""" 

7 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 

8 

9 class Meta: 

10 abstract = True 

11 

12class TimeStampedModel(models.Model): 

13 """Abstract model with created_at and updated_at timestamps.""" 

14 created_at = models.DateTimeField(auto_now_add=True, db_index=True) 

15 updated_at = models.DateTimeField(auto_now=True) 

16 

17 class Meta: 

18 abstract = True 

19 

20class TenantScopedModel(UUIDModel, TimeStampedModel): 

21 """Abstract model scoped to an organization (tenant).""" 

22 tenant_id = models.UUIDField(db_index=True, help_text="Organization / Tenant ID") 

23 

24 class Meta: 

25 abstract = True 

26 

27class SoftDeleteModel(models.Model): 

28 """Abstract model supporting soft-deletion.""" 

29 is_deleted = models.BooleanField(default=False, db_index=True) 

30 deleted_at = models.DateTimeField(null=True, blank=True) 

31 

32 def soft_delete(self): 

33 self.is_deleted = True 

34 self.deleted_at = timezone.now() 

35 self.save(update_fields=['is_deleted', 'deleted_at']) 

36 

37 def restore(self): 

38 self.is_deleted = False 

39 self.deleted_at = None 

40 self.save(update_fields=['is_deleted', 'deleted_at']) 

41 

42 class Meta: 

43 abstract = True