Coverage for servermodel/models.py: 92%
36 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.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
9from . import app_label
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)
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 )
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 )
41 tags = TaggableManager(blank=True, related_name="servermodel_tags")
43 def __str__(self):
44 return "{} {}".format(self.vendor.name, self.name)
46 def natural_key(self):
47 return self.vendor.natural_key() + (self.name,)
49 natural_key.dependencies = ["vendor.Model"]
51 @classmethod
52 def get_natural_key_fields(cls):
53 return ["vendor__name", "name"]
55 @classmethod
56 def get_natural_key_info(cls):
57 return [("vendor", VendorModel), ("name", None)]
59 def get_absolute_url(self):
61 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk})
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 ]