Coverage for operatingsystem / models.py: 90%

78 statements  

« 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 

6 

7from django.core.exceptions import ObjectDoesNotExist 

8 

9from . import app_label 

10 

11 

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 """ 

17 

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") 

26 

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] 

31 

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 

50 

51 if version is None and vendor is not None: 

52 version = vendor 

53 vendor = None 

54 

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__) 

81 

82 if object is None: 

83 vendorobj = VendorModel.objects.filter(name=vendor).first() 

84 object = self.get(vendor=vendorobj, version=version) 

85 

86 return object 

87 

88 

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 ) 

100 

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 ) 

109 

110 history = HistoricalRecords() 

111 

112 def __str__(self): 

113 return "{} {}".format(self.vendor.name, self.version) 

114 

115 def natural_key(self): 

116 return self.vendor.natural_key() + (self.version,) 

117 

118 natural_key.dependencies = ["vendor.Model"] 

119 

120 @classmethod 

121 def get_natural_key_fields(cls): 

122 return ["vendor__name", "version"] 

123 

124 @classmethod 

125 def get_natural_key_info(cls): 

126 return [("vendor", VendorModel), ("version", None)] 

127 

128 def get_absolute_url(self): 

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

130 

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 ]