Parcourir la source

Import unicode_literals

Jeremy Stretch il y a 8 ans
Parent
commit
f21c6bca00
100 fichiers modifiés avec 283 ajouts et 111 suppressions
  1. 2 0
      netbox/circuits/api/serializers.py
  2. 2 0
      netbox/circuits/api/urls.py
  3. 3 1
      netbox/circuits/api/views.py
  4. 2 0
      netbox/circuits/apps.py
  5. 2 0
      netbox/circuits/filters.py
  6. 2 0
      netbox/circuits/forms.py
  7. 4 2
      netbox/circuits/models.py
  8. 2 0
      netbox/circuits/signals.py
  9. 2 1
      netbox/circuits/tables.py
  10. 2 0
      netbox/circuits/tests/test_api.py
  11. 2 0
      netbox/circuits/urls.py
  12. 2 1
      netbox/circuits/views.py
  13. 2 0
      netbox/dcim/api/exceptions.py
  14. 2 0
      netbox/dcim/api/serializers.py
  15. 2 0
      netbox/dcim/api/urls.py
  16. 2 0
      netbox/dcim/api/views.py
  17. 2 0
      netbox/dcim/apps.py
  18. 2 0
      netbox/dcim/fields.py
  19. 2 0
      netbox/dcim/filters.py
  20. 2 0
      netbox/dcim/formfields.py
  21. 5 4
      netbox/dcim/forms.py
  22. 13 13
      netbox/dcim/models.py
  23. 2 1
      netbox/dcim/tables.py
  24. 2 0
      netbox/dcim/tests/test_api.py
  25. 3 0
      netbox/dcim/tests/test_forms.py
  26. 3 0
      netbox/dcim/tests/test_models.py
  27. 3 2
      netbox/dcim/urls.py
  28. 22 22
      netbox/dcim/views.py
  29. 2 0
      netbox/extras/admin.py
  30. 7 5
      netbox/extras/api/customfields.py
  31. 3 1
      netbox/extras/api/serializers.py
  32. 2 0
      netbox/extras/api/urls.py
  33. 2 0
      netbox/extras/api/views.py
  34. 2 0
      netbox/extras/filters.py
  35. 2 1
      netbox/extras/forms.py
  36. 2 0
      netbox/extras/management/commands/run_inventory.py
  37. 6 5
      netbox/extras/models.py
  38. 4 2
      netbox/extras/rpc.py
  39. 2 0
      netbox/extras/tests/test_api.py
  40. 1 1
      netbox/extras/tests/test_customfields.py
  41. 2 0
      netbox/extras/urls.py
  42. 2 0
      netbox/extras/views.py
  43. 2 0
      netbox/ipam/api/serializers.py
  44. 2 0
      netbox/ipam/api/urls.py
  45. 2 0
      netbox/ipam/api/views.py
  46. 2 0
      netbox/ipam/apps.py
  47. 2 0
      netbox/ipam/fields.py
  48. 2 1
      netbox/ipam/filters.py
  49. 2 0
      netbox/ipam/formfields.py
  50. 5 4
      netbox/ipam/forms.py
  51. 2 0
      netbox/ipam/lookups.py
  52. 5 4
      netbox/ipam/models.py
  53. 2 1
      netbox/ipam/tables.py
  54. 2 1
      netbox/ipam/tests/test_api.py
  55. 3 1
      netbox/ipam/tests/test_models.py
  56. 2 0
      netbox/ipam/urls.py
  57. 2 1
      netbox/ipam/views.py
  58. 2 0
      netbox/netbox/forms.py
  59. 2 0
      netbox/netbox/urls.py
  60. 3 2
      netbox/netbox/views.py
  61. 1 0
      netbox/netbox/wsgi.py
  62. 4 2
      netbox/secrets/admin.py
  63. 2 0
      netbox/secrets/api/serializers.py
  64. 2 0
      netbox/secrets/api/urls.py
  65. 4 3
      netbox/secrets/api/views.py
  66. 4 2
      netbox/secrets/decorators.py
  67. 3 0
      netbox/secrets/exceptions.py
  68. 2 0
      netbox/secrets/filters.py
  69. 2 1
      netbox/secrets/forms.py
  70. 2 0
      netbox/secrets/hashers.py
  71. 4 3
      netbox/secrets/models.py
  72. 5 3
      netbox/secrets/tables.py
  73. 2 0
      netbox/secrets/templatetags/secret_helpers.py
  74. 2 0
      netbox/secrets/tests/test_api.py
  75. 2 0
      netbox/secrets/tests/test_models.py
  76. 2 0
      netbox/secrets/urls.py
  77. 5 5
      netbox/secrets/views.py
  78. 2 0
      netbox/tenancy/api/serializers.py
  79. 2 0
      netbox/tenancy/api/urls.py
  80. 3 2
      netbox/tenancy/api/views.py
  81. 2 0
      netbox/tenancy/apps.py
  82. 2 0
      netbox/tenancy/filters.py
  83. 2 0
      netbox/tenancy/forms.py
  84. 2 0
      netbox/tenancy/models.py
  85. 5 3
      netbox/tenancy/tables.py
  86. 2 0
      netbox/tenancy/tests/test_api.py
  87. 2 0
      netbox/tenancy/urls.py
  88. 2 1
      netbox/tenancy/views.py
  89. 2 0
      netbox/users/admin.py
  90. 2 0
      netbox/users/api/serializers.py
  91. 2 0
      netbox/users/forms.py
  92. 2 1
      netbox/users/models.py
  93. 2 0
      netbox/users/urls.py
  94. 6 4
      netbox/users/views.py
  95. 2 0
      netbox/utilities/api.py
  96. 2 0
      netbox/utilities/context_processors.py
  97. 6 4
      netbox/utilities/error_handlers.py
  98. 2 0
      netbox/utilities/fields.py
  99. 2 0
      netbox/utilities/filters.py
  100. 0 0
      netbox/utilities/forms.py

