diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py
index b36d22105..f2e6d0d00 100644
--- a/netbox/circuits/api/serializers.py
+++ b/netbox/circuits/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import serializers
from circuits.models import Provider, Circuit, CircuitTermination, CircuitType
diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py
index dfe0624e8..25df44bfd 100644
--- a/netbox/circuits/api/urls.py
+++ b/netbox/circuits/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py
index 582de3ab1..d14080531 100644
--- a/netbox/circuits/api/views.py
+++ b/netbox/circuits/api/views.py
@@ -1,9 +1,11 @@
-from django.shortcuts import get_object_or_404
+from __future__ import unicode_literals
from rest_framework.decorators import detail_route
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
+from django.shortcuts import get_object_or_404
+
from circuits import filters
from circuits.models import Provider, CircuitTermination, CircuitType, Circuit
from extras.models import Graph, GRAPH_TYPE_PROVIDER
diff --git a/netbox/circuits/apps.py b/netbox/circuits/apps.py
index bc0b7d87d..613c347f2 100644
--- a/netbox/circuits/apps.py
+++ b/netbox/circuits/apps.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.apps import AppConfig
diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py
index e4a11faf0..6e9e1f443 100644
--- a/netbox/circuits/filters.py
+++ b/netbox/circuits/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from django.db.models import Q
diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py
index f81abff04..eb38b8102 100644
--- a/netbox/circuits/forms.py
+++ b/netbox/circuits/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from django.db.models import Count
diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py
index 04d9b3e13..7da5c4f73 100644
--- a/netbox/circuits/models.py
+++ b/netbox/circuits/models.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from django.urls import reverse
@@ -110,7 +112,7 @@ class Circuit(CreatedUpdatedModel, CustomFieldModel):
unique_together = ['provider', 'cid']
def __str__(self):
- return u'{} {}'.format(self.provider, self.cid)
+ return '{} {}'.format(self.provider, self.cid)
def get_absolute_url(self):
return reverse('circuits:circuit', args=[self.pk])
@@ -166,7 +168,7 @@ class CircuitTermination(models.Model):
unique_together = ['circuit', 'term_side']
def __str__(self):
- return u'{} (Side {})'.format(self.circuit, self.get_term_side_display())
+ return '{} (Side {})'.format(self.circuit, self.get_term_side_display())
def get_peer_termination(self):
peer_side = 'Z' if self.term_side == 'A' else 'A'
diff --git a/netbox/circuits/signals.py b/netbox/circuits/signals.py
index bdfe8c0b6..40a1e1031 100644
--- a/netbox/circuits/signals.py
+++ b/netbox/circuits/signals.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
from django.utils import timezone
diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py
index 3cda30ccc..d09c5a7b2 100644
--- a/netbox/circuits/tables.py
+++ b/netbox/circuits/tables.py
@@ -1,8 +1,9 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
from django_tables2.utils import Accessor
from utilities.tables import BaseTable, SearchTable, ToggleColumn
-
from .models import Circuit, CircuitType, Provider
diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py
index 7bd3d8040..fc39b72de 100644
--- a/netbox/circuits/tests/test_api.py
+++ b/netbox/circuits/tests/test_api.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py
index be2791382..12a7dc298 100644
--- a/netbox/circuits/urls.py
+++ b/netbox/circuits/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py
index d1f192030..eed612a33 100644
--- a/netbox/circuits/views.py
+++ b/netbox/circuits/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin
@@ -12,7 +14,6 @@ from utilities.forms import ConfirmationForm
from utilities.views import (
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
-
from . import filters, forms, tables
from .models import Circuit, CircuitTermination, CircuitType, Provider, TERM_SIDE_A, TERM_SIDE_Z
diff --git a/netbox/dcim/api/exceptions.py b/netbox/dcim/api/exceptions.py
index 05ad86b5b..8804da436 100644
--- a/netbox/dcim/api/exceptions.py
+++ b/netbox/dcim/api/exceptions.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework.exceptions import APIException
diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py
index 4c9c10804..8ca6cab35 100644
--- a/netbox/dcim/api/serializers.py
+++ b/netbox/dcim/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator
diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py
index db537e0b7..6f16310e5 100644
--- a/netbox/dcim/api/urls.py
+++ b/netbox/dcim/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py
index 82fc5d6ab..116aaa77c 100644
--- a/netbox/dcim/api/views.py
+++ b/netbox/dcim/api/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework.decorators import detail_route
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAuthenticated
diff --git a/netbox/dcim/apps.py b/netbox/dcim/apps.py
index fdfcc1f57..fb1f4ee39 100644
--- a/netbox/dcim/apps.py
+++ b/netbox/dcim/apps.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.apps import AppConfig
diff --git a/netbox/dcim/fields.py b/netbox/dcim/fields.py
index 6b45f6e65..22e0be581 100644
--- a/netbox/dcim/fields.py
+++ b/netbox/dcim/fields.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from netaddr import EUI, mac_unix_expanded
from django.core.exceptions import ValidationError
diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py
index 39838a265..93a325d98 100644
--- a/netbox/dcim/filters.py
+++ b/netbox/dcim/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from netaddr.core import AddrFormatError
diff --git a/netbox/dcim/formfields.py b/netbox/dcim/formfields.py
index 4e568c2e6..83054c088 100644
--- a/netbox/dcim/formfields.py
+++ b/netbox/dcim/formfields.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from netaddr import EUI, AddrFormatError
from django import forms
diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py
index c110f1d47..03fddf21d 100644
--- a/netbox/dcim/forms.py
+++ b/netbox/dcim/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from mptt.forms import TreeNodeChoiceField
import re
@@ -16,7 +18,6 @@ from utilities.forms import (
FilterChoiceField, FlexibleModelChoiceField, Livesearch, SelectWithDisabled, SmallTextarea, SlugField,
FilterTreeNodeMultipleChoiceField,
)
-
from .formfields import MACAddressFormField
from .models import (
DeviceBay, DeviceBayTemplate, CONNECTION_STATUS_CHOICES, CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED,
@@ -610,10 +611,10 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldForm):
for family in [4, 6]:
ip_choices = []
interface_ips = IPAddress.objects.filter(family=family, interface__device=self.instance)
- ip_choices += [(ip.id, u'{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips]
+ ip_choices += [(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips]
nat_ips = IPAddress.objects.filter(family=family, nat_inside__interface__device=self.instance)\
.select_related('nat_inside__interface')
- ip_choices += [(ip.id, u'{} ({} NAT)'.format(ip.address, ip.nat_inside.interface)) for ip in nat_ips]
+ ip_choices += [(ip.id, '{} ({} NAT)'.format(ip.address, ip.nat_inside.interface)) for ip in nat_ips]
self.fields['primary_ip{}'.format(family)].choices = [(None, '---------')] + ip_choices
# If editing an existing device, exclude it from the list of occupied rack units. This ensures that a device
@@ -804,7 +805,7 @@ def device_status_choices():
status_counts = {}
for status in Device.objects.values('status').annotate(count=Count('status')).order_by('status'):
status_counts[status['status']] = status['count']
- return [(s[0], u'{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in STATUS_CHOICES]
+ return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in STATUS_CHOICES]
class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py
index 59d7a0ef2..043df10dc 100644
--- a/netbox/dcim/models.py
+++ b/netbox/dcim/models.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from collections import OrderedDict
from itertools import count, groupby
@@ -23,7 +24,6 @@ from utilities.fields import ColorField, NullableCharField
from utilities.managers import NaturalOrderByManager
from utilities.models import CreatedUpdatedModel
from utilities.utils import csv_format
-
from .fields import ASNField, MACAddressField
@@ -346,7 +346,7 @@ class RackGroup(models.Model):
]
def __str__(self):
- return u'{} - {}'.format(self.site.name, self.name)
+ return '{} - {}'.format(self.site.name, self.name)
def get_absolute_url(self):
return "{}?group_id={}".format(reverse('dcim:rack_list'), self.pk)
@@ -466,10 +466,10 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
@property
def display_name(self):
if self.facility_id:
- return u"{} ({})".format(self.name, self.facility_id)
+ return "{} ({})".format(self.name, self.facility_id)
elif self.name:
return self.name
- return u""
+ return ""
def get_rack_units(self, face=RACK_FACE_FRONT, exclude=None, remove_redundant=False):
"""
@@ -569,7 +569,7 @@ class RackReservation(models.Model):
ordering = ['created']
def __str__(self):
- return u"Reservation for rack {}".format(self.rack)
+ return "Reservation for rack {}".format(self.rack)
def clean(self):
@@ -579,7 +579,7 @@ class RackReservation(models.Model):
invalid_units = [u for u in self.units if u not in self.rack.units]
if invalid_units:
raise ValidationError({
- 'units': u"Invalid unit(s) for {}U rack: {}".format(
+ 'units': "Invalid unit(s) for {}U rack: {}".format(
self.rack.u_height,
', '.join([str(u) for u in invalid_units]),
),
@@ -733,7 +733,7 @@ class DeviceType(models.Model, CustomFieldModel):
@property
def full_name(self):
- return u'{} {}'.format(self.manufacturer.name, self.model)
+ return '{} {}'.format(self.manufacturer.name, self.model)
@property
def is_parent_device(self):
@@ -1106,8 +1106,8 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
if self.name:
return self.name
elif hasattr(self, 'device_type'):
- return u"{}".format(self.device_type)
- return u""
+ return "{}".format(self.device_type)
+ return ""
@property
def identifier(self):
@@ -1320,7 +1320,7 @@ class Interface(models.Model):
# An interface's LAG must belong to the same device
if self.lag and self.lag.device != self.device:
raise ValidationError({
- 'lag': u"The selected LAG interface ({}) belongs to a different device ({}).".format(
+ 'lag': "The selected LAG interface ({}) belongs to a different device ({}).".format(
self.lag.name, self.lag.device.name
)
})
@@ -1328,14 +1328,14 @@ class Interface(models.Model):
# A virtual interface cannot have a parent LAG
if self.form_factor in VIRTUAL_IFACE_TYPES and self.lag is not None:
raise ValidationError({
- 'lag': u"{} interfaces cannot have a parent LAG interface.".format(self.get_form_factor_display())
+ 'lag': "{} interfaces cannot have a parent LAG interface.".format(self.get_form_factor_display())
})
# Only a LAG can have LAG members
if self.form_factor != IFACE_FF_LAG and self.member_interfaces.exists():
raise ValidationError({
'form_factor': "Cannot change interface form factor; it has LAG members ({}).".format(
- u", ".join([iface.name for iface in self.member_interfaces.all()])
+ ", ".join([iface.name for iface in self.member_interfaces.all()])
)
})
@@ -1428,7 +1428,7 @@ class DeviceBay(models.Model):
unique_together = ['device', 'name']
def __str__(self):
- return u'{} - {}'.format(self.device.name, self.name)
+ return '{} - {}'.format(self.device.name, self.name)
def clean(self):
diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py
index d15e274c7..be80233e0 100644
--- a/netbox/dcim/tables.py
+++ b/netbox/dcim/tables.py
@@ -1,8 +1,9 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
from django_tables2.utils import Accessor
from utilities.tables import BaseTable, SearchTable, ToggleColumn
-
from .models import (
ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceBayTemplate, DeviceRole, DeviceType,
Interface, InterfaceTemplate, Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py
index 2f3b38449..9fe191cc7 100644
--- a/netbox/dcim/tests/test_api.py
+++ b/netbox/dcim/tests/test_api.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/dcim/tests/test_forms.py b/netbox/dcim/tests/test_forms.py
index f859fe5e1..acf71411e 100644
--- a/netbox/dcim/tests/test_forms.py
+++ b/netbox/dcim/tests/test_forms.py
@@ -1,4 +1,7 @@
+from __future__ import unicode_literals
+
from django.test import TestCase
+
from dcim.forms import *
from dcim.models import *
diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py
index d1b721cb0..340c58092 100644
--- a/netbox/dcim/tests/test_models.py
+++ b/netbox/dcim/tests/test_models.py
@@ -1,4 +1,7 @@
+from __future__ import unicode_literals
+
from django.test import TestCase
+
from dcim.models import *
diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py
index bfe74dec6..775daeabf 100644
--- a/netbox/dcim/urls.py
+++ b/netbox/dcim/urls.py
@@ -1,9 +1,10 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
+from extras.views import ImageAttachmentEditView
from ipam.views import ServiceEditView
from secrets.views import secret_add
-
-from extras.views import ImageAttachmentEditView
from .models import Device, Rack, Site
from . import views
diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py
index 0e3028e49..322e88b72 100644
--- a/netbox/dcim/views.py
+++ b/netbox/dcim/views.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from copy import deepcopy
import re
from natsort import natsorted
@@ -24,7 +25,6 @@ from utilities.paginator import EnhancedPaginator
from utilities.views import (
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
-
from . import filters, forms, tables
from .models import (
CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
@@ -109,11 +109,11 @@ class ComponentCreateView(View):
if field == 'name':
field = 'name_pattern'
for e in errors:
- form.add_error(field, u'{}: {}'.format(name, ', '.join(e)))
+ form.add_error(field, '{}: {}'.format(name, ', '.join(e)))
if not form.errors:
self.model.objects.bulk_create(new_components)
- messages.success(request, u"Added {} {} to {}.".format(
+ messages.success(request, "Added {} {} to {}.".format(
len(new_components), self.model._meta.verbose_name_plural, parent
))
if '_addanother' in request.POST:
@@ -930,7 +930,7 @@ def consoleport_connect(request, pk):
form = forms.ConsolePortConnectionForm(request.POST, instance=consoleport)
if form.is_valid():
consoleport = form.save()
- msg = u'Connected {} {} to {} {}'.format(
+ msg = 'Connected {} {} to {} {}'.format(
consoleport.device.get_absolute_url(),
escape(consoleport.device),
escape(consoleport.name),
@@ -964,7 +964,7 @@ def consoleport_disconnect(request, pk):
if not consoleport.cs_port:
messages.warning(
- request, u"Cannot disconnect console port {}: It is not connected to anything.".format(consoleport)
+ request, "Cannot disconnect console port {}: It is not connected to anything.".format(consoleport)
)
return redirect('dcim:device', pk=consoleport.device.pk)
@@ -975,7 +975,7 @@ def consoleport_disconnect(request, pk):
consoleport.cs_port = None
consoleport.connection_status = None
consoleport.save()
- msg = u'Disconnected {} {} from {} {}'.format(
+ msg = 'Disconnected {} {} from {} {}'.format(
consoleport.device.get_absolute_url(),
escape(consoleport.device),
escape(consoleport.name),
@@ -1047,7 +1047,7 @@ def consoleserverport_connect(request, pk):
consoleport.cs_port = consoleserverport
consoleport.connection_status = form.cleaned_data['connection_status']
consoleport.save()
- msg = u'Connected {} {} to {} {}'.format(
+ msg = 'Connected {} {} to {} {}'.format(
consoleport.device.get_absolute_url(),
escape(consoleport.device),
escape(consoleport.name),
@@ -1081,7 +1081,7 @@ def consoleserverport_disconnect(request, pk):
if not hasattr(consoleserverport, 'connected_console'):
messages.warning(
- request, u"Cannot disconnect console server port {}: Nothing is connected to it.".format(consoleserverport)
+ request, "Cannot disconnect console server port {}: Nothing is connected to it.".format(consoleserverport)
)
return redirect('dcim:device', pk=consoleserverport.device.pk)
@@ -1092,7 +1092,7 @@ def consoleserverport_disconnect(request, pk):
consoleport.cs_port = None
consoleport.connection_status = None
consoleport.save()
- msg = u'Disconnected {} {} from {} {}'.format(
+ msg = 'Disconnected {} {} from {} {}'.format(
consoleport.device.get_absolute_url(),
escape(consoleport.device),
escape(consoleport.name),
@@ -1153,7 +1153,7 @@ def powerport_connect(request, pk):
form = forms.PowerPortConnectionForm(request.POST, instance=powerport)
if form.is_valid():
powerport = form.save()
- msg = u'Connected {} {} to {} {}'.format(
+ msg = 'Connected {} {} to {} {}'.format(
powerport.device.get_absolute_url(),
escape(powerport.device),
escape(powerport.name),
@@ -1187,7 +1187,7 @@ def powerport_disconnect(request, pk):
if not powerport.power_outlet:
messages.warning(
- request, u"Cannot disconnect power port {}: It is not connected to an outlet.".format(powerport)
+ request, "Cannot disconnect power port {}: It is not connected to an outlet.".format(powerport)
)
return redirect('dcim:device', pk=powerport.device.pk)
@@ -1198,7 +1198,7 @@ def powerport_disconnect(request, pk):
powerport.power_outlet = None
powerport.connection_status = None
powerport.save()
- msg = u'Disconnected {} {} from {} {}'.format(
+ msg = 'Disconnected {} {} from {} {}'.format(
powerport.device.get_absolute_url(),
escape(powerport.device),
escape(powerport.name),
@@ -1270,7 +1270,7 @@ def poweroutlet_connect(request, pk):
powerport.power_outlet = poweroutlet
powerport.connection_status = form.cleaned_data['connection_status']
powerport.save()
- msg = u'Connected {} {} to {} {}'.format(
+ msg = 'Connected {} {} to {} {}'.format(
powerport.device.get_absolute_url(),
escape(powerport.device),
escape(powerport.name),
@@ -1304,7 +1304,7 @@ def poweroutlet_disconnect(request, pk):
if not hasattr(poweroutlet, 'connected_port'):
messages.warning(
- request, u"Cannot disconnect power outlet {}: Nothing is connected to it.".format(poweroutlet)
+ request, "Cannot disconnect power outlet {}: Nothing is connected to it.".format(poweroutlet)
)
return redirect('dcim:device', pk=poweroutlet.device.pk)
@@ -1315,7 +1315,7 @@ def poweroutlet_disconnect(request, pk):
powerport.power_outlet = None
powerport.connection_status = None
powerport.save()
- msg = u'Disconnected {} {} from {} {}'.format(
+ msg = 'Disconnected {} {} from {} {}'.format(
powerport.device.get_absolute_url(),
escape(powerport.device),
escape(powerport.name),
@@ -1429,7 +1429,7 @@ def devicebay_populate(request, pk):
device_bay.save()
if not form.errors:
- messages.success(request, u"Added {} to {}.".format(device_bay.installed_device, device_bay))
+ messages.success(request, "Added {} to {}.".format(device_bay.installed_device, device_bay))
return redirect('dcim:device', pk=device_bay.device.pk)
else:
@@ -1453,7 +1453,7 @@ def devicebay_depopulate(request, pk):
removed_device = device_bay.installed_device
device_bay.installed_device = None
device_bay.save()
- messages.success(request, u"{} has been removed from {}.".format(removed_device, device_bay))
+ messages.success(request, "{} has been removed from {}.".format(removed_device, device_bay))
return redirect('dcim:device', pk=device_bay.device.pk)
else:
@@ -1516,11 +1516,11 @@ class DeviceBulkAddComponentView(View):
else:
for field, errors in component_form.errors.as_data().items():
for e in errors:
- form.add_error(field, u'{} {}: {}'.format(device, name, ', '.join(e)))
+ form.add_error(field, '{} {}: {}'.format(device, name, ', '.join(e)))
if not form.errors:
self.model.objects.bulk_create(new_components)
- messages.success(request, u"Added {} {} to {} devices.".format(
+ messages.success(request, "Added {} {} to {} devices.".format(
len(new_components), self.model._meta.verbose_name_plural, len(form.cleaned_data['pk'])
))
return redirect('dcim:device_list')
@@ -1530,7 +1530,7 @@ class DeviceBulkAddComponentView(View):
selected_devices = Device.objects.filter(pk__in=pk_list)
if not selected_devices:
- messages.warning(request, u"No devices were selected.")
+ messages.warning(request, "No devices were selected.")
return redirect('dcim:device_list')
return render(request, 'dcim/device_bulk_add_component.html', {
@@ -1592,7 +1592,7 @@ def interfaceconnection_add(request, pk):
if form.is_valid():
interfaceconnection = form.save()
- msg = u'Connected {} {} to {} {}'.format(
+ msg = 'Connected {} {} to {} {}'.format(
interfaceconnection.interface_a.device.get_absolute_url(),
escape(interfaceconnection.interface_a.device),
escape(interfaceconnection.interface_a.name),
@@ -1640,7 +1640,7 @@ def interfaceconnection_delete(request, pk):
form = forms.InterfaceConnectionDeletionForm(request.POST)
if form.is_valid():
interfaceconnection.delete()
- msg = u'Disconnected {} {} from {} {}'.format(
+ msg = 'Disconnected {} {} from {} {}'.format(
interfaceconnection.interface_a.device.get_absolute_url(),
escape(interfaceconnection.interface_a.device),
escape(interfaceconnection.interface_a.name),
diff --git a/netbox/extras/admin.py b/netbox/extras/admin.py
index 2a06b3f2f..9d396dd3d 100644
--- a/netbox/extras/admin.py
+++ b/netbox/extras/admin.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from django.contrib import admin
from django.utils.safestring import mark_safe
diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py
index dafed750b..5bd221893 100644
--- a/netbox/extras/api/customfields.py
+++ b/netbox/extras/api/customfields.py
@@ -1,9 +1,11 @@
-from django.contrib.contenttypes.models import ContentType
-from django.db import transaction
+from __future__ import unicode_literals
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
+from django.contrib.contenttypes.models import ContentType
+from django.db import transaction
+
from extras.models import CF_TYPE_SELECT, CustomField, CustomFieldChoice, CustomFieldValue
@@ -25,14 +27,14 @@ class CustomFieldsSerializer(serializers.BaseSerializer):
# Validate custom field name
if field_name not in custom_fields:
- raise ValidationError(u"Invalid custom field for {} objects: {}".format(content_type, field_name))
+ raise ValidationError("Invalid custom field for {} objects: {}".format(content_type, field_name))
# Validate selected choice
cf = custom_fields[field_name]
if cf.type == CF_TYPE_SELECT:
valid_choices = [c.pk for c in cf.choices.all()]
if value not in valid_choices:
- raise ValidationError(u"Invalid choice ({}) for field {}".format(value, field_name))
+ raise ValidationError("Invalid choice ({}) for field {}".format(value, field_name))
# Check for missing required fields
missing_fields = []
@@ -40,7 +42,7 @@ class CustomFieldsSerializer(serializers.BaseSerializer):
if field.required and field_name not in data:
missing_fields.append(field_name)
if missing_fields:
- raise ValidationError(u"Missing required fields: {}".format(u", ".join(missing_fields)))
+ raise ValidationError("Missing required fields: {}".format(u", ".join(missing_fields)))
return data
diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py
index 08da93aa0..c8b3ff6f7 100644
--- a/netbox/extras/api/serializers.py
+++ b/netbox/extras/api/serializers.py
@@ -1,7 +1,9 @@
-from rest_framework import serializers
+from __future__ import unicode_literals
from django.core.exceptions import ObjectDoesNotExist
+from rest_framework import serializers
+
from dcim.api.serializers import NestedDeviceSerializer, NestedRackSerializer, NestedSiteSerializer
from dcim.models import Device, Rack, Site
from extras.models import (
diff --git a/netbox/extras/api/urls.py b/netbox/extras/api/urls.py
index 0f4bc2874..c5268318c 100644
--- a/netbox/extras/api/urls.py
+++ b/netbox/extras/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py
index d8ef9090e..37112f2c6 100644
--- a/netbox/extras/api/views.py
+++ b/netbox/extras/api/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework.decorators import detail_route
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py
index 9d9dc5f87..e44fb86e9 100644
--- a/netbox/extras/filters.py
+++ b/netbox/extras/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from django.contrib.auth.models import User
diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py
index d85697c8d..d7a06fa5f 100644
--- a/netbox/extras/forms.py
+++ b/netbox/extras/forms.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from collections import OrderedDict
from django import forms
@@ -104,7 +105,7 @@ class CustomFieldForm(forms.ModelForm):
obj_id=self.instance.pk)
except CustomFieldValue.DoesNotExist:
# Skip this field if none exists already and its value is empty
- if self.cleaned_data[field_name] in [None, u'']:
+ if self.cleaned_data[field_name] in [None, '']:
continue
cfv = CustomFieldValue(
field=self.fields[field_name].model,
diff --git a/netbox/extras/management/commands/run_inventory.py b/netbox/extras/management/commands/run_inventory.py
index c8008ed18..1e52b5c8f 100644
--- a/netbox/extras/management/commands/run_inventory.py
+++ b/netbox/extras/management/commands/run_inventory.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from getpass import getpass
from ncclient.transport.errors import AuthenticationError
from paramiko import AuthenticationException
diff --git a/netbox/extras/models.py b/netbox/extras/models.py
index 66d44d8a5..ea92fae0c 100644
--- a/netbox/extras/models.py
+++ b/netbox/extras/models.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from collections import OrderedDict
from datetime import date
import graphviz
@@ -175,7 +176,7 @@ class CustomFieldValue(models.Model):
unique_together = ['field', 'obj_type', 'obj_id']
def __str__(self):
- return u'{} {}'.format(self.obj, self.field)
+ return '{} {}'.format(self.obj, self.field)
@property
def value(self):
@@ -269,7 +270,7 @@ class ExportTemplate(models.Model):
]
def __str__(self):
- return u'{}: {}'.format(self.content_type, self.name)
+ return '{}: {}'.format(self.content_type, self.name)
def to_response(self, context_dict, filename):
"""
@@ -387,7 +388,7 @@ def image_upload(instance, filename):
elif instance.name:
filename = instance.name
- return u'{}{}_{}_{}'.format(path, instance.content_type.name, instance.object_id, filename)
+ return '{}{}_{}_{}'.format(path, instance.content_type.name, instance.object_id, filename)
@python_2_unicode_compatible
@@ -503,8 +504,8 @@ class UserAction(models.Model):
def __str__(self):
if self.message:
- return u'{} {}'.format(self.user, self.message)
- return u'{} {} {}'.format(self.user, self.get_action_display(), self.content_type)
+ return '{} {}'.format(self.user, self.message)
+ return '{} {} {}'.format(self.user, self.get_action_display(), self.content_type)
def icon(self):
if self.action in [ACTION_CREATE, ACTION_BULK_CREATE, ACTION_IMPORT]:
diff --git a/netbox/extras/rpc.py b/netbox/extras/rpc.py
index 208ec20dd..613bdb743 100644
--- a/netbox/extras/rpc.py
+++ b/netbox/extras/rpc.py
@@ -1,8 +1,10 @@
+from __future__ import unicode_literals
+import re
+import time
+
from ncclient import manager
import paramiko
-import re
import xmltodict
-import time
CONNECT_TIMEOUT = 5 # seconds
diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py
index 4c80ddee8..eddc6d71f 100644
--- a/netbox/extras/tests/test_api.py
+++ b/netbox/extras/tests/test_api.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py
index 9e475fde8..5bbb407ce 100644
--- a/netbox/extras/tests/test_customfields.py
+++ b/netbox/extras/tests/test_customfields.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from datetime import date
from rest_framework import status
@@ -9,7 +10,6 @@ from django.test import TestCase
from django.urls import reverse
from dcim.models import Site
-
from extras.models import (
CustomField, CustomFieldValue, CustomFieldChoice, CF_TYPE_TEXT, CF_TYPE_INTEGER, CF_TYPE_BOOLEAN, CF_TYPE_DATE,
CF_TYPE_SELECT, CF_TYPE_URL,
diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py
index 635c9edb4..f980158e8 100644
--- a/netbox/extras/urls.py
+++ b/netbox/extras/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from extras import views
diff --git a/netbox/extras/views.py b/netbox/extras/views.py
index 97968c62b..6469ba76a 100644
--- a/netbox/extras/views.py
+++ b/netbox/extras/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.shortcuts import get_object_or_404
diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py
index 7d9a5778c..096f1d232 100644
--- a/netbox/ipam/api/serializers.py
+++ b/netbox/ipam/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator
diff --git a/netbox/ipam/api/urls.py b/netbox/ipam/api/urls.py
index b3e559675..e6b1bb13d 100644
--- a/netbox/ipam/api/urls.py
+++ b/netbox/ipam/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py
index 611931edf..87c1996a1 100644
--- a/netbox/ipam/api/views.py
+++ b/netbox/ipam/api/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework.viewsets import ModelViewSet
from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
diff --git a/netbox/ipam/apps.py b/netbox/ipam/apps.py
index fd4af74b0..c944d1b2c 100644
--- a/netbox/ipam/apps.py
+++ b/netbox/ipam/apps.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.apps import AppConfig
diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py
index c44385b6d..a20a5dce2 100644
--- a/netbox/ipam/fields.py
+++ b/netbox/ipam/fields.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from netaddr import IPNetwork
from django.core.exceptions import ValidationError
diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py
index 3229ad2b8..54146e91a 100644
--- a/netbox/ipam/filters.py
+++ b/netbox/ipam/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from netaddr import IPNetwork
from netaddr.core import AddrFormatError
@@ -8,7 +10,6 @@ from dcim.models import Site, Device, Interface
from extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant
from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
-
from .models import (
Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, Service, VLAN,
VLAN_STATUS_CHOICES, VLANGroup, VRF,
diff --git a/netbox/ipam/formfields.py b/netbox/ipam/formfields.py
index 914310be9..8d30e11e5 100644
--- a/netbox/ipam/formfields.py
+++ b/netbox/ipam/formfields.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from netaddr import IPNetwork, AddrFormatError
from django import forms
diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py
index e45543479..7f62015af 100644
--- a/netbox/ipam/forms.py
+++ b/netbox/ipam/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from django.core.exceptions import ValidationError
from django.db.models import Count
@@ -10,7 +12,6 @@ from utilities.forms import (
APISelect, BootstrapMixin, BulkEditNullBooleanSelect, BulkImportForm, ChainedModelChoiceField, CSVDataField,
ExpandableIPAddressField, FilterChoiceField, Livesearch, ReturnURLForm, SlugField, add_blank_choice,
)
-
from .models import (
Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, Service, VLAN,
VLANGroup, VLAN_STATUS_CHOICES, VRF,
@@ -270,7 +271,7 @@ def prefix_status_choices():
status_counts = {}
for status in Prefix.objects.values('status').annotate(count=Count('status')).order_by('status'):
status_counts[status['status']] = status['count']
- return [(s[0], u'{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in PREFIX_STATUS_CHOICES]
+ return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in PREFIX_STATUS_CHOICES]
class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm):
@@ -567,7 +568,7 @@ def ipaddress_status_choices():
status_counts = {}
for status in IPAddress.objects.values('status').annotate(count=Count('status')).order_by('status'):
status_counts[status['status']] = status['count']
- return [(s[0], u'{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in IPADDRESS_STATUS_CHOICES]
+ return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in IPADDRESS_STATUS_CHOICES]
class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm):
@@ -720,7 +721,7 @@ def vlan_status_choices():
status_counts = {}
for status in VLAN.objects.values('status').annotate(count=Count('status')).order_by('status'):
status_counts[status['status']] = status['count']
- return [(s[0], u'{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in VLAN_STATUS_CHOICES]
+ return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in VLAN_STATUS_CHOICES]
class VLANFilterForm(BootstrapMixin, CustomFieldFilterForm):
diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py
index 05c69dfb2..ef5cf8327 100644
--- a/netbox/ipam/lookups.py
+++ b/netbox/ipam/lookups.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.db.models import Lookup, Transform, IntegerField
from django.db.models.lookups import BuiltinLookup
diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py
index 980b17913..01cdd406d 100644
--- a/netbox/ipam/models.py
+++ b/netbox/ipam/models.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from netaddr import IPNetwork, cidr_merge
from django.conf import settings
@@ -15,7 +17,6 @@ from tenancy.models import Tenant
from utilities.models import CreatedUpdatedModel
from utilities.sql import NullsFirstQuerySet
from utilities.utils import csv_format
-
from .fields import IPNetworkField, IPAddressField
@@ -499,7 +500,7 @@ class VLANGroup(models.Model):
def __str__(self):
if self.site is None:
return self.name
- return u'{} - {}'.format(self.site.name, self.name)
+ return '{} - {}'.format(self.site.name, self.name)
def get_absolute_url(self):
return "{}?group_id={}".format(reverse('ipam:vlan_list'), self.pk)
@@ -566,7 +567,7 @@ class VLAN(CreatedUpdatedModel, CustomFieldModel):
@property
def display_name(self):
if self.vid and self.name:
- return u"{} ({})".format(self.vid, self.name)
+ return "{} ({})".format(self.vid, self.name)
return None
def get_status_class(self):
@@ -593,4 +594,4 @@ class Service(CreatedUpdatedModel):
unique_together = ['device', 'protocol', 'port']
def __str__(self):
- return u'{} ({}/{})'.format(self.name, self.port, self.get_protocol_display())
+ return '{} ({}/{})'.format(self.name, self.port, self.get_protocol_display())
diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py
index 562713f5b..64b7d62fa 100644
--- a/netbox/ipam/tables.py
+++ b/netbox/ipam/tables.py
@@ -1,8 +1,9 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
from django_tables2.utils import Accessor
from utilities.tables import BaseTable, SearchTable, ToggleColumn
-
from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VLANGroup, VRF
diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py
index cd58f865b..0b6814b4a 100644
--- a/netbox/ipam/tests/test_api.py
+++ b/netbox/ipam/tests/test_api.py
@@ -1,5 +1,6 @@
-from netaddr import IPNetwork
+from __future__ import unicode_literals
+from netaddr import IPNetwork
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py
index 3385c643f..0f75cc795 100644
--- a/netbox/ipam/tests/test_models.py
+++ b/netbox/ipam/tests/test_models.py
@@ -1,9 +1,11 @@
+from __future__ import unicode_literals
+
import netaddr
+from django.core.exceptions import ValidationError
from django.test import TestCase, override_settings
from ipam.models import IPAddress, Prefix, VRF
-from django.core.exceptions import ValidationError
class TestPrefix(TestCase):
diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py
index 59b1d1fd3..d28bf8a13 100644
--- a/netbox/ipam/urls.py
+++ b/netbox/ipam/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py
index b49db4250..a51f47b6e 100644
--- a/netbox/ipam/views.py
+++ b/netbox/ipam/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django_tables2 import RequestConfig
import netaddr
@@ -13,7 +15,6 @@ from utilities.paginator import EnhancedPaginator
from utilities.views import (
BulkAddView, BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
-
from . import filters, forms, tables
from .models import (
Aggregate, IPAddress, PREFIX_STATUS_ACTIVE, PREFIX_STATUS_DEPRECATED, PREFIX_STATUS_RESERVED, Prefix, RIR, Role,
diff --git a/netbox/netbox/forms.py b/netbox/netbox/forms.py
index 63af2e04b..85343ec77 100644
--- a/netbox/netbox/forms.py
+++ b/netbox/netbox/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from utilities.forms import BootstrapMixin
diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py
index 6d946d90e..ddddf27a2 100644
--- a/netbox/netbox/urls.py
+++ b/netbox/netbox/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework_swagger.views import get_swagger_view
from django.conf import settings
diff --git a/netbox/netbox/views.py b/netbox/netbox/views.py
index 793f3c9a2..6f642063b 100644
--- a/netbox/netbox/views.py
+++ b/netbox/netbox/views.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from collections import OrderedDict
import sys
@@ -195,7 +196,7 @@ class SearchView(View):
results.append({
'name': queryset.model._meta.verbose_name_plural,
'table': table,
- 'url': u'{}?q={}'.format(reverse(url), form.cleaned_data['q'])
+ 'url': '{}?q={}'.format(reverse(url), form.cleaned_data['q'])
})
return render(request, 'search.html', {
@@ -209,7 +210,7 @@ class APIRootView(APIView):
exclude_from_schema = True
def get_view_name(self):
- return u"API Root"
+ return "API Root"
def get(self, request, format=None):
diff --git a/netbox/netbox/wsgi.py b/netbox/netbox/wsgi.py
index 7fac23c61..6d13ffe9d 100644
--- a/netbox/netbox/wsgi.py
+++ b/netbox/netbox/wsgi.py
@@ -11,6 +11,7 @@ import os
from django.core.wsgi import get_wsgi_application
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "netbox.settings")
application = get_wsgi_application()
diff --git a/netbox/secrets/admin.py b/netbox/secrets/admin.py
index 58658a07e..3780dccd2 100644
--- a/netbox/secrets/admin.py
+++ b/netbox/secrets/admin.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib import admin, messages
from django.shortcuts import redirect, render
@@ -34,7 +36,7 @@ class UserKeyAdmin(admin.ModelAdmin):
try:
my_userkey = UserKey.objects.get(user=request.user)
except UserKey.DoesNotExist:
- messages.error(request, u"You do not have an active User Key.")
+ messages.error(request, "You do not have an active User Key.")
return redirect('admin:secrets_userkey_changelist')
if 'activate' in request.POST:
@@ -46,7 +48,7 @@ class UserKeyAdmin(admin.ModelAdmin):
uk.activate(master_key)
return redirect('admin:secrets_userkey_changelist')
except ValueError:
- messages.error(request, u"Invalid private key provided. Unable to retrieve master key.")
+ messages.error(request, "Invalid private key provided. Unable to retrieve master key.")
else:
form = ActivateUserKeyForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})
diff --git a/netbox/secrets/api/serializers.py b/netbox/secrets/api/serializers.py
index 1dc52388a..3c7132d37 100644
--- a/netbox/secrets/api/serializers.py
+++ b/netbox/secrets/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator
diff --git a/netbox/secrets/api/urls.py b/netbox/secrets/api/urls.py
index 5f60a8a06..3b1e7d3d0 100644
--- a/netbox/secrets/api/urls.py
+++ b/netbox/secrets/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/secrets/api/views.py b/netbox/secrets/api/views.py
index 0e6314e17..edc165aa0 100644
--- a/netbox/secrets/api/views.py
+++ b/netbox/secrets/api/views.py
@@ -1,13 +1,14 @@
+from __future__ import unicode_literals
import base64
+
from Crypto.PublicKey import RSA
-
-from django.http import HttpResponseBadRequest
-
from rest_framework.exceptions import ValidationError
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet, ViewSet
+from django.http import HttpResponseBadRequest
+
from secrets import filters
from secrets.exceptions import InvalidKey
from secrets.models import Secret, SecretRole, SessionKey, UserKey
diff --git a/netbox/secrets/decorators.py b/netbox/secrets/decorators.py
index 683805124..0b9ebc16e 100644
--- a/netbox/secrets/decorators.py
+++ b/netbox/secrets/decorators.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib import messages
from django.shortcuts import redirect
@@ -14,10 +16,10 @@ def userkey_required():
try:
uk = UserKey.objects.get(user=request.user)
except UserKey.DoesNotExist:
- messages.warning(request, u"This operation requires an active user key, but you don't have one.")
+ messages.warning(request, "This operation requires an active user key, but you don't have one.")
return redirect('user:userkey')
if not uk.is_active():
- messages.warning(request, u"This operation is not available. Your user key has not been activated.")
+ messages.warning(request, "This operation is not available. Your user key has not been activated.")
return redirect('user:userkey')
return view(request, *args, **kwargs)
return wrapped_view
diff --git a/netbox/secrets/exceptions.py b/netbox/secrets/exceptions.py
index c163e5907..f014d8a14 100644
--- a/netbox/secrets/exceptions.py
+++ b/netbox/secrets/exceptions.py
@@ -1,3 +1,6 @@
+from __future__ import unicode_literals
+
+
class InvalidKey(Exception):
"""
Raised when a provided key is invalid.
diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py
index 14ebd1616..4bc7b56cd 100644
--- a/netbox/secrets/filters.py
+++ b/netbox/secrets/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from django.db.models import Q
diff --git a/netbox/secrets/forms.py b/netbox/secrets/forms.py
index 65e369376..b8e165804 100644
--- a/netbox/secrets/forms.py
+++ b/netbox/secrets/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
@@ -6,7 +8,6 @@ from django.db.models import Count
from dcim.models import Device
from utilities.forms import BootstrapMixin, BulkEditForm, BulkImportForm, CSVDataField, FilterChoiceField, SlugField
-
from .models import Secret, SecretRole, UserKey
diff --git a/netbox/secrets/hashers.py b/netbox/secrets/hashers.py
index fc5066fc6..49da1605d 100644
--- a/netbox/secrets/hashers.py
+++ b/netbox/secrets/hashers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.auth.hashers import PBKDF2PasswordHasher
diff --git a/netbox/secrets/models.py b/netbox/secrets/models.py
index e39f1832b..bf423fdf6 100644
--- a/netbox/secrets/models.py
+++ b/netbox/secrets/models.py
@@ -1,4 +1,6 @@
+from __future__ import unicode_literals
import os
+
from Crypto.Cipher import AES, PKCS1_OAEP, XOR
from Crypto.PublicKey import RSA
@@ -12,7 +14,6 @@ from django.utils.encoding import force_bytes, python_2_unicode_compatible
from dcim.models import Device
from utilities.models import CreatedUpdatedModel
-
from .exceptions import InvalidKey
from .hashers import SecretValidationHasher
@@ -301,8 +302,8 @@ class Secret(CreatedUpdatedModel):
def __str__(self):
if self.role and self.device:
- return u'{} for {}'.format(self.role, self.device)
- return u'Secret'
+ return '{} for {}'.format(self.role, self.device)
+ return 'Secret'
def get_absolute_url(self):
return reverse('secrets:secret', args=[self.pk])
diff --git a/netbox/secrets/tables.py b/netbox/secrets/tables.py
index ca9b2fd96..980c093b7 100644
--- a/netbox/secrets/tables.py
+++ b/netbox/secrets/tables.py
@@ -1,5 +1,6 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
-from django_tables2.utils import Accessor
from utilities.tables import BaseTable, SearchTable, ToggleColumn
@@ -22,8 +23,9 @@ class SecretRoleTable(BaseTable):
name = tables.LinkColumn(verbose_name='Name')
secret_count = tables.Column(verbose_name='Secrets')
slug = tables.Column(verbose_name='Slug')
- actions = tables.TemplateColumn(template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right'}},
- verbose_name='')
+ actions = tables.TemplateColumn(
+ template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name=''
+ )
class Meta(BaseTable.Meta):
model = SecretRole
diff --git a/netbox/secrets/templatetags/secret_helpers.py b/netbox/secrets/templatetags/secret_helpers.py
index 142c0d2cb..0e1ff554c 100644
--- a/netbox/secrets/templatetags/secret_helpers.py
+++ b/netbox/secrets/templatetags/secret_helpers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import template
diff --git a/netbox/secrets/tests/test_api.py b/netbox/secrets/tests/test_api.py
index 227478b99..4acda3eff 100644
--- a/netbox/secrets/tests/test_api.py
+++ b/netbox/secrets/tests/test_api.py
@@ -1,4 +1,6 @@
+from __future__ import unicode_literals
import base64
+
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/secrets/tests/test_models.py b/netbox/secrets/tests/test_models.py
index e668f1185..4be37801d 100644
--- a/netbox/secrets/tests/test_models.py
+++ b/netbox/secrets/tests/test_models.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from Crypto.PublicKey import RSA
from django.conf import settings
diff --git a/netbox/secrets/urls.py b/netbox/secrets/urls.py
index e801c2de2..4961b2c82 100644
--- a/netbox/secrets/urls.py
+++ b/netbox/secrets/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py
index 05fb5c262..d2427dd73 100644
--- a/netbox/secrets/views.py
+++ b/netbox/secrets/views.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import base64
from django.contrib import messages
@@ -12,7 +13,6 @@ from django.views.generic import View
from dcim.models import Device
from utilities.views import BulkDeleteView, BulkEditView, ObjectDeleteView, ObjectEditView, ObjectListView
-
from . import filters, forms, tables
from .decorators import userkey_required
from .models import SecretRole, Secret, SessionKey
@@ -110,7 +110,7 @@ def secret_add(request, pk):
secret.plaintext = str(form.cleaned_data['plaintext'])
secret.encrypt(master_key)
secret.save()
- messages.success(request, u"Added new secret: {}.".format(secret))
+ messages.success(request, "Added new secret: {}.".format(secret))
if '_addanother' in request.POST:
return redirect('dcim:device_addsecret', pk=device.pk)
else:
@@ -154,7 +154,7 @@ def secret_edit(request, pk):
secret.plaintext = str(form.cleaned_data['plaintext'])
secret.encrypt(master_key)
secret.save()
- messages.success(request, u"Modified secret {}.".format(secret))
+ messages.success(request, "Modified secret {}.".format(secret))
return redirect('secrets:secret', pk=secret.pk)
else:
form.add_error(None, "Invalid session key. Unable to encrypt secret data.")
@@ -166,7 +166,7 @@ def secret_edit(request, pk):
# If no new plaintext was specified, a session key is not needed.
else:
secret = form.save()
- messages.success(request, u"Modified secret {}.".format(secret))
+ messages.success(request, "Modified secret {}.".format(secret))
return redirect('secrets:secret', pk=secret.pk)
else:
@@ -220,7 +220,7 @@ def secret_import(request):
new_secrets.append(secret)
table = tables.SecretTable(new_secrets)
- messages.success(request, u"Imported {} new secrets.".format(len(new_secrets)))
+ messages.success(request, "Imported {} new secrets.".format(len(new_secrets)))
return render(request, 'import_success.html', {
'table': table,
diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py
index e649b6f03..712d524c5 100644
--- a/netbox/tenancy/api/serializers.py
+++ b/netbox/tenancy/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import serializers
from extras.api.customfields import CustomFieldModelSerializer
diff --git a/netbox/tenancy/api/urls.py b/netbox/tenancy/api/urls.py
index f14d39126..a3ce7774a 100644
--- a/netbox/tenancy/api/urls.py
+++ b/netbox/tenancy/api/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import routers
from . import views
diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py
index ae5069271..e5105f338 100644
--- a/netbox/tenancy/api/views.py
+++ b/netbox/tenancy/api/views.py
@@ -1,9 +1,10 @@
+from __future__ import unicode_literals
+
from rest_framework.viewsets import ModelViewSet
+from extras.api.views import CustomFieldModelViewSet
from tenancy.models import Tenant, TenantGroup
from tenancy.filters import TenantFilter
-
-from extras.api.views import CustomFieldModelViewSet
from utilities.api import WritableSerializerMixin
from . import serializers
diff --git a/netbox/tenancy/apps.py b/netbox/tenancy/apps.py
index 53cb9a056..df2cd2fbb 100644
--- a/netbox/tenancy/apps.py
+++ b/netbox/tenancy/apps.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.apps import AppConfig
diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py
index b96345980..4ded4f0c4 100644
--- a/netbox/tenancy/filters.py
+++ b/netbox/tenancy/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
from django.db.models import Q
diff --git a/netbox/tenancy/forms.py b/netbox/tenancy/forms.py
index e9a39d237..518941539 100644
--- a/netbox/tenancy/forms.py
+++ b/netbox/tenancy/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from django.db.models import Count
diff --git a/netbox/tenancy/models.py b/netbox/tenancy/models.py
index 203dc7e41..ea3405df9 100644
--- a/netbox/tenancy/models.py
+++ b/netbox/tenancy/models.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from django.urls import reverse
diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py
index 56cf1c02a..9941e269a 100644
--- a/netbox/tenancy/tables.py
+++ b/netbox/tenancy/tables.py
@@ -1,5 +1,6 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
-from django_tables2.utils import Accessor
from utilities.tables import BaseTable, SearchTable, ToggleColumn
@@ -22,8 +23,9 @@ class TenantGroupTable(BaseTable):
name = tables.LinkColumn(verbose_name='Name')
tenant_count = tables.Column(verbose_name='Tenants')
slug = tables.Column(verbose_name='Slug')
- actions = tables.TemplateColumn(template_code=TENANTGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}},
- verbose_name='')
+ actions = tables.TemplateColumn(
+ template_code=TENANTGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name=''
+ )
class Meta(BaseTable.Meta):
model = TenantGroup
diff --git a/netbox/tenancy/tests/test_api.py b/netbox/tenancy/tests/test_api.py
index 11e89fae1..5414a1b06 100644
--- a/netbox/tenancy/tests/test_api.py
+++ b/netbox/tenancy/tests/test_api.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from rest_framework import status
from rest_framework.test import APITestCase
diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py
index be450be7e..cb04cffb9 100644
--- a/netbox/tenancy/urls.py
+++ b/netbox/tenancy/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py
index d520039b4..3b5ad9b37 100644
--- a/netbox/tenancy/views.py
+++ b/netbox/tenancy/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.db.models import Count, Q
from django.shortcuts import get_object_or_404, render
@@ -10,7 +12,6 @@ from ipam.models import IPAddress, Prefix, VLAN, VRF
from utilities.views import (
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
-
from .models import Tenant, TenantGroup
from . import filters, forms, tables
diff --git a/netbox/users/admin.py b/netbox/users/admin.py
index adfa151d5..ccf640edd 100644
--- a/netbox/users/admin.py
+++ b/netbox/users/admin.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django import forms
from django.contrib import admin
diff --git a/netbox/users/api/serializers.py b/netbox/users/api/serializers.py
index 893a989bc..a516b2121 100644
--- a/netbox/users/api/serializers.py
+++ b/netbox/users/api/serializers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.auth.models import User
from rest_framework import serializers
diff --git a/netbox/users/forms.py b/netbox/users/forms.py
index d84bac0e1..811ca6cc5 100644
--- a/netbox/users/forms.py
+++ b/netbox/users/forms.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm
from django import forms
diff --git a/netbox/users/models.py b/netbox/users/models.py
index 16c5005ef..a2d9d09ba 100644
--- a/netbox/users/models.py
+++ b/netbox/users/models.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import binascii
import os
@@ -26,7 +27,7 @@ class Token(models.Model):
def __str__(self):
# Only display the last 24 bits of the token to avoid accidental exposure.
- return u"{} ({})".format(self.key[-6:], self.user)
+ return "{} ({})".format(self.key[-6:], self.user)
def save(self, *args, **kwargs):
if not self.key:
diff --git a/netbox/users/urls.py b/netbox/users/urls.py
index 3183e5063..57a7e43cc 100644
--- a/netbox/users/urls.py
+++ b/netbox/users/urls.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf.urls import url
from . import views
diff --git a/netbox/users/views.py b/netbox/users/views.py
index 15f4bd55f..88b6ebd32 100644
--- a/netbox/users/views.py
+++ b/netbox/users/views.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib import messages
from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash
from django.contrib.auth.decorators import login_required
@@ -41,7 +43,7 @@ class LoginView(View):
# Authenticate user
auth_login(request, form.get_user())
- messages.info(request, u"Logged in as {}.".format(request.user))
+ messages.info(request, "Logged in as {}.".format(request.user))
return HttpResponseRedirect(redirect_to)
@@ -54,7 +56,7 @@ class LogoutView(View):
def get(self, request):
auth_logout(request)
- messages.info(request, u"You have logged out.")
+ messages.info(request, "You have logged out.")
return HttpResponseRedirect(reverse('home'))
@@ -91,7 +93,7 @@ class ChangePasswordView(View):
if form.is_valid():
form.save()
update_session_auth_hash(request, form.user)
- messages.success(request, u"Your password has been changed successfully.")
+ messages.success(request, "Your password has been changed successfully.")
return redirect('user:profile')
return render(request, self.template_name, {
@@ -143,7 +145,7 @@ class UserKeyEditView(View):
uk = form.save(commit=False)
uk.user = request.user
uk.save()
- messages.success(request, u"Your user key has been saved.")
+ messages.success(request, "Your user key has been saved.")
return redirect('user:userkey')
return render(request, self.template_name, {
diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py
index ebcb19d44..a587c67d1 100644
--- a/netbox/utilities/api.py
+++ b/netbox/utilities/api.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
diff --git a/netbox/utilities/context_processors.py b/netbox/utilities/context_processors.py
index 6b1bb0af5..58c8641ec 100644
--- a/netbox/utilities/context_processors.py
+++ b/netbox/utilities/context_processors.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf import settings as django_settings
diff --git a/netbox/utilities/error_handlers.py b/netbox/utilities/error_handlers.py
index e87b6f0e1..3b7eb7a5b 100644
--- a/netbox/utilities/error_handlers.py
+++ b/netbox/utilities/error_handlers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.contrib import messages
from django.utils.html import escape
from django.utils.safestring import mark_safe
@@ -14,12 +16,12 @@ def handle_protectederror(obj, request, e):
# Grammar for single versus multiple triggering objects
if type(obj) in (list, tuple):
- err_message = u"Unable to delete the requested {}. The following dependent {} were found: ".format(
+ err_message = "Unable to delete the requested {}. The following dependent {} were found: ".format(
obj[0]._meta.verbose_name_plural,
dep_class,
)
else:
- err_message = u"Unable to delete {} {}. The following dependent {} were found: ".format(
+ err_message = "Unable to delete {} {}. The following dependent {} were found: ".format(
obj._meta.verbose_name,
obj,
dep_class,
@@ -29,9 +31,9 @@ def handle_protectederror(obj, request, e):
dependent_objects = []
for obj in e.protected_objects:
if hasattr(obj, 'get_absolute_url'):
- dependent_objects.append(u'{}'.format(obj.get_absolute_url(), escape(obj)))
+ dependent_objects.append('{}'.format(obj.get_absolute_url(), escape(obj)))
else:
dependent_objects.append(str(obj))
- err_message += u', '.join(dependent_objects)
+ err_message += ', '.join(dependent_objects)
messages.error(request, mark_safe(err_message))
diff --git a/netbox/utilities/fields.py b/netbox/utilities/fields.py
index 14d1c7d8f..2b1a51048 100644
--- a/netbox/utilities/fields.py
+++ b/netbox/utilities/fields.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.core.validators import RegexValidator
from django.db import models
diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py
index c352f0f41..5929c3ff1 100644
--- a/netbox/utilities/filters.py
+++ b/netbox/utilities/filters.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_filters
import itertools
diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py
index ba97a6507..c484f027b 100644
--- a/netbox/utilities/forms.py
+++ b/netbox/utilities/forms.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import csv
import itertools
import re
@@ -373,7 +374,7 @@ class FilterChoiceFieldMixin(object):
def label_from_instance(self, obj):
label = super(FilterChoiceFieldMixin, self).label_from_instance(obj)
if hasattr(obj, 'filter_count'):
- return u'{} ({})'.format(label, obj.filter_count)
+ return '{} ({})'.format(label, obj.filter_count)
return label
def _get_choices(self):
diff --git a/netbox/utilities/managers.py b/netbox/utilities/managers.py
index 5b6138d30..dc882d462 100644
--- a/netbox/utilities/managers.py
+++ b/netbox/utilities/managers.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.db.models import Manager
diff --git a/netbox/utilities/middleware.py b/netbox/utilities/middleware.py
index 22697d179..d5d151c12 100644
--- a/netbox/utilities/middleware.py
+++ b/netbox/utilities/middleware.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.http import HttpResponseRedirect
from django.conf import settings
from django.urls import reverse
diff --git a/netbox/utilities/models.py b/netbox/utilities/models.py
index 88f513554..c6768c4c1 100644
--- a/netbox/utilities/models.py
+++ b/netbox/utilities/models.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.db import models
diff --git a/netbox/utilities/paginator.py b/netbox/utilities/paginator.py
index ae915f773..9ebbbab57 100644
--- a/netbox/utilities/paginator.py
+++ b/netbox/utilities/paginator.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.conf import settings
from django.core.paginator import Paginator, Page
diff --git a/netbox/utilities/sql.py b/netbox/utilities/sql.py
index 617586ab8..ac2c70624 100644
--- a/netbox/utilities/sql.py
+++ b/netbox/utilities/sql.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
from django.db import connections, models
from django.db.models.sql.compiler import SQLCompiler
diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py
index 1c5eab2a6..1dd8969a1 100644
--- a/netbox/utilities/tables.py
+++ b/netbox/utilities/tables.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
import django_tables2 as tables
from django.utils.safestring import mark_safe
diff --git a/netbox/utilities/tests.py b/netbox/utilities/tests.py
index d80b42c63..3c7f51eba 100644
--- a/netbox/utilities/tests.py
+++ b/netbox/utilities/tests.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
class HttpStatusMixin(object):
"""
Custom mixin to provide more detail in the event of an unexpected HTTP response.
diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py
index 98400bccd..3e9364419 100644
--- a/netbox/utilities/utils.py
+++ b/netbox/utilities/utils.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import six
@@ -10,20 +11,20 @@ def csv_format(data):
# Represent None or False with empty string
if value in [None, False]:
- csv.append(u'')
+ csv.append('')
continue
# Force conversion to string first so we can check for any commas
if not isinstance(value, six.string_types):
- value = u'{}'.format(value)
+ value = '{}'.format(value)
# Double-quote the value if it contains a comma
- if u',' in value:
- csv.append(u'"{}"'.format(value))
+ if ',' in value:
+ csv.append('"{}"'.format(value))
else:
- csv.append(u'{}'.format(value))
+ csv.append('{}'.format(value))
- return u','.join(csv)
+ return ','.join(csv)
def foreground_color(bg_color):
diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py
index d61a55e66..9c7a4b55e 100644
--- a/netbox/utilities/views.py
+++ b/netbox/utilities/views.py
@@ -1,4 +1,6 @@
+from __future__ import unicode_literals
from collections import OrderedDict
+
from django_tables2 import RequestConfig
from django.conf import settings
@@ -17,7 +19,6 @@ from django.utils.safestring import mark_safe
from django.views.generic import View
from extras.models import CustomField, CustomFieldValue, ExportTemplate, UserAction
-
from .error_handlers import handle_protectederror
from .forms import ConfirmationForm
from .paginator import EnhancedPaginator
@@ -95,7 +96,7 @@ class ObjectListView(View):
filename='netbox_{}'.format(model._meta.verbose_name_plural))
return response
except TemplateSyntaxError:
- messages.error(request, u"There was an error rendering the selected export template ({})."
+ messages.error(request, "There was an error rendering the selected export template ({})."
.format(et.name))
# Fall back to built-in CSV export
elif 'export' in request.GET and hasattr(model, 'to_csv'):
@@ -196,12 +197,12 @@ class ObjectEditView(GetReturnURLMixin, View):
obj_created = not form.instance.pk
obj = form.save()
- msg = u'Created ' if obj_created else u'Modified '
+ msg = 'Created ' if obj_created else 'Modified '
msg += self.model._meta.verbose_name
if hasattr(obj, 'get_absolute_url'):
- msg = u'{} {}'.format(msg, obj.get_absolute_url(), escape(obj))
+ msg = '{} {}'.format(msg, obj.get_absolute_url(), escape(obj))
else:
- msg = u'{} {}'.format(msg, escape(obj))
+ msg = '{} {}'.format(msg, escape(obj))
messages.success(request, mark_safe(msg))
if obj_created:
UserAction.objects.log_create(request.user, obj, msg)
@@ -267,7 +268,7 @@ class ObjectDeleteView(GetReturnURLMixin, View):
handle_protectederror(obj, request, e)
return redirect(obj.get_absolute_url())
- msg = u'Deleted {} {}'.format(self.model._meta.verbose_name, obj)
+ msg = 'Deleted {} {}'.format(self.model._meta.verbose_name, obj)
messages.success(request, msg)
UserAction.objects.log_delete(request.user, obj, msg)
@@ -347,7 +348,7 @@ class BulkAddView(View):
raise IntegrityError()
# If we make it to this point, validation has succeeded on all new objects.
- msg = u"Added {} {}".format(len(new_objs), model._meta.verbose_name_plural)
+ msg = "Added {} {}".format(len(new_objs), model._meta.verbose_name_plural)
messages.success(request, msg)
UserAction.objects.log_bulk_create(request.user, ContentType.objects.get_for_model(model), msg)
@@ -400,7 +401,7 @@ class BulkImportView(View):
obj_table = self.table(new_objs)
if new_objs:
- msg = u'Imported {} {}'.format(len(new_objs), new_objs[0]._meta.verbose_name_plural)
+ msg = 'Imported {} {}'.format(len(new_objs), new_objs[0]._meta.verbose_name_plural)
messages.success(request, msg)
UserAction.objects.log_import(request.user, ContentType.objects.get_for_model(new_objs[0]), msg)
@@ -493,7 +494,7 @@ class BulkEditView(View):
updated_count = objs_updated
if updated_count:
- msg = u'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural)
+ msg = 'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural)
messages.success(self.request, msg)
UserAction.objects.log_bulk_edit(request.user, ContentType.objects.get_for_model(self.cls), msg)
return redirect(return_url)
@@ -505,7 +506,7 @@ class BulkEditView(View):
selected_objects = self.cls.objects.filter(pk__in=pk_list)
if not selected_objects:
- messages.warning(request, u"No {} were selected.".format(self.cls._meta.verbose_name_plural))
+ messages.warning(request, "No {} were selected.".format(self.cls._meta.verbose_name_plural))
return redirect(return_url)
return render(request, self.template_name, {
@@ -530,7 +531,7 @@ class BulkEditView(View):
objs_updated = True
# Updating the value of the field
- elif form.cleaned_data[name] not in [None, u'']:
+ elif form.cleaned_data[name] not in [None, '']:
# Check for zero value (bulk editing)
if isinstance(form.fields[name], TypedChoiceField) and form.cleaned_data[name] == 0:
@@ -618,7 +619,7 @@ class BulkDeleteView(View):
handle_protectederror(list(queryset), request, e)
return redirect(return_url)
- msg = u'Deleted {} {}'.format(deleted_count, self.cls._meta.verbose_name_plural)
+ msg = 'Deleted {} {}'.format(deleted_count, self.cls._meta.verbose_name_plural)
messages.success(request, msg)
UserAction.objects.log_bulk_delete(request.user, ContentType.objects.get_for_model(self.cls), msg)
return redirect(return_url)
@@ -628,7 +629,7 @@ class BulkDeleteView(View):
selected_objects = self.cls.objects.filter(pk__in=pk_list)
if not selected_objects:
- messages.warning(request, u"No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural))
+ messages.warning(request, "No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural))
return redirect(return_url)
return render(request, self.template_name, {