mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Basic Support for Python 3 (#827)
* Rudimentary python3 support * update docs and trigger Travis * fix some of the tests * fix all python3 errors * change env calls to just python * add @python_2_unicode_compatible decorator to models for python2 compatibility * switch netbox.configuration to from netbox import configuration
This commit is contained in:
@@ -8,6 +8,7 @@ from django.core.urlresolvers import reverse
|
||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||
from django.db import models
|
||||
from django.db.models import Count, Q, ObjectDoesNotExist
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
|
||||
from circuits.models import Circuit
|
||||
from extras.models import CustomFieldModel, CustomField, CustomFieldValue
|
||||
@@ -199,6 +200,7 @@ class SiteManager(NaturalOrderByManager):
|
||||
return self.natural_order_by('name')
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Site(CreatedUpdatedModel, CustomFieldModel):
|
||||
"""
|
||||
A Site represents a geographic location within a network; typically a building or campus. The optional facility
|
||||
@@ -222,7 +224,7 @@ class Site(CreatedUpdatedModel, CustomFieldModel):
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
@@ -265,6 +267,7 @@ class Site(CreatedUpdatedModel, CustomFieldModel):
|
||||
# Racks
|
||||
#
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class RackGroup(models.Model):
|
||||
"""
|
||||
Racks can be grouped as subsets within a Site. The scope of a group will depend on how Sites are defined. For
|
||||
@@ -282,13 +285,14 @@ class RackGroup(models.Model):
|
||||
['site', 'slug'],
|
||||
]
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return u'{} - {}'.format(self.site.name, self.name)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return "{}?group_id={}".format(reverse('dcim:rack_list'), self.pk)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class RackRole(models.Model):
|
||||
"""
|
||||
Racks can be organized by functional role, similar to Devices.
|
||||
@@ -300,7 +304,7 @@ class RackRole(models.Model):
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
@@ -313,6 +317,7 @@ class RackManager(NaturalOrderByManager):
|
||||
return self.natural_order_by('site__name', 'name')
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Rack(CreatedUpdatedModel, CustomFieldModel):
|
||||
"""
|
||||
Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face.
|
||||
@@ -343,7 +348,7 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
|
||||
['site', 'facility_id'],
|
||||
]
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.display_name
|
||||
|
||||
def get_absolute_url(self):
|
||||
@@ -442,7 +447,7 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
|
||||
devices = self.devices.select_related('device_type').filter(position__gte=1).exclude(pk__in=exclude)
|
||||
|
||||
# Initialize the rack unit skeleton
|
||||
units = range(1, self.u_height + 1)
|
||||
units = list(range(1, self.u_height + 1))
|
||||
|
||||
# Remove units consumed by installed devices
|
||||
for d in devices:
|
||||
@@ -477,6 +482,7 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
|
||||
# Device Types
|
||||
#
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Manufacturer(models.Model):
|
||||
"""
|
||||
A Manufacturer represents a company which produces hardware devices; for example, Juniper or Dell.
|
||||
@@ -487,13 +493,14 @@ class Manufacturer(models.Model):
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class DeviceType(models.Model, CustomFieldModel):
|
||||
"""
|
||||
A DeviceType represents a particular make (Manufacturer) and model of device. It specifies rack height and depth, as
|
||||
@@ -538,7 +545,7 @@ class DeviceType(models.Model, CustomFieldModel):
|
||||
['manufacturer', 'slug'],
|
||||
]
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.model
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
@@ -608,6 +615,7 @@ class DeviceType(models.Model, CustomFieldModel):
|
||||
return bool(self.subdevice_role is False)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class ConsolePortTemplate(models.Model):
|
||||
"""
|
||||
A template for a ConsolePort to be created for a new Device.
|
||||
@@ -619,10 +627,11 @@ class ConsolePortTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class ConsoleServerPortTemplate(models.Model):
|
||||
"""
|
||||
A template for a ConsoleServerPort to be created for a new Device.
|
||||
@@ -634,10 +643,11 @@ class ConsoleServerPortTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class PowerPortTemplate(models.Model):
|
||||
"""
|
||||
A template for a PowerPort to be created for a new Device.
|
||||
@@ -649,10 +659,11 @@ class PowerPortTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class PowerOutletTemplate(models.Model):
|
||||
"""
|
||||
A template for a PowerOutlet to be created for a new Device.
|
||||
@@ -664,7 +675,7 @@ class PowerOutletTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@@ -706,6 +717,7 @@ class InterfaceManager(models.Manager):
|
||||
}).order_by(*ordering)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class InterfaceTemplate(models.Model):
|
||||
"""
|
||||
A template for a physical data interface on a new Device.
|
||||
@@ -721,10 +733,11 @@ class InterfaceTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class DeviceBayTemplate(models.Model):
|
||||
"""
|
||||
A template for a DeviceBay to be created for a new parent Device.
|
||||
@@ -736,7 +749,7 @@ class DeviceBayTemplate(models.Model):
|
||||
ordering = ['device_type', 'name']
|
||||
unique_together = ['device_type', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@@ -744,6 +757,7 @@ class DeviceBayTemplate(models.Model):
|
||||
# Devices
|
||||
#
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class DeviceRole(models.Model):
|
||||
"""
|
||||
Devices are organized by functional role; for example, "Core Switch" or "File Server". Each DeviceRole is assigned a
|
||||
@@ -756,13 +770,14 @@ class DeviceRole(models.Model):
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return "{}?role={}".format(reverse('dcim:device_list'), self.slug)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Platform(models.Model):
|
||||
"""
|
||||
Platform refers to the software or firmware running on a Device; for example, "Cisco IOS-XR" or "Juniper Junos".
|
||||
@@ -776,7 +791,7 @@ class Platform(models.Model):
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
@@ -789,6 +804,7 @@ class DeviceManager(NaturalOrderByManager):
|
||||
return self.natural_order_by('name')
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Device(CreatedUpdatedModel, CustomFieldModel):
|
||||
"""
|
||||
A Device represents a piece of physical hardware mounted within a Rack. Each Device is assigned a DeviceType,
|
||||
@@ -828,7 +844,7 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
|
||||
ordering = ['name']
|
||||
unique_together = ['rack', 'position', 'face']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.display_name
|
||||
|
||||
def get_absolute_url(self):
|
||||
@@ -968,6 +984,7 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
|
||||
return RPC_CLIENTS.get(self.platform.rpc_client)
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class ConsolePort(models.Model):
|
||||
"""
|
||||
A physical console port within a Device. ConsolePorts connect to ConsoleServerPorts.
|
||||
@@ -982,7 +999,7 @@ class ConsolePort(models.Model):
|
||||
ordering = ['device', 'name']
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
# Used for connections export
|
||||
@@ -1011,6 +1028,7 @@ class ConsoleServerPortManager(models.Manager):
|
||||
}).order_by('device', 'name_as_integer')
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class ConsoleServerPort(models.Model):
|
||||
"""
|
||||
A physical port within a Device (typically a designated console server) which provides access to ConsolePorts.
|
||||
@@ -1023,10 +1041,11 @@ class ConsoleServerPort(models.Model):
|
||||
class Meta:
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class PowerPort(models.Model):
|
||||
"""
|
||||
A physical power supply (intake) port within a Device. PowerPorts connect to PowerOutlets.
|
||||
@@ -1041,7 +1060,7 @@ class PowerPort(models.Model):
|
||||
ordering = ['device', 'name']
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
# Used for connections export
|
||||
@@ -1064,6 +1083,7 @@ class PowerOutletManager(models.Manager):
|
||||
}).order_by('device', 'name_padded')
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class PowerOutlet(models.Model):
|
||||
"""
|
||||
A physical power outlet (output) within a Device which provides power to a PowerPort.
|
||||
@@ -1076,10 +1096,11 @@ class PowerOutlet(models.Model):
|
||||
class Meta:
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Interface(models.Model):
|
||||
"""
|
||||
A physical data interface within a Device. An Interface can connect to exactly one other Interface via the creation
|
||||
@@ -1099,7 +1120,7 @@ class Interface(models.Model):
|
||||
ordering = ['device', 'name']
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def clean(self):
|
||||
@@ -1176,6 +1197,7 @@ class InterfaceConnection(models.Model):
|
||||
])
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class DeviceBay(models.Model):
|
||||
"""
|
||||
An empty space within a Device which can house a child device
|
||||
@@ -1189,7 +1211,7 @@ class DeviceBay(models.Model):
|
||||
ordering = ['device', 'name']
|
||||
unique_together = ['device', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return u'{} - {}'.format(self.device.name, self.name)
|
||||
|
||||
def clean(self):
|
||||
@@ -1205,6 +1227,7 @@ class DeviceBay(models.Model):
|
||||
raise ValidationError("Cannot install a device into itself.")
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Module(models.Model):
|
||||
"""
|
||||
A Module represents a piece of hardware within a Device, such as a line card or power supply. Modules are used only
|
||||
@@ -1223,5 +1246,5 @@ class Module(models.Model):
|
||||
ordering = ['device__id', 'parent__id', 'name']
|
||||
unique_together = ['device', 'parent', 'name']
|
||||
|
||||
def __unicode__(self):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
Reference in New Issue
Block a user