Coverage for vendor/models.py: 94%
33 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 django.contrib.auth.models import Group
6from taggit.managers import TaggableManager
8from . import app_label
11class VendorManager(models.Manager):
12 def get_by_natural_key(self, name):
13 return self.get(name=name)
16class Model(models.Model):
17 objects = VendorManager()
18 name = models.CharField(max_length=45)
19 is_hardware = models.BooleanField(
20 default=True, verbose_name="(virtual) Hardware Vendor"
21 )
22 is_software = models.BooleanField(default=True, verbose_name="Software Vendor")
24 group = models.ForeignKey(
25 Group,
26 editable=False,
27 blank=True,
28 null=True,
29 on_delete=models.PROTECT,
30 related_name="vendors",
31 )
33 tags = TaggableManager(blank=True, related_name="vendor_tags")
35 history = HistoricalRecords()
37 def __str__(self):
38 return "%s" % self.name
40 def natural_key(self):
41 return (self.name,)
43 @classmethod
44 def get_natural_key_fields(cls):
45 return ["name"]
47 @classmethod
48 def get_natural_key_info(cls):
49 return [("name", None)]
51 def get_absolute_url(self):
52 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk})
54 class Meta:
55 db_table = "{}_{}".format("sm", app_label)
56 constraints = [
57 models.UniqueConstraint(
58 fields=["name", "group"], name="unique_sm_vendor_name_group"
59 ),
60 # PostgreSQL treats NULLs as distinct, so the constraint above
61 # cannot deduplicate global (group=NULL) rows. Keep reference
62 # data globally unique with a partial constraint.
63 models.UniqueConstraint(
64 fields=["name"],
65 condition=Q(group__isnull=True),
66 name="unique_sm_vendor_global_name",
67 ),
68 ]