diff --git a/netbox/circuits/constants.py b/netbox/circuits/constants.py
index 03a981ea1..9e180e655 100644
--- a/netbox/circuits/constants.py
+++ b/netbox/circuits/constants.py
@@ -1,4 +1,3 @@
-
# Circuit statuses
CIRCUIT_STATUS_DEPROVISIONING = 0
CIRCUIT_STATUS_ACTIVE = 1
diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py
index 33005b830..088ec144a 100644
--- a/netbox/circuits/filters.py
+++ b/netbox/circuits/filters.py
@@ -5,8 +5,8 @@ from dcim.models import Region, Site
from extras.filters import CustomFieldFilterSet
from tenancy.filtersets import TenancyFilterSet
from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter
-from .constants import CIRCUIT_STATUS_CHOICES
-from .models import Provider, Circuit, CircuitTermination, CircuitType
+from .constants import *
+from .models import Circuit, CircuitTermination, CircuitType, Provider
class ProviderFilter(CustomFieldFilterSet):
diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py
index a64dfc11e..b4f6ac06c 100644
--- a/netbox/circuits/forms.py
+++ b/netbox/circuits/forms.py
@@ -3,14 +3,13 @@ from taggit.forms import TagField
from dcim.models import Region, Site
from extras.forms import AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm
-from tenancy.forms import TenancyForm
-from tenancy.forms import TenancyFilterForm
+from tenancy.forms import TenancyFilterForm, TenancyForm
from tenancy.models import Tenant
from utilities.forms import (
APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField,
FilterChoiceField, SmallTextarea, SlugField, StaticSelect2, StaticSelect2Multiple
)
-from .constants import CIRCUIT_STATUS_CHOICES
+from .constants import *
from .models import Circuit, CircuitTermination, CircuitType, Provider
diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py
index bf06959b0..8cf18617c 100644
--- a/netbox/circuits/models.py
+++ b/netbox/circuits/models.py
@@ -9,7 +9,7 @@ from dcim.models import CableTermination
from extras.models import CustomFieldModel, ObjectChange, TaggedItem
from utilities.models import ChangeLoggedModel
from utilities.utils import serialize_object
-from .constants import CIRCUIT_STATUS_ACTIVE, CIRCUIT_STATUS_CHOICES, TERM_SIDE_CHOICES
+from .constants import *
class Provider(ChangeLoggedModel, CustomFieldModel):
diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py
index 2bb442179..d67abdd1a 100644
--- a/netbox/circuits/tables.py
+++ b/netbox/circuits/tables.py
@@ -1,5 +1,4 @@
import django_tables2 as tables
-from django.utils.safestring import mark_safe
from django_tables2.utils import Accessor
from tenancy.tables import COL_TENANT
@@ -11,7 +10,8 @@ CIRCUITTYPE_ACTIONS = """
{% if perms.circuit.change_circuittype %}
-
+
{% endif %}
"""
diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py
index 2e0ba2d40..6654f677f 100644
--- a/netbox/dcim/forms.py
+++ b/netbox/dcim/forms.py
@@ -17,8 +17,7 @@ from extras.forms import (
AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm, LocalConfigContextFilterForm
)
from ipam.models import IPAddress, VLAN, VLANGroup
-from tenancy.forms import TenancyForm
-from tenancy.forms import TenancyFilterForm
+from tenancy.forms import TenancyFilterForm, TenancyForm
from tenancy.models import Tenant, TenantGroup
from utilities.forms import (
APISelect, APISelectMultiple, add_blank_choice, ArrayFieldSelectMultiple, BootstrapMixin, BulkEditForm,
@@ -57,6 +56,7 @@ def get_device_by_name_or_pk(name):
class InterfaceCommonForm:
+
def clean(self):
super().clean()
diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py
index 2c554c158..8f5393af2 100644
--- a/netbox/dcim/models.py
+++ b/netbox/dcim/models.py
@@ -9,7 +9,7 @@ from django.contrib.postgres.fields import ArrayField, JSONField
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
-from django.db.models import Case, Count, Q, Sum, When, F, Subquery, OuterRef
+from django.db.models import Count, Q, Sum
from django.urls import reverse
from mptt.models import MPTTModel, TreeForeignKey
from taggit.managers import TaggableManager
diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py
index 7bf1c0744..2cdb79f8b 100644
--- a/netbox/extras/api/customfields.py
+++ b/netbox/extras/api/customfields.py
@@ -5,7 +5,7 @@ from django.db import transaction
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
-from extras.constants import CF_TYPE_BOOLEAN, CF_TYPE_DATE, CF_TYPE_INTEGER, CF_TYPE_SELECT
+from extras.constants import *
from extras.models import CustomField, CustomFieldChoice, CustomFieldValue
from utilities.api import ValidatedModelSerializer
diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py
index 2545b34d5..d9439563b 100644
--- a/netbox/extras/constants.py
+++ b/netbox/extras/constants.py
@@ -1,4 +1,3 @@
-
# Models which support custom fields
CUSTOMFIELD_MODELS = [
'circuits.circuit',
diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py
index 66a7fe637..a45202052 100644
--- a/netbox/extras/filters.py
+++ b/netbox/extras/filters.py
@@ -4,7 +4,7 @@ from django.db.models import Q
from dcim.models import DeviceRole, Platform, Region, Site
from tenancy.models import Tenant, TenantGroup
-from .constants import CF_FILTER_DISABLED, CF_FILTER_EXACT, CF_TYPE_BOOLEAN, CF_TYPE_SELECT
+from .constants import *
from .models import ConfigContext, CustomField, Graph, ExportTemplate, ObjectChange, Tag, TopologyMap
diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py
index 61bf2d7f3..071345913 100644
--- a/netbox/extras/forms.py
+++ b/netbox/extras/forms.py
@@ -8,16 +8,12 @@ from taggit.forms import TagField
from dcim.models import DeviceRole, Platform, Region, Site
from tenancy.models import Tenant, TenantGroup
-from utilities.constants import COLOR_CHOICES
from utilities.forms import (
add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorSelect,
CommentField, ContentTypeSelect, FilterChoiceField, LaxURLField, JSONField, SlugField, StaticSelect2,
BOOLEAN_WITH_BLANK_CHOICES,
)
-from .constants import (
- CF_FILTER_DISABLED, CF_TYPE_BOOLEAN, CF_TYPE_DATE, CF_TYPE_INTEGER, CF_TYPE_SELECT, CF_TYPE_URL,
- OBJECTCHANGE_ACTION_CHOICES,
-)
+from .constants import *
from .models import ConfigContext, CustomField, CustomFieldValue, ImageAttachment, ObjectChange, Tag
diff --git a/netbox/extras/middleware.py b/netbox/extras/middleware.py
index 5083af8ec..b0203309b 100644
--- a/netbox/extras/middleware.py
+++ b/netbox/extras/middleware.py
@@ -9,9 +9,7 @@ from django.utils import timezone
from django.utils.functional import curry
from django_prometheus.models import model_deletes, model_inserts, model_updates
-from .constants import (
- OBJECTCHANGE_ACTION_CREATE, OBJECTCHANGE_ACTION_DELETE, OBJECTCHANGE_ACTION_UPDATE,
-)
+from .constants import *
from .models import ObjectChange
from .signals import purge_changelog
from .webhooks import enqueue_webhooks
diff --git a/netbox/extras/models.py b/netbox/extras/models.py
index 04caf3376..c49192a93 100644
--- a/netbox/extras/models.py
+++ b/netbox/extras/models.py
@@ -1,6 +1,7 @@
from collections import OrderedDict
from datetime import date
+import graphviz
from django.contrib.auth.models import User
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
@@ -11,7 +12,6 @@ from django.db.models import F, Q
from django.http import HttpResponse
from django.template import Template, Context
from django.urls import reverse
-import graphviz
from jinja2 import Environment
from taggit.models import TagBase, GenericTaggedItemBase
diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py
index fc41b45f9..9027d6a4a 100644
--- a/netbox/extras/reports.py
+++ b/netbox/extras/reports.py
@@ -6,7 +6,7 @@ from collections import OrderedDict
from django.conf import settings
from django.utils import timezone
-from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_LEVEL_CODES, LOG_SUCCESS, LOG_WARNING
+from .constants import *
from .models import ReportResult
diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py
index 4f1133603..2ce365609 100644
--- a/netbox/extras/scripts.py
+++ b/netbox/extras/scripts.py
@@ -1,12 +1,12 @@
-from collections import OrderedDict
import inspect
import json
import os
import pkgutil
import time
import traceback
-import yaml
+from collections import OrderedDict
+import yaml
from django import forms
from django.conf import settings
from django.core.validators import RegexValidator
@@ -21,7 +21,6 @@ from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_SUCCESS, LOG_WARN
from .forms import ScriptForm
from .signals import purge_changelog
-
__all__ = [
'BaseScript',
'BooleanVar',
diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py
index 46090fb2e..ac82bbb31 100644
--- a/netbox/extras/webhooks.py
+++ b/netbox/extras/webhooks.py
@@ -3,10 +3,9 @@ import datetime
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
-from extras.constants import OBJECTCHANGE_ACTION_CREATE, OBJECTCHANGE_ACTION_DELETE, OBJECTCHANGE_ACTION_UPDATE
from extras.models import Webhook
from utilities.api import get_serializer_for_model
-from .constants import WEBHOOK_MODELS
+from .constants import *
def enqueue_webhooks(instance, user, request_id, action):
diff --git a/netbox/extras/webhooks_worker.py b/netbox/extras/webhooks_worker.py
index 45d996f9b..8712092d4 100644
--- a/netbox/extras/webhooks_worker.py
+++ b/netbox/extras/webhooks_worker.py
@@ -6,7 +6,7 @@ import requests
from django_rq import job
from rest_framework.utils.encoders import JSONEncoder
-from extras.constants import WEBHOOK_CT_JSON, WEBHOOK_CT_X_WWW_FORM_ENCODED, OBJECTCHANGE_ACTION_CHOICES
+from .constants import *
@job('default')
diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py
index eeb17eddd..e2fd1ca01 100644
--- a/netbox/ipam/constants.py
+++ b/netbox/ipam/constants.py
@@ -1,4 +1,3 @@
-
# IP address families
AF_CHOICES = (
(4, 'IPv4'),
diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py
index da9362dc9..c57006b27 100644
--- a/netbox/ipam/filters.py
+++ b/netbox/ipam/filters.py
@@ -9,7 +9,7 @@ from extras.filters import CustomFieldFilterSet
from tenancy.filtersets import TenancyFilterSet
from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
from virtualization.models import VirtualMachine
-from .constants import IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES
+from .constants import *
from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py
index 7a79caaa0..002d2a72a 100644
--- a/netbox/ipam/forms.py
+++ b/netbox/ipam/forms.py
@@ -5,8 +5,7 @@ from taggit.forms import TagField
from dcim.models import Site, Rack, Device, Interface
from extras.forms import AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm
-from tenancy.forms import TenancyForm
-from tenancy.forms import TenancyFilterForm
+from tenancy.forms import TenancyFilterForm, TenancyForm
from tenancy.models import Tenant
from utilities.forms import (
add_blank_choice, APISelect, APISelectMultiple, BootstrapMixin, BulkEditNullBooleanSelect, ChainedModelChoiceField,
@@ -14,9 +13,7 @@ from utilities.forms import (
StaticSelect2, StaticSelect2Multiple, BOOLEAN_WITH_BLANK_CHOICES
)
from virtualization.models import VirtualMachine
-from .constants import (
- IP_PROTOCOL_CHOICES, IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES,
-)
+from .constants import *
from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
IP_FAMILY_CHOICES = [
diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py
index e1de38a51..54825d9de 100644
--- a/netbox/ipam/lookups.py
+++ b/netbox/ipam/lookups.py
@@ -1,5 +1,4 @@
-from django.db.models import Lookup, Transform, IntegerField
-from django.db.models import lookups
+from django.db.models import IntegerField, Lookup, Transform, lookups
class NetFieldDecoratorMixin(object):
diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py
index c5b532774..4a4d6ad34 100644
--- a/netbox/ipam/views.py
+++ b/netbox/ipam/views.py
@@ -13,7 +13,7 @@ from utilities.views import (
)
from virtualization.models import VirtualMachine
from . import filters, forms, tables
-from .constants import IPADDRESS_ROLE_ANYCAST, PREFIX_STATUS_ACTIVE, PREFIX_STATUS_DEPRECATED, PREFIX_STATUS_RESERVED
+from .constants import *
from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
@@ -291,6 +291,7 @@ class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class AggregateListView(PermissionRequiredMixin, ObjectListView):
permission_required = 'ipam.view_aggregate'
+ # TODO: Replace raw SQL
queryset = Aggregate.objects.prefetch_related('rir').extra(select={
'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
})
diff --git a/netbox/secrets/exceptions.py b/netbox/secrets/exceptions.py
index 11433d41e..c163e5907 100644
--- a/netbox/secrets/exceptions.py
+++ b/netbox/secrets/exceptions.py
@@ -1,4 +1,3 @@
-
class InvalidKey(Exception):
"""
Raised when a provided key is invalid.
diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py
index 8980777b0..eb656a894 100644
--- a/netbox/tenancy/filtersets.py
+++ b/netbox/tenancy/filtersets.py
@@ -1,4 +1,5 @@
import django_filters
+
from .models import Tenant, TenantGroup
diff --git a/netbox/users/admin.py b/netbox/users/admin.py
index fdc02d62e..4549945bf 100644
--- a/netbox/users/admin.py
+++ b/netbox/users/admin.py
@@ -6,7 +6,6 @@ from django.contrib.auth.models import User
from netbox.admin import admin_site
from .models import Token
-
# Unregister the built-in UserAdmin so that we can use our custom admin view below
admin_site.unregister(User)
diff --git a/netbox/utilities/custom_inspectors.py b/netbox/utilities/custom_inspectors.py
index 79d79d6d4..9662612f9 100644
--- a/netbox/utilities/custom_inspectors.py
+++ b/netbox/utilities/custom_inspectors.py
@@ -6,10 +6,9 @@ from rest_framework.relations import ManyRelatedField
from taggit_serializer.serializers import TagListSerializerField
from dcim.api.serializers import InterfaceSerializer as DeviceInterfaceSerializer
-from virtualization.api.serializers import InterfaceSerializer as VirtualMachineInterfaceSerializer
from extras.api.customfields import CustomFieldsSerializer
from utilities.api import ChoiceField, SerializedPKRelatedField, WritableNestedSerializer
-
+from virtualization.api.serializers import InterfaceSerializer as VirtualMachineInterfaceSerializer
# this might be ugly, but it limits drf_yasg-specific code to this file
DeviceInterfaceSerializer.Meta.ref_name = 'DeviceInterface'
diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py
index 876581dd4..e75ab4d1c 100644
--- a/netbox/utilities/forms.py
+++ b/netbox/utilities/forms.py
@@ -6,8 +6,6 @@ from io import StringIO
from django import forms
from django.conf import settings
from django.contrib.postgres.forms.jsonb import JSONField as _JSONField, InvalidJSONInput
-from django.db.models import Count
-from django.urls import reverse_lazy
from mptt.forms import TreeNodeMultipleChoiceField
from .constants import *
diff --git a/netbox/utilities/middleware.py b/netbox/utilities/middleware.py
index 360fb29fc..a44273ab0 100644
--- a/netbox/utilities/middleware.py
+++ b/netbox/utilities/middleware.py
@@ -1,8 +1,9 @@
+from urllib import parse
+
from django.conf import settings
from django.db import ProgrammingError
from django.http import Http404, HttpResponseRedirect
from django.urls import reverse
-import urllib
from .views import server_error
@@ -26,7 +27,7 @@ class LoginRequiredMiddleware(object):
return HttpResponseRedirect(
'{}?next={}'.format(
settings.LOGIN_URL,
- urllib.parse.quote(request.get_full_path_info())
+ parse.quote(request.get_full_path_info())
)
)
return self.get_response(request)
diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py
index 4644c432e..6c29dd8cc 100644
--- a/netbox/utilities/utils.py
+++ b/netbox/utilities/utils.py
@@ -1,7 +1,6 @@
-from collections import OrderedDict
-
import datetime
import json
+from collections import OrderedDict
from django.core.serializers import serialize
from django.db.models import Count, OuterRef, Subquery
diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py
index 44b489d43..8365d6f91 100644
--- a/netbox/virtualization/filters.py
+++ b/netbox/virtualization/filters.py
@@ -9,7 +9,7 @@ from tenancy.filtersets import TenancyFilterSet
from utilities.filters import (
MultiValueMACAddressFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
)
-from .constants import VM_STATUS_CHOICES
+from .constants import *
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py
index d3fc4b83b..c8bf7c155 100644
--- a/netbox/virtualization/forms.py
+++ b/netbox/virtualization/forms.py
@@ -7,8 +7,7 @@ from dcim.forms import INTERFACE_MODE_HELP_TEXT
from dcim.models import Device, DeviceRole, Interface, Platform, Rack, Region, Site
from extras.forms import AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldForm, CustomFieldFilterForm
from ipam.models import IPAddress, VLANGroup, VLAN
-from tenancy.forms import TenancyForm
-from tenancy.forms import TenancyFilterForm
+from tenancy.forms import TenancyFilterForm, TenancyForm
from tenancy.models import Tenant
from utilities.forms import (
add_blank_choice, APISelect, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
@@ -16,7 +15,7 @@ from utilities.forms import (
ConfirmationForm, CSVChoiceField, ExpandableNameField, FilterChoiceField, JSONField, SlugField,
SmallTextarea, StaticSelect2, StaticSelect2Multiple
)
-from .constants import VM_STATUS_CHOICES
+from .constants import *
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
VIFACE_TYPE_CHOICES = (
diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py
index 2ef782dfd..57351b7f6 100644
--- a/netbox/virtualization/models.py
+++ b/netbox/virtualization/models.py
@@ -8,7 +8,7 @@ from taggit.managers import TaggableManager
from dcim.models import Device
from extras.models import ConfigContextModel, CustomFieldModel, TaggedItem
from utilities.models import ChangeLoggedModel
-from .constants import DEVICE_STATUS_ACTIVE, VM_STATUS_CHOICES, VM_STATUS_CLASSES
+from .constants import *
#