Fixes #21407: Enable I (isort) and stabilize import ordering (#21458)

- Adopt Ruff `I` (isort) rules for consistent import sorting
- Add two `# isort: split` boundaries to keep required imports pinned
  in `__init__.py` modules
This commit is contained in:
Martin Hauser
2026-02-18 17:41:51 +01:00
committed by GitHub
parent 7300104cea
commit 945e7ade0a
438 changed files with 1067 additions and 527 deletions

View File

@@ -1,6 +1,10 @@
from django.contrib.contenttypes.fields import GenericForeignKey
from django.core.exceptions import (
FieldDoesNotExist, FieldError, MultipleObjectsReturned, ObjectDoesNotExist, ValidationError,
FieldDoesNotExist,
FieldError,
MultipleObjectsReturned,
ObjectDoesNotExist,
ValidationError,
)
from django.db.models.fields.related import ManyToOneRel, RelatedField
from django.urls import reverse
@@ -13,6 +17,7 @@ from rest_framework.views import get_view_name as drf_get_view_name
from extras.constants import HTTP_CONTENT_TYPE_JSON
from netbox.api.exceptions import GraphQLTypeNotFound, SerializerNotFound
from netbox.api.fields import RelatedObjectCountField
from .query import count_related, dict_to_filter_params
from .string import title

View File

@@ -1,8 +1,9 @@
from django.apps import apps
from django.db.models import F, Count, OuterRef, Subquery
from django.db.models import Count, F, OuterRef, Subquery
from django.db.models.signals import post_delete, post_save, pre_delete
from netbox.registry import registry
from .fields import CounterCacheField

View File

@@ -2,6 +2,7 @@ from django import forms
from django.contrib.postgres.forms import SimpleArrayField
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from utilities.data import ranges_to_string, string_to_ranges
from ..utils import parse_numeric_range

View File

@@ -1,8 +1,8 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, FieldError
from django.core.exceptions import FieldError, MultipleObjectsReturned, ObjectDoesNotExist
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
from utilities.choices import unpack_grouped_choices
from utilities.object_types import object_type_identifier

View File

@@ -3,10 +3,11 @@ import json
from django import forms
from django.conf import settings
from django.db.models import Count
from django.forms.fields import JSONField as _JSONField, InvalidJSONInput
from django.forms.fields import InvalidJSONInput
from django.forms.fields import JSONField as _JSONField
from django.templatetags.static import static
from django.utils.translation import gettext_lazy as _
from netaddr import AddrFormatError, EUI
from netaddr import EUI, AddrFormatError
from utilities.forms import widgets
from utilities.validators import EnhancedURLValidator

View File

