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, {