Coverage for servermodel/models.py: 92%

36 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-24 19:06 +0000

1from django.db import models 

2from django.db.models import Q 

3from django.urls import reverse 

4from simple_history.models import HistoricalRecords 

5from vendor.models import Model as VendorModel 

6from django.contrib.auth.models import Group 

7from taggit.managers import TaggableManager 

8 

9from . import app_label 

10 

11 

12class ServerModelManager(models.Manager): 

13 def get_by_natural_key(self, vendor, name): 

14 if isinstance(vendor, (list, tuple)): 

15 vendor = vendor[0] 

16 return self.get(vendor__name=vendor, name=name) 

17 

18 

19class Model(models.Model): 

20 objects = ServerModelManager() 

21 history = HistoricalRecords() 

22 name = models.CharField(max_length=45) 

23 vendor = models.ForeignKey( 

24 VendorModel, 

25 null=False, 

26 default=None, 

27 related_name="%s_set" % app_label, 

28 related_query_name="%s" % app_label, 

29 on_delete=models.PROTECT, 

30 ) 

31 

32 group = models.ForeignKey( 

33 Group, 

34 editable=False, 

35 blank=True, 

36 null=True, 

37 on_delete=models.PROTECT, 

38 related_name="servermodels", 

39 ) 

40 

41 tags = TaggableManager(blank=True, related_name="servermodel_tags") 

42 

43 def __str__(self): 

44 return "{} {}".format(self.vendor.name, self.name) 

45 

46 def natural_key(self): 

47 return self.vendor.natural_key() + (self.name,) 

48 

49 natural_key.dependencies = ["vendor.Model"] 

50 

51 @classmethod 

52 def get_natural_key_fields(cls): 

53 return ["vendor__name", "name"] 

54 

55 @classmethod 

56 def get_natural_key_info(cls): 

57 return [("vendor", VendorModel), ("name", None)] 

58 

59 def get_absolute_url(self): 

60 

61 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk}) 

62 

63 class Meta: 

64 db_table = "{}_{}".format("sm", app_label) 

65 constraints = [ 

66 models.UniqueConstraint( 

67 fields=["vendor", "name", "group"], 

68 name="unique_sm_servermodel_vendor_name_group", 

69 ), 

70 # PostgreSQL treats NULLs as distinct, so the constraint above 

71 # cannot deduplicate global (group=NULL) rows. Keep reference data 

72 # globally unique with a partial constraint. 

73 models.UniqueConstraint( 

74 fields=["vendor", "name"], 

75 condition=Q(group__isnull=True), 

76 name="unique_sm_servermodel_global_vendor_name", 

77 ), 

78 ]