Coverage for clusterpackage/models.py: 88%
48 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-24 19:06 +0000
« 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
9from taggit.managers import TaggableManager
11from . import app_label
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 )
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")
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 )
72 def __str__(self):
73 return "{}-{}".format(self.cluster, self.name)
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 )
84 natural_key.dependencies = [
85 "cluster.Model",
86 "status.Model",
87 "clusterpackagetype.Model",
88 "auth.Group",
89 ]
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 ]
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 ]
111 def get_absolute_url(self):
113 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk})
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 ]