+ 2 - 0
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

+ 2 - 0
netbox/circuits/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 3 - 1
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

+ 2 - 0
netbox/circuits/apps.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.apps import AppConfig
 
 

+ 2 - 0
netbox/circuits/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 
 from django.db.models import Q

+ 2 - 0
netbox/circuits/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import forms
 from django.db.models import Count
 

+ 4 - 2
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'

+ 2 - 0
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

+ 2 - 1
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
 
 

+ 2 - 0
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
 

+ 2 - 0
netbox/circuits/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from . import views

+ 2 - 1
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
 

+ 2 - 0
netbox/dcim/api/exceptions.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework.exceptions import APIException
 
 

+ 2 - 0
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
 

+ 2 - 0
netbox/dcim/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 2 - 0
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

+ 2 - 0
netbox/dcim/apps.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.apps import AppConfig
 
 

+ 2 - 0
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

+ 2 - 0
netbox/dcim/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 from netaddr.core import AddrFormatError
 

+ 2 - 0
netbox/dcim/formfields.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from netaddr import EUI, AddrFormatError
 
 from django import forms

+ 5 - 4
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):

+ 13 - 13
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):
 

+ 2 - 1
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,

+ 2 - 0
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
 

+ 3 - 0
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 *
 

+ 3 - 0
netbox/dcim/tests/test_models.py

@@ -1,4 +1,7 @@
+from __future__ import unicode_literals
+
 from django.test import TestCase
+
 from dcim.models import *
 
 

+ 3 - 2
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
 

+ 22 - 22
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 <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
+            msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
+            msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
+            msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
+            msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
+            msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
+            msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
+            msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
+            msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
+            msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.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 <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
+            msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
                 interfaceconnection.interface_a.device.get_absolute_url(),
                 escape(interfaceconnection.interface_a.device),
                 escape(interfaceconnection.interface_a.name),