@@ -6,6 +6,7 @@ from django.utils.translation import gettext as _
from utilities.choices import unpack_grouped_choices
from utilities.querysets import RestrictedQuerySet
from .constants import *
__all__ = (

View File

@@ -1,6 +1,7 @@
from django import forms
from netbox.choices import ColorChoices
from ..utils import add_blank_choice
__all__ = (

View File

@@ -1,6 +1,7 @@
from urllib.parse import urlsplit
from django.http import HttpResponse
from django.urls import reverse
from urllib.parse import urlsplit
__all__ = (
'htmx_current_url',

View File

@@ -1,7 +1,7 @@
from django.db.models import Manager
from mptt.managers import TreeManager as TreeManager_
from mptt.querysets import TreeQuerySet as TreeQuerySet_
from django.db.models import Manager
from .querysets import RestrictedQuerySet
__all__ = (

View File

@@ -1,4 +1,4 @@
from django.core.paginator import Paginator, Page
from django.core.paginator import Page, Paginator
from netbox.config import get_config

View File

@@ -1,5 +1,5 @@
from django.conf import settings
from django.apps import apps
from django.conf import settings
from django.db.models import Q
from django.utils.translation import gettext_lazy as _

View File

@@ -1,6 +1,7 @@
from urllib.parse import urlparse
from django.conf import settings
from django.utils.module_loading import import_string
from urllib.parse import urlparse
__all__ = (
'DefaultProxyRouter',

View File

@@ -1,4 +1,4 @@
from django.db.models import Count, OuterRef, Subquery, QuerySet
from django.db.models import Count, OuterRef, QuerySet, Subquery
from django.db.models.functions import Coalesce
from utilities.mptt import TreeManager

View File

@@ -2,6 +2,7 @@ from urllib.parse import urlencode
from django.http import QueryDict
from django.utils.datastructures import MultiValueDict
from netbox.models.features import CloningMixin
__all__ = (

View File

@@ -7,6 +7,7 @@ from django.utils.translation import gettext_lazy as _
from netaddr import AddrFormatError, IPAddress
from netbox.registry import registry
from .constants import HTTP_REQUEST_META_SAFE_COPY
__all__ = (

View File

@@ -1,5 +1,6 @@
from django.contrib.postgres.fields import ArrayField
from django.core.serializers.json import Deserializer, Serializer as Serializer_ # noqa: F401
from django.core.serializers.json import Deserializer # noqa: F401
from django.core.serializers.json import Serializer as Serializer_
from django.utils.encoding import is_protected_type
# NOTE: Module must contain both Serializer and Deserializer

View File

@@ -1,10 +1,10 @@
import logging
from urllib.parse import urlparse
from urllib3 import PoolManager, HTTPConnectionPool, HTTPSConnectionPool
from urllib3.connection import HTTPConnection, HTTPSConnection
from .constants import HTTP_PROXY_SOCK_RDNS_SCHEMAS
from urllib3 import HTTPConnectionPool, HTTPSConnectionPool, PoolManager
from urllib3.connection import HTTPConnection, HTTPSConnection
from .constants import HTTP_PROXY_SOCK_RDNS_SCHEMAS
logger = logging.getLogger('netbox.utilities')

View File

@@ -1,5 +1,5 @@
import logging
from urllib.parse import urlparse, urlunparse, parse_qs, urlencode
from urllib.parse import parse_qs, urlencode, urlparse, urlunparse
from django import template
from django.templatetags.static import static

View File

@@ -1,5 +1,5 @@
import json
from typing import Dict, Any
from typing import Any, Dict
from urllib.parse import quote
from django import template
@@ -8,10 +8,10 @@ from django.utils.html import conditional_escape
from django.utils.translation import gettext_lazy as _
from core.models import ObjectType
from utilities.forms import get_selected_values, TableConfigForm
from utilities.forms.mixins import FORM_FIELD_LOOKUPS
from utilities.views import get_viewname, get_action_url
from netbox.settings import DISK_BASE_UNIT, RAM_BASE_UNIT
from utilities.forms import TableConfigForm, get_selected_values
from utilities.forms.mixins import FORM_FIELD_LOOKUPS
from utilities.views import get_action_url, get_viewname
__all__ = (
'action_url',

View File

@@ -20,6 +20,7 @@ from netbox.models.features import ChangeLoggingMixin
from users.constants import TOKEN_PREFIX
from users.models import ObjectPermission, Token, User
from utilities.api import get_graphql_type_for_model
from .base import ModelTestCase
from .utils import disable_logging, disable_warnings, get_random_string

View File

@@ -6,9 +6,10 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import ArrayField, RangeField
from django.core.exceptions import FieldDoesNotExist
from django.db import transaction
from django.db.models import ManyToManyField, ManyToManyRel, JSONField
from django.db.models import JSONField, ManyToManyField, ManyToManyRel
from django.forms.models import model_to_dict
from django.test import Client, TestCase as _TestCase
from django.test import Client
from django.test import TestCase as _TestCase
from netaddr import IPNetwork
from taggit.managers import TaggableManager
@@ -17,6 +18,7 @@ from users.models import ObjectPermission, User
from utilities.data import ranges_to_string
from utilities.object_types import object_type_identifier
from utilities.permissions import resolve_permission_type
from .utils import DUMMY_CF_DATA, extract_form_failures
__all__ = (

View File

@@ -13,6 +13,7 @@ from core.models import ObjectChange, ObjectType
from netbox.choices import CSVDelimiterChoices, ImportFormatChoices
from netbox.models.features import ChangeLoggingMixin, CustomFieldsMixin
from users.models import ObjectPermission
from .base import ModelTestCase
from .utils import add_custom_field_data, disable_warnings, get_random_string, post_data

View File

@@ -1,5 +1,6 @@
from django.db.backends.postgresql.psycopg_any import NumericRange
from django.test import TestCase
from utilities.data import (
check_ranges_overlap,
get_config_value_ci,

View File

@@ -9,13 +9,13 @@ import dcim.filtersets # noqa: F401 - Import to register Device filterset
from dcim.forms.filtersets import DeviceFilterForm
from dcim.models import Device
from netbox.filtersets import BaseFilterSet
from utilities.filtersets import register_filterset
from tenancy.models import Tenant
from users.models import User
from utilities.filtersets import register_filterset
from utilities.forms.fields import TagFilterField
from utilities.forms.mixins import FilterModifierMixin
from utilities.forms.widgets import FilterModifierWidget
from utilities.templatetags.helpers import applied_filters
from tenancy.models import Tenant
# Test model for FilterModifierMixin tests

View File

@@ -7,20 +7,34 @@ from taggit.managers import TaggableManager
from dcim.choices import *
from dcim.fields import MACAddressField
from dcim.filtersets import DeviceFilterSet, SiteFilterSet, InterfaceFilterSet
from dcim.filtersets import DeviceFilterSet, InterfaceFilterSet, SiteFilterSet
from dcim.models import (
Device, DeviceRole, DeviceType, Interface, MACAddress, Manufacturer, Platform, Rack, Region, Site
Device,
DeviceRole,
DeviceType,
Interface,
MACAddress,
Manufacturer,
Platform,
Rack,
Region,
Site,
)
from extras.filters import TagFilter
from extras.models import TaggedItem
from ipam.filtersets import ASNFilterSet
from ipam.models import RIR, ASN
from ipam.models import ASN, RIR
from netbox.filtersets import BaseFilterSet
from wireless.choices import WirelessRoleChoices
from utilities.filters import (
MultiValueCharFilter, MultiValueDateFilter, MultiValueDateTimeFilter, MultiValueMACAddressFilter,
MultiValueNumberFilter, MultiValueTimeFilter, TreeNodeMultipleChoiceFilter,
MultiValueCharFilter,
MultiValueDateFilter,
MultiValueDateTimeFilter,
MultiValueMACAddressFilter,
MultiValueNumberFilter,
MultiValueTimeFilter,
TreeNodeMultipleChoiceFilter,
)
from wireless.choices import WirelessRoleChoices
class TreeNodeMultipleChoiceFilterTest(TestCase):

View File

@@ -6,7 +6,7 @@ from netbox.choices import ImportFormatChoices
from utilities.forms.bulk_import import BulkImportForm
from utilities.forms.fields.csv import CSVSelectWidget
from utilities.forms.forms import BulkRenameForm
from utilities.forms.utils import get_field_value, expand_alphanumeric_pattern, expand_ipaddress_pattern
from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipaddress_pattern, get_field_value
from utilities.forms.widgets.select import AvailableOptions, SelectedOptions

View File

@@ -1,6 +1,6 @@
from django.test import TestCase, RequestFactory
from django.test import RequestFactory, TestCase
from netaddr import IPAddress
from utilities.request import get_client_ip

View File

@@ -17,6 +17,7 @@ from netbox.registry import registry
from utilities.relations import get_related_models
from utilities.request import safe_for_redirect
from utilities.string import title
from .permissions import resolve_permission
__all__ = (