Coverage for server / models.py: 90%

58 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-24 12:43 +0000

1from django.db import models 

2from patchtime.models import Model as PatchtimeModel 

3from status.models import Model as StatusModel 

4from domain.models import Model as DomainModel 

5from location.models import Model as LocationModel 

6from operatingsystem.models import Model as OperatingsystemModel 

7from servermodel.models import Model as ServermodelModel 

8from cluster.models import Model as ClusterModel 

9from django.urls import reverse 

10from django.utils.timezone import now 

11from simple_history.models import HistoricalRecords 

12from django.contrib.auth.models import Group 

13 

14from . import app_label 

15 

16 

17class ServerManager(models.Manager): 

18 def get_by_natural_key(self, hostname, status): 

19 if isinstance(status, (list, tuple)): 

20 status = status[0] 

21 return self.get(hostname=hostname, status__name=status) 

22 

23 

24class Model(models.Model): 

25 objects = ServerManager() 

26 hostname = models.CharField(max_length=45) 

27 domain = models.ForeignKey(DomainModel, on_delete=models.PROTECT, default=1) 

28 delivery_date = models.DateField(default=now) 

29 install_date = models.DateField(default=now) 

30 last_update = models.DateTimeField(auto_now=True) 

31 documentation_url = models.URLField(max_length=2083, blank=True, null=True) 

32 memory_in_mb = models.IntegerField(blank=True, null=True) 

33 monitoring_from_puppet = models.BooleanField(default=False) 

34 location = models.ForeignKey( 

35 LocationModel, 

36 on_delete=models.PROTECT, 

37 null=True, 

38 related_name="%s_set" % app_label, 

39 related_query_name="%s" % app_label, 

40 ) 

41 operatingsystem = models.ForeignKey( 

42 OperatingsystemModel, 

43 on_delete=models.PROTECT, 

44 null=True, 

45 blank=True, 

46 related_name="%s_set" % app_label, 

47 related_query_name="%s" % app_label, 

48 ) 

49 

50 status = models.ForeignKey( 

51 StatusModel, 

52 on_delete=models.PROTECT, 

53 default=1, 

54 related_name="%s_set" % app_label, 

55 related_query_name="%s" % app_label, 

56 ) 

57 

58 servermodel = models.ForeignKey( 

59 ServermodelModel, 

60 on_delete=models.PROTECT, 

61 null=True, 

62 related_name="%s_set" % app_label, 

63 related_query_name="%s" % app_label, 

64 ) 

65 

66 cluster = models.ForeignKey( 

67 ClusterModel, 

68 on_delete=models.PROTECT, 

69 null=True, 

70 blank=True, 

71 related_name="%s_set" % app_label, 

72 related_query_name="%s" % app_label, 

73 ) 

74 

75 # => application model 

76 # application = models.CharField(max_length=100, blank=True, null=True) 

77 

78 # => rack model 

79 # rack = models.CharField(max_length=45, blank=True, null=True) 

80 

81 # network! 

82 primary_ip = models.GenericIPAddressField(blank=True, null=True) 

83 management_ip = models.GenericIPAddressField(blank=True, null=True) 

84 management_hostname = models.CharField(max_length=45, blank=True, null=True) 

85 delivery_note_id = models.CharField(max_length=45, blank=True, null=True) 

86 serial_nr = models.CharField(max_length=60, blank=True, null=True) 

87 description = models.CharField(max_length=100, blank=True, null=True) 

88 

89 patchtime = models.ForeignKey( 

90 PatchtimeModel, 

91 null=True, 

92 default=None, 

93 on_delete=models.PROTECT, 

94 related_name="%s_set" % app_label, 

95 related_query_name="%s" % app_label, 

96 ) 

97 

98 group = models.ForeignKey( 

99 Group, 

100 editable=False, 

101 blank=True, 

102 null=True, 

103 on_delete=models.PROTECT, 

104 related_name="servers", 

105 ) 

106 

107 history = HistoricalRecords() 

108 

109 def __str__(self): 

110 return "%s" % self.hostname 

111 

112 def natural_key(self): 

113 return (self.hostname,) + self.status.natural_key() 

114 

115 natural_key.dependencies = ["status.Model"] 

116 

117 @classmethod 

118 def get_natural_key_fields(cls): 

119 return ["hostname", "status__name"] 

120 

121 @classmethod 

122 def get_natural_key_info(cls): 

123 return [("hostname", None), ("status", StatusModel)] 

124 

125 def get_absolute_url(self): 

126 return reverse("server:detail", kwargs={"pk": self.pk}) 

127 

128 class Meta: 

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

130 constraints = [ 

131 models.UniqueConstraint( 

132 fields=["hostname", "status"], name="unique_sm_server_hostname_status" 

133 ), 

134 models.UniqueConstraint( 

135 fields=["hostname", "status", "group"], 

136 name="unique_sm_server_hostname_status_group", 

137 ), 

138 ]