+ 2 - 0
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

+ 7 - 5
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
 

+ 3 - 1
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 (

+ 2 - 0
netbox/extras/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 2 - 0
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
 

+ 2 - 0
netbox/extras/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 
 from django.contrib.auth.models import User

+ 2 - 1
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,

+ 2 - 0
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

+ 6 - 5
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]:

+ 4 - 2
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

+ 2 - 0
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
 

+ 1 - 1
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,

+ 2 - 0
netbox/extras/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from extras import views

+ 2 - 0
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
 

+ 2 - 0
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
 

+ 2 - 0
netbox/ipam/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 2 - 0
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

+ 2 - 0
netbox/ipam/apps.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.apps import AppConfig
 
 

+ 2 - 0
netbox/ipam/fields.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from netaddr import IPNetwork
 
 from django.core.exceptions import ValidationError

+ 2 - 1
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,

+ 2 - 0
netbox/ipam/formfields.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from netaddr import IPNetwork, AddrFormatError
 
 from django import forms

+ 5 - 4
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):

+ 2 - 0
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
 

+ 5 - 4
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())

+ 2 - 1
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
 
 

+ 2 - 1
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
 

+ 3 - 1
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):

+ 2 - 0
netbox/ipam/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from . import views

+ 2 - 1
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,

+ 2 - 0
netbox/netbox/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import forms
 
 from utilities.forms import BootstrapMixin

+ 2 - 0
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

+ 3 - 2
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):
 

+ 1 - 0
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()

+ 4 - 2
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)})
 

+ 2 - 0
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
 

+ 2 - 0
netbox/secrets/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 4 - 3
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 Crypto.PublicKey import RSA
 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

+ 4 - 2
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

+ 3 - 0
netbox/secrets/exceptions.py

@@ -1,3 +1,6 @@
+from __future__ import unicode_literals
+
+
 class InvalidKey(Exception):
     """
     Raised when a provided key is invalid.

+ 2 - 0
netbox/secrets/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 
 from django.db.models import Q

+ 2 - 1
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
 
 

+ 2 - 0
netbox/secrets/hashers.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.contrib.auth.hashers import PBKDF2PasswordHasher
 
 

+ 4 - 3
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])

+ 5 - 3
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

+ 2 - 0
netbox/secrets/templatetags/secret_helpers.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import template
 
 

+ 2 - 0
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
 

+ 2 - 0
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

+ 2 - 0
netbox/secrets/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from . import views

+ 5 - 5
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,

+ 2 - 0
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

+ 2 - 0
netbox/tenancy/api/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from rest_framework import routers
 
 from . import views

+ 3 - 2
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
 

+ 2 - 0
netbox/tenancy/apps.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.apps import AppConfig
 
 

+ 2 - 0
netbox/tenancy/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 
 from django.db.models import Q

+ 2 - 0
netbox/tenancy/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import forms
 from django.db.models import Count
 

+ 2 - 0
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

+ 5 - 3
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

+ 2 - 0
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
 

+ 2 - 0
netbox/tenancy/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from . import views

+ 2 - 1
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
 

+ 2 - 0
netbox/users/admin.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import forms
 from django.contrib import admin
 

+ 2 - 0
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

+ 2 - 0
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
 

+ 2 - 1
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:

+ 2 - 0
netbox/users/urls.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf.urls import url
 
 from . import views

+ 6 - 4
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, {

+ 2 - 0
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
 

+ 2 - 0
netbox/utilities/context_processors.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf import settings as django_settings
 
 

+ 6 - 4
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'<a href="{}">{}</a>'.format(obj.get_absolute_url(), escape(obj)))
+            dependent_objects.append('<a href="{}">{}</a>'.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))

+ 2 - 0
netbox/utilities/fields.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.core.validators import RegexValidator
 from django.db import models
 

+ 2 - 0
netbox/utilities/filters.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import django_filters
 import itertools
 

+ 0 - 0
netbox/utilities/forms.py


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff