Coverage for clusterpackage/models.py: 88%

48 statements  

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

1from django.db import models 

2from django.urls import reverse 

3from simple_history.models import HistoricalRecords 

4from status.models import Model as StatusModel 

5from cluster.models import Model as ClusterModel 

6from clusterpackagetype.models import Model as ClusterpackagetypeModel 

7from django.contrib.auth.models import Group 

8 

9from taggit.managers import TaggableManager 

10 

11from . import app_label 

12 

13 

14class ClusterPackageManager(models.Manager): 

15 def get_by_natural_key( 

16 self, cluster, name, status=None, package_type=None, group=None 

17 ): 

18 if isinstance(cluster, (list, tuple)): 

19 cluster = cluster[0] 

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

21 status = status[0] 

22 if isinstance(package_type, (list, tuple)): 

23 package_type = package_type[0] 

24 if isinstance(group, (list, tuple)): 

25 group = group[0] 

26 return self.get( 

27 cluster__name=cluster, 

28 name=name, 

29 status__name=status, 

30 package_type__name=package_type, 

31 **( 

32 {"group__name": group} if group is not None else {"group__isnull": True} 

33 ), 

34 ) 

35 

36 

37class Model(models.Model): 

38 objects = ClusterPackageManager() 

39 name = models.CharField(max_length=45) 

40 status = models.ForeignKey( 

41 StatusModel, 

42 related_name="%s_set" % app_label, 

43 on_delete=models.PROTECT, 

44 ) 

45 cluster = models.ForeignKey( 

46 ClusterModel, 

47 related_name="%s_set" % app_label, 

48 on_delete=models.PROTECT, 

49 ) 

50 description = models.CharField(max_length=256) 

51 host = models.CharField(max_length=253, verbose_name="IP/Hostname") 

52 port = models.CharField( 

53 max_length=10, verbose_name="Port or ID", blank=True, null=True 

54 ) 

55 package_type = models.ForeignKey( 

56 ClusterpackagetypeModel, 

57 related_name="%s_set" % app_label, 

58 on_delete=models.PROTECT, 

59 ) 

60 tags = TaggableManager(blank=True, related_name="clusterpackage_tags") 

61 history = HistoricalRecords(related_name="clusterpackage_history") 

62 

63 group = models.ForeignKey( 

64 Group, 

65 editable=False, 

66 blank=True, 

67 null=True, 

68 on_delete=models.PROTECT, 

69 related_name="clusterpackages", 

70 ) 

71 

72 def __str__(self): 

73 return "{}-{}".format(self.cluster, self.name) 

74 

75 def natural_key(self): 

76 return ( 

77 self.cluster.natural_key()[0], 

78 self.name, 

79 self.status.natural_key()[0], 

80 self.package_type.natural_key()[0], 

81 self.group.name if self.group else None, 

82 ) 

83 

84 natural_key.dependencies = [ 

85 "cluster.Model", 

86 "status.Model", 

87 "clusterpackagetype.Model", 

88 "auth.Group", 

89 ] 

90 

91 @classmethod 

92 def get_natural_key_fields(cls): 

93 return [ 

94 "cluster__name", 

95 "name", 

96 "status__name", 

97 "package_type__name", 

98 "group__name", 

99 ] 

100 

101 @classmethod 

102 def get_natural_key_info(cls): 

103 return [ 

104 ("cluster", ClusterModel), 

105 ("name", None), 

106 ("status", StatusModel), 

107 ("package_type", ClusterpackagetypeModel), 

108 ("group", Group), 

109 ] 

110 

111 def get_absolute_url(self): 

112 

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

114 

115 class Meta: 

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

117 constraints = [ 

118 models.UniqueConstraint( 

119 fields=["cluster", "name", "status", "package_type", "group"], 

120 name="unique_sm_clusterpackage_cluster_name_status_package_type_group", 

121 ), 

122 ]