Coverage for operatingsystem / models.py: 90%
78 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
1from django.db import models
2from django.urls import reverse
3from simple_history.models import HistoricalRecords
4from vendor.models import Model as VendorModel
5from django.contrib.auth.models import Group
7from django.core.exceptions import ObjectDoesNotExist
9from . import app_label
12class Manager(models.Manager):
13 """
14 Special manager to ease the access to Operatingsystem objects
15 eg. RHEL6.1, RHEL 6.1, SLES10, SLES 10.1 should all work well
16 """
18 def get_by_natural_key(self, vendor=None, version=None):
19 """
20 Ease access to OS objects, by providing a lot of different options
21 to query for 'em. See also operatingsystem.models.Manager.__doc__
22 :model:`sm.operatingsystem.models.Manager`
23 """
24 if vendor is None and version is None:
25 raise ObjectDoesNotExist("Nothing to query")
27 # Handle natural key tuple if passed as single arg (Django's default)
28 if version is None and isinstance(vendor, (list, tuple)):
29 version = vendor[1]
30 vendor = vendor[0]
32 vendorobj = None
33 try:
34 if isinstance(vendor, str):
35 # When using natural keys during loaddata, we don't have a
36 # group context easily but for global/initial ones, they
37 # might be in a specific group or null group.
38 # For now, we search all vendors.
39 vendorobj = VendorModel.objects.filter(name=vendor).first()
40 else:
41 vendorobj = vendor
42 except Exception:
43 pass
44 object = None
45 try:
46 object = self.get(vendor=vendorobj, version=version)
47 return object
48 except Exception:
49 pass
51 if version is None and vendor is not None:
52 version = vendor
53 vendor = None
55 if object is None and not isinstance(version, (tuple, list, dict)):
56 if version[0:7] == "Red Hat":
57 vendorobj = VendorModel.objects.filter(name="Red Hat").first()
58 vers = version[7:].lstrip()
59 if len(vers) == 1:
60 vers += ".0"
61 object = self.get(vendor=vendorobj, version=vers)
62 elif version[0:4] == "RHEL":
63 vendorobj = VendorModel.objects.filter(name="Red Hat").first()
64 vers = version[4:].lstrip()
65 if len(vers) == 1:
66 vers += ".0"
67 object = self.get(vendor=vendorobj, version=vers)
68 elif version[0:4] == "SUSE" or version[0:4] == "SLES":
69 vendorobj = VendorModel.objects.filter(name="Novell").first()
70 object = self.get(vendor=vendorobj, version=version[4:].lstrip())
71 elif isinstance(version, (tuple, list)):
72 try:
73 vendorobj = VendorModel.objects.filter(name=version[0]).first()
74 object = self.get(vendor=vendorobj, version=version[1])
75 return object
76 except Exception as e: # pragma: no cover
77 print("Exception: %s" % e) # pragma: no cover
78 pass # pragma: no cover
79 else:
80 raise Exception("No idea how to handle query with %s" % version.__class__)
82 if object is None:
83 vendorobj = VendorModel.objects.filter(name=vendor).first()
84 object = self.get(vendor=vendorobj, version=version)
86 return object
89class Model(models.Model):
90 objects = Manager()
91 version = models.CharField(max_length=45)
92 vendor = models.ForeignKey(
93 VendorModel,
94 null=False,
95 default=None,
96 related_name="%s_set" % app_label,
97 related_query_name="%s" % app_label,
98 on_delete=models.PROTECT,
99 )
101 group = models.ForeignKey(
102 Group,
103 editable=False,
104 blank=True,
105 null=True,
106 on_delete=models.PROTECT,
107 related_name="operatingsystems",
108 )
110 history = HistoricalRecords()
112 def __str__(self):
113 return "{} {}".format(self.vendor.name, self.version)
115 def natural_key(self):
116 return self.vendor.natural_key() + (self.version,)
118 natural_key.dependencies = ["vendor.Model"]
120 @classmethod
121 def get_natural_key_fields(cls):
122 return ["vendor__name", "version"]
124 @classmethod
125 def get_natural_key_info(cls):
126 return [("vendor", VendorModel), ("version", None)]
128 def get_absolute_url(self):
129 return reverse("%s:detail" % app_label, kwargs={"pk": self.pk})
131 class Meta:
132 db_table = "{}_{}".format("sm", app_label)
133 constraints = [
134 models.UniqueConstraint(
135 fields=["vendor", "version", "group"],
136 name="unique_sm_operatingsystem_vendor_version_group",
137 )
138 ]