Просмотр исходного кода

chore(ruff): Enable I (isort) and stabilize import ordering

- Adopt Ruff `I` (isort) rules for consistent import sorting
- Add two `# isort: split` boundaries to keep required imports pinned
  in `__init__.py` modules
Martin Hauser 22 часов назад
Родитель
Сommit
e0f12dffa9
100 измененных файлов с 295 добавлено и 121 удалено
  1. 1 0
      netbox/account/urls.py
  2. 5 4
      netbox/account/views.py
  3. 1 1
      netbox/circuits/api/serializers.py
  4. 14 4
      netbox/circuits/api/serializers_/circuits.py
  5. 1 0
      netbox/circuits/api/serializers_/providers.py
  6. 1 1
      netbox/circuits/api/urls.py
  7. 1 0
      netbox/circuits/api/views.py
  8. 2 1
      netbox/circuits/apps.py
  9. 1 1
      netbox/circuits/choices.py
  10. 0 1
      netbox/circuits/constants.py
  11. 5 1
      netbox/circuits/filtersets.py
  12. 8 2
      netbox/circuits/forms/bulk_edit.py
  13. 5 2
      netbox/circuits/forms/filtersets.py
  14. 7 2
      netbox/circuits/forms/model_forms.py
  15. 1 1
      netbox/circuits/graphql/filter_mixins.py
  16. 3 2
      netbox/circuits/graphql/filters.py
  17. 2 1
      netbox/circuits/graphql/types.py
  18. 3 2
      netbox/circuits/migrations/0001_squashed.py
  19. 1 1
      netbox/circuits/migrations/0002_squashed_0029.py
  20. 1 0
      netbox/circuits/migrations/0043_circuittype_color.py
  21. 2 1
      netbox/circuits/migrations/0044_circuit_groups.py
  22. 8 2
      netbox/circuits/models/circuits.py
  23. 1 0
      netbox/circuits/models/virtual_circuits.py
  24. 1 0
      netbox/circuits/search.py
  25. 1 0
      netbox/circuits/signals.py
  26. 1 0
      netbox/circuits/tables/circuits.py
  27. 10 1
      netbox/circuits/tests/test_filtersets.py
  28. 1 1
      netbox/circuits/tests/test_tables.py
  29. 1 0
      netbox/circuits/urls.py
  30. 2 1
      netbox/circuits/views.py
  31. 6 2
      netbox/core/api/schema.py
  32. 1 0
      netbox/core/api/urls.py
  33. 1 0
      netbox/core/api/views.py
  34. 3 2
      netbox/core/apps.py
  35. 2 2
      netbox/core/checks.py
  36. 1 1
      netbox/core/choices.py
  37. 1 0
      netbox/core/data_backends.py
  38. 0 1
      netbox/core/dataclasses.py
  39. 1 0
      netbox/core/filtersets.py
  40. 4 1
      netbox/core/forms/filtersets.py
  41. 1 1
      netbox/core/forms/model_forms.py
  42. 1 1
      netbox/core/graphql/filter_mixins.py
  43. 2 1
      netbox/core/graphql/filters.py
  44. 1 1
      netbox/core/graphql/mixins.py
  45. 1 0
      netbox/core/graphql/types.py
  46. 1 0
      netbox/core/jobs.py
  47. 0 1
      netbox/core/management/commands/rqworker.py
  48. 2 1
      netbox/core/migrations/0008_contenttype_proxy.py
  49. 2 1
      netbox/core/models/__init__.py
  50. 1 2
      netbox/core/models/change_logging.py
  51. 2 1
      netbox/core/models/config.py
  52. 1 0
      netbox/core/models/data.py
  53. 3 2
      netbox/core/models/files.py
  54. 1 0
      netbox/core/search.py
  55. 4 3
      netbox/core/signals.py
  56. 1 1
      netbox/core/tables/__init__.py
  57. 1 0
      netbox/core/tables/change_logging.py
  58. 2 1
      netbox/core/tables/data.py
  59. 1 1
      netbox/core/tables/jobs.py
  60. 1 0
      netbox/core/tables/plugins.py
  61. 6 4
      netbox/core/tests/test_api.py
  62. 10 1
      netbox/core/tests/test_changelog.py
  63. 1 0
      netbox/core/tests/test_filtersets.py
  64. 3 3
      netbox/core/tests/test_models.py
  65. 1 0
      netbox/core/tests/test_openapi_schema.py
  66. 2 1
      netbox/core/tests/test_views.py
  67. 1 0
      netbox/core/urls.py
  68. 3 2
      netbox/core/utils.py
  69. 9 7
      netbox/core/views.py
  70. 8 8
      netbox/dcim/api/serializers.py
  71. 4 1
      netbox/dcim/api/serializers_/cables.py
  72. 13 2
      netbox/dcim/api/serializers_/device_components.py
  73. 1 0
      netbox/dcim/api/serializers_/devices.py
  74. 11 2
      netbox/dcim/api/serializers_/devicetype_components.py
  75. 1 0
      netbox/dcim/api/serializers_/devicetypes.py
  76. 1 1
      netbox/dcim/api/serializers_/nested.py
  77. 1 0
      netbox/dcim/api/serializers_/platforms.py
  78. 1 0
      netbox/dcim/api/serializers_/power.py
  79. 1 0
      netbox/dcim/api/serializers_/racks.py
  80. 1 0
      netbox/dcim/api/serializers_/rackunits.py
  81. 1 0
      netbox/dcim/api/serializers_/roles.py
  82. 1 0
      netbox/dcim/api/serializers_/sites.py
  83. 1 0
      netbox/dcim/api/serializers_/virtualchassis.py
  84. 1 1
      netbox/dcim/api/urls.py
  85. 3 2
      netbox/dcim/api/views.py
  86. 2 1
      netbox/dcim/apps.py
  87. 2 1
      netbox/dcim/base_filtersets.py
  88. 1 1
      netbox/dcim/choices.py
  89. 1 1
      netbox/dcim/fields.py
  90. 16 5
      netbox/dcim/filtersets.py
  91. 4 4
      netbox/dcim/forms/__init__.py
  92. 1 0
      netbox/dcim/forms/bulk_create.py
  93. 5 2
      netbox/dcim/forms/bulk_edit.py
  94. 10 2
      netbox/dcim/forms/bulk_import.py
  95. 1 0
      netbox/dcim/forms/connections.py
  96. 3 1
      netbox/dcim/forms/filtersets.py
  97. 4 2
      netbox/dcim/forms/mixins.py
  98. 13 3
      netbox/dcim/forms/model_forms.py
  99. 1 0
      netbox/dcim/forms/object_create.py
  100. 5 3
      netbox/dcim/graphql/filter_mixins.py

+ 1 - 0
netbox/account/urls.py

@@ -1,6 +1,7 @@
 from django.urls import include, path
 
 from utilities.urls import get_model_urls
+
 from . import views
 
 app_name = 'account'

+ 5 - 4
netbox/account/views.py

@@ -2,14 +2,15 @@ import logging
 
 from django.conf import settings
 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 import login as auth_login
+from django.contrib.auth import logout as auth_logout
+from django.contrib.auth import update_session_auth_hash
 from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.contrib.auth.models import update_last_login
 from django.contrib.auth.signals import user_logged_in
 from django.http import HttpResponseRedirect
-from django.shortcuts import get_object_or_404, redirect
-from django.shortcuts import render, resolve_url
+from django.shortcuts import get_object_or_404, redirect, render, resolve_url
 from django.urls import reverse
 from django.utils.decorators import method_decorator
 from django.utils.http import urlencode
@@ -35,11 +36,11 @@ from utilities.request import safe_for_redirect
 from utilities.string import remove_linebreaks
 from utilities.views import register_model_view
 
-
 #
 # Login/logout
 #
 
+
 class LoginView(View):
     """
     Perform user authentication via the web UI.

+ 1 - 1
netbox/circuits/api/serializers.py

@@ -1,2 +1,2 @@
-from .serializers_.providers import *
 from .serializers_.circuits import *
+from .serializers_.providers import *

+ 14 - 4
netbox/circuits/api/serializers_/circuits.py

@@ -4,18 +4,28 @@ from rest_framework import serializers
 from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices
 from circuits.constants import CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, CIRCUIT_TERMINATION_TERMINATION_TYPES
 from circuits.models import (
-    Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType, VirtualCircuit,
-    VirtualCircuitTermination, VirtualCircuitType,
+    Circuit,
+    CircuitGroup,
+    CircuitGroupAssignment,
+    CircuitTermination,
+    CircuitType,
+    VirtualCircuit,
+    VirtualCircuitTermination,
+    VirtualCircuitType,
 )
-from dcim.api.serializers_.device_components import InterfaceSerializer
 from dcim.api.serializers_.cables import CabledObjectSerializer
+from dcim.api.serializers_.device_components import InterfaceSerializer
 from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
 from netbox.api.gfk_fields import GFKSerializerField
 from netbox.api.serializers import (
-    NetBoxModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer, WritableNestedSerializer,
+    NetBoxModelSerializer,
+    OrganizationalModelSerializer,
+    PrimaryModelSerializer,
+    WritableNestedSerializer,
 )
 from netbox.choices import DistanceUnitChoices
 from tenancy.api.serializers_.tenants import TenantSerializer
+
 from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer
 
 __all__ = (

+ 1 - 0
netbox/circuits/api/serializers_/providers.py

@@ -5,6 +5,7 @@ from ipam.api.serializers_.asns import ASNSerializer
 from ipam.models import ASN
 from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField
 from netbox.api.serializers import PrimaryModelSerializer
+
 from .nested import NestedProviderAccountSerializer
 
 __all__ = (

+ 1 - 1
netbox/circuits/api/urls.py

@@ -1,6 +1,6 @@
 from netbox.api.routers import NetBoxRouter
-from . import views
 
+from . import views
 
 router = NetBoxRouter()
 router.APIRootView = views.CircuitsRootView

+ 1 - 0
netbox/circuits/api/views.py

@@ -4,6 +4,7 @@ from circuits import filtersets
 from circuits.models import *
 from dcim.api.views import PassThroughPortMixin
 from netbox.api.viewsets import NetBoxModelViewSet
+
 from . import serializers
 
 

+ 2 - 1
netbox/circuits/apps.py

@@ -9,7 +9,8 @@ class CircuitsConfig(AppConfig):
 
     def ready(self):
         from netbox.models.features import register_models
-        from . import signals, search  # noqa: F401
+
+        from . import search, signals  # noqa: F401
         from .models import CircuitTermination
 
         # Register models

+ 1 - 1
netbox/circuits/choices.py

@@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _
 
 from utilities.choices import ChoiceSet
 
-
 #
 # Circuits
 #
 
+
 class CircuitStatusChoices(ChoiceSet):
     key = 'Circuit.status'
 

+ 0 - 1
netbox/circuits/constants.py

@@ -1,6 +1,5 @@
 from django.db.models import Q
 
-
 # models values for ContentTypes which may be CircuitTermination termination types
 CIRCUIT_TERMINATION_TERMINATION_TYPES = (
     'region', 'sitegroup', 'site', 'location', 'providernetwork',

+ 5 - 1
netbox/circuits/filtersets.py

@@ -9,9 +9,13 @@ from ipam.models import ASN
 from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet
 from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet
 from utilities.filters import (
-    MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter, TreeNodeMultipleChoiceFilter,
+    MultiValueCharFilter,
+    MultiValueContentTypeFilter,
+    MultiValueNumberFilter,
+    TreeNodeMultipleChoiceFilter,
 )
 from utilities.filtersets import register_filterset
+
 from .choices import *
 from .models import *
 

+ 8 - 2
netbox/circuits/forms/bulk_edit.py

@@ -4,7 +4,10 @@ from django.core.exceptions import ObjectDoesNotExist
 from django.utils.translation import gettext_lazy as _
 
 from circuits.choices import (
-    CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices,
+    CircuitCommitRateChoices,
+    CircuitPriorityChoices,
+    CircuitStatusChoices,
+    VirtualCircuitTerminationRoleChoices,
 )
 from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES
 from circuits.models import *
@@ -15,7 +18,10 @@ from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditFor
 from tenancy.models import Tenant
 from utilities.forms import add_blank_choice, get_field_value
 from utilities.forms.fields import (
-    ColorField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField,
+    ColorField,
+    ContentTypeChoiceField,
+    DynamicModelChoiceField,
+    DynamicModelMultipleChoiceField,
 )
 from utilities.forms.rendering import FieldSet
 from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, HTMXSelect, NumberWithOptions

+ 5 - 2
netbox/circuits/forms/filtersets.py

@@ -2,7 +2,10 @@ from django import forms
 from django.utils.translation import gettext as _
 
 from circuits.choices import (
-    CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, CircuitTerminationSideChoices,
+    CircuitCommitRateChoices,
+    CircuitPriorityChoices,
+    CircuitStatusChoices,
+    CircuitTerminationSideChoices,
     VirtualCircuitTerminationRoleChoices,
 )
 from circuits.models import *
@@ -10,7 +13,7 @@ from dcim.models import Location, Region, Site, SiteGroup
 from ipam.models import ASN
 from netbox.choices import DistanceUnitChoices
 from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm
-from tenancy.forms import TenancyFilterForm, ContactModelFilterForm
+from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
 from utilities.forms import add_blank_choice
 from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
 from utilities.forms.rendering import FieldSet

+ 7 - 2
netbox/circuits/forms/model_forms.py

@@ -4,7 +4,9 @@ from django.core.exceptions import ObjectDoesNotExist
 from django.utils.translation import gettext_lazy as _
 
 from circuits.choices import (
-    CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices, VirtualCircuitTerminationRoleChoices,
+    CircuitCommitRateChoices,
+    CircuitTerminationPortSpeedChoices,
+    VirtualCircuitTerminationRoleChoices,
 )
 from circuits.constants import *
 from circuits.models import *
@@ -14,7 +16,10 @@ from netbox.forms import NetBoxModelForm, OrganizationalModelForm, PrimaryModelF
 from tenancy.forms import TenancyForm
 from utilities.forms import get_field_value
 from utilities.forms.fields import (
-    ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField,
+    ContentTypeChoiceField,
+    DynamicModelChoiceField,
+    DynamicModelMultipleChoiceField,
+    SlugField,
 )
 from utilities.forms.mixins import DistanceValidationMixin
 from utilities.forms.rendering import FieldSet, InlineFields

+ 1 - 1
netbox/circuits/graphql/filter_mixins.py

@@ -1,5 +1,5 @@
 from dataclasses import dataclass
-from typing import Annotated, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated
 
 import strawberry
 import strawberry_django

+ 3 - 2
netbox/circuits/graphql/filters.py

@@ -1,10 +1,10 @@
 from datetime import date
-from typing import Annotated, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated
 
 import strawberry
 import strawberry_django
 from strawberry.scalars import ID
-from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
+from strawberry_django import BaseFilterLookup, DateFilterLookup, FilterLookup
 
 from circuits import models
 from circuits.graphql.filter_mixins import CircuitTypeFilterMixin
@@ -19,6 +19,7 @@ if TYPE_CHECKING:
     from dcim.graphql.filters import InterfaceFilter, LocationFilter, RegionFilter, SiteFilter, SiteGroupFilter
     from ipam.graphql.filters import ASNFilter
     from netbox.graphql.filter_lookups import IntegerLookup
+
     from .enums import *
 
 __all__ = (

+ 2 - 1
netbox/circuits/graphql/types.py

@@ -1,4 +1,4 @@
-from typing import Annotated, List, TYPE_CHECKING, Union
+from typing import TYPE_CHECKING, Annotated, List, Union
 
 import strawberry
 import strawberry_django
@@ -8,6 +8,7 @@ from dcim.graphql.mixins import CabledObjectMixin
 from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
 from netbox.graphql.types import BaseObjectType, ObjectType, OrganizationalObjectType, PrimaryObjectType
 from tenancy.graphql.types import TenantType
+
 from .filters import *
 
 if TYPE_CHECKING:

+ 3 - 2
netbox/circuits/migrations/0001_squashed.py

@@ -1,7 +1,8 @@
+import django.db.models.deletion
+from django.db import migrations, models
+
 import ipam.fields
 from utilities.json import CustomFieldJSONEncoder
-from django.db import migrations, models
-import django.db.models.deletion
 
 
 class Migration(migrations.Migration):

+ 1 - 1
netbox/circuits/migrations/0002_squashed_0029.py

@@ -1,6 +1,6 @@
-from django.db import migrations, models
 import django.db.models.deletion
 import taggit.managers
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):

+ 1 - 0
netbox/circuits/migrations/0043_circuittype_color.py

@@ -1,6 +1,7 @@
 # Generated by Django 4.2.5 on 2023-10-20 21:25
 
 from django.db import migrations
+
 import utilities.fields
 
 

+ 2 - 1
netbox/circuits/migrations/0044_circuit_groups.py

@@ -1,8 +1,9 @@
 import django.db.models.deletion
 import taggit.managers
-import utilities.json
 from django.db import migrations, models
 
+import utilities.json
+
 
 class Migration(migrations.Migration):
     dependencies = [

+ 8 - 2
netbox/circuits/models/circuits.py

@@ -8,10 +8,16 @@ from django.utils.translation import gettext_lazy as _
 from circuits.choices import *
 from dcim.models import CabledObjectModel
 from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel
-from netbox.models.mixins import DistanceMixin
 from netbox.models.features import (
-    ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, ImageAttachmentsMixin, TagsMixin,
+    ContactsMixin,
+    CustomFieldsMixin,
+    CustomLinksMixin,
+    ExportTemplatesMixin,
+    ImageAttachmentsMixin,
+    TagsMixin,
 )
+from netbox.models.mixins import DistanceMixin
+
 from .base import BaseCircuitType
 
 __all__ = (

+ 1 - 0
netbox/circuits/models/virtual_circuits.py

@@ -9,6 +9,7 @@ from django.utils.translation import gettext_lazy as _
 from circuits.choices import *
 from netbox.models import ChangeLoggedModel, PrimaryModel
 from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, TagsMixin
+
 from .base import BaseCircuitType
 
 __all__ = (

+ 1 - 0
netbox/circuits/search.py

@@ -1,4 +1,5 @@
 from netbox.search import SearchIndex, register_search
+
 from . import models
 
 

+ 1 - 0
netbox/circuits/signals.py

@@ -2,6 +2,7 @@ from django.db.models.signals import post_delete, post_save
 from django.dispatch import receiver
 
 from dcim.signals import rebuild_paths
+
 from .models import CircuitTermination
 
 

+ 1 - 0
netbox/circuits/tables/circuits.py

@@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _
 from circuits.models import *
 from netbox.tables import NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns
 from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
+
 from .columns import CommitRateColumn
 
 __all__ = (

+ 10 - 1
netbox/circuits/tests/test_filtersets.py

@@ -5,7 +5,16 @@ from circuits.filtersets import *
 from circuits.models import *
 from dcim.choices import InterfaceTypeChoices, LocationStatusChoices
 from dcim.models import (
-    Cable, Device, DeviceRole, DeviceType, Interface, Location, Manufacturer, Region, Site, SiteGroup
+    Cable,
+    Device,
+    DeviceRole,
+    DeviceType,
+    Interface,
+    Location,
+    Manufacturer,
+    Region,
+    Site,
+    SiteGroup,
 )
 from ipam.models import ASN, RIR
 from netbox.choices import DistanceUnitChoices

+ 1 - 1
netbox/circuits/tests/test_tables.py

@@ -1,4 +1,4 @@
-from django.test import RequestFactory, tag, TestCase
+from django.test import RequestFactory, TestCase, tag
 
 from circuits.models import CircuitTermination
 from circuits.tables import CircuitTerminationTable

+ 1 - 0
netbox/circuits/urls.py

@@ -1,6 +1,7 @@
 from django.urls import include, path
 
 from utilities.urls import get_model_urls
+
 from . import views
 
 app_name = 'circuits'

+ 2 - 1
netbox/circuits/views.py

@@ -5,14 +5,15 @@ from netbox.object_actions import AddObject, BulkDelete, BulkEdit, BulkExport, B
 from netbox.views import generic
 from utilities.query import count_related
 from utilities.views import GetRelatedModelsMixin, register_model_view
+
 from . import filtersets, forms, tables
 from .models import *
 
-
 #
 # Providers
 #
 
+
 @register_model_view(Provider, 'list', path='', detail=False)
 class ProviderListView(generic.ObjectListView):
     queryset = Provider.objects.annotate(

+ 6 - 2
netbox/core/api/schema.py

@@ -2,10 +2,14 @@ import re
 import typing
 from collections import OrderedDict
 
-from drf_spectacular.extensions import OpenApiSerializerFieldExtension, OpenApiSerializerExtension, _SchemaType
+from drf_spectacular.extensions import OpenApiSerializerExtension, OpenApiSerializerFieldExtension, _SchemaType
 from drf_spectacular.openapi import AutoSchema
 from drf_spectacular.plumbing import (
-    build_basic_type, build_choice_field, build_media_type_object, build_object_type, get_doc,
+    build_basic_type,
+    build_choice_field,
+    build_media_type_object,
+    build_object_type,
+    get_doc,
 )
 from drf_spectacular.types import OpenApiTypes
 from drf_spectacular.utils import Direction

+ 1 - 0
netbox/core/api/urls.py

@@ -1,4 +1,5 @@
 from netbox.api.routers import NetBoxRouter
+
 from . import views
 
 app_name = 'core-api'

+ 1 - 0
netbox/core/api/views.py

@@ -23,6 +23,7 @@ from netbox.api.metadata import ContentTypeMetadata
 from netbox.api.pagination import LimitOffsetListPagination
 from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet
 from utilities.api import IsSuperuser
+
 from . import serializers
 
 

+ 3 - 2
netbox/core/apps.py

@@ -6,7 +6,7 @@ from django.db.migrations.operations import AlterModelOptions
 from django.utils.translation import gettext as _
 
 from core.events import *
-from netbox.events import EventType, EVENT_TYPE_KIND_DANGER, EVENT_TYPE_KIND_SUCCESS, EVENT_TYPE_KIND_WARNING
+from netbox.events import EVENT_TYPE_KIND_DANGER, EVENT_TYPE_KIND_SUCCESS, EVENT_TYPE_KIND_WARNING, EventType
 from utilities.migration import custom_deconstruct
 
 # Ignore verbose_name & verbose_name_plural Meta options when calculating model migrations
@@ -23,9 +23,10 @@ class CoreConfig(AppConfig):
     def ready(self):
         from core.api import schema  # noqa: F401
         from core.checks import check_duplicate_indexes  # noqa: F401
+        from netbox import context_managers  # noqa: F401
         from netbox.models.features import register_models
+
         from . import data_backends, events, search  # noqa: F401
-        from netbox import context_managers  # noqa: F401
 
         # Register models
         register_models(*self.get_models())

+ 2 - 2
netbox/core/checks.py

@@ -1,6 +1,6 @@
-from django.core.checks import Error, register, Tags
-from django.db.models import Index, UniqueConstraint
 from django.apps import apps
+from django.core.checks import Error, Tags, register
+from django.db.models import Index, UniqueConstraint
 
 __all__ = (
     'check_duplicate_indexes',

+ 1 - 1
netbox/core/choices.py

@@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _
 
 from utilities.choices import ChoiceSet
 
-
 #
 # Data sources
 #
 
+
 class DataSourceStatusChoices(ChoiceSet):
     NEW = 'new'
     QUEUED = 'queued'

+ 1 - 0
netbox/core/data_backends.py

@@ -15,6 +15,7 @@ from netbox.utils import register_data_backend
 from utilities.constants import HTTP_PROXY_SUPPORTED_SCHEMAS, HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS
 from utilities.proxy import resolve_proxies
 from utilities.socks import ProxyPoolManager
+
 from .exceptions import SyncError
 
 __all__ = (

+ 0 - 1
netbox/core/dataclasses.py

@@ -1,5 +1,4 @@
 import logging
-
 from dataclasses import dataclass, field
 from datetime import datetime
 

+ 1 - 0
netbox/core/filtersets.py

@@ -8,6 +8,7 @@ from netbox.utils import get_data_backend_choices
 from users.models import User
 from utilities.filters import MultiValueContentTypeFilter
 from utilities.filtersets import register_filterset
+
 from .choices import *
 from .models import *
 

+ 4 - 1
netbox/core/forms/filtersets.py

@@ -9,7 +9,10 @@ from netbox.utils import get_data_backend_choices
 from users.models import User
 from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
 from utilities.forms.fields import (
-    ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField,
+    ContentTypeChoiceField,
+    ContentTypeMultipleChoiceField,
+    DynamicModelMultipleChoiceField,
+    TagFilterField,
 )
 from utilities.forms.rendering import FieldSet
 from utilities.forms.widgets import DateTimePicker

+ 1 - 1
netbox/core/forms/model_forms.py

@@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _
 
 from core.forms.mixins import SyncedDataMixin
 from core.models import *
-from netbox.config import get_config, PARAMS
+from netbox.config import PARAMS, get_config
 from netbox.forms import NetBoxModelForm, PrimaryModelForm
 from netbox.registry import registry
 from netbox.utils import get_data_backend_choices

+ 1 - 1
netbox/core/graphql/filter_mixins.py

@@ -1,6 +1,6 @@
 from dataclasses import dataclass
 from datetime import datetime
-from typing import Annotated, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated
 
 import strawberry
 import strawberry_django

+ 2 - 1
netbox/core/graphql/filters.py

@@ -1,5 +1,5 @@
 from datetime import datetime
-from typing import Annotated, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated
 
 import strawberry
 import strawberry_django
@@ -9,6 +9,7 @@ from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLook
 
 from core import models
 from netbox.graphql.filters import BaseModelFilter, PrimaryModelFilter
+
 from .enums import *
 
 if TYPE_CHECKING:

+ 1 - 1
netbox/core/graphql/mixins.py

@@ -1,4 +1,4 @@
-from typing import Annotated, List, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated, List
 
 import strawberry
 import strawberry_django

+ 1 - 0
netbox/core/graphql/types.py

@@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType as DjangoContentType
 
 from core import models
 from netbox.graphql.types import BaseObjectType, PrimaryObjectType
+
 from .filters import *
 
 __all__ = (

+ 1 - 0
netbox/core/jobs.py

@@ -13,6 +13,7 @@ from netbox.config import Config
 from netbox.jobs import JobRunner, system_job
 from netbox.search.backends import search_backend
 from utilities.proxy import resolve_proxies
+
 from .choices import DataSourceStatusChoices, JobIntervalChoices
 from .models import DataSource
 

+ 0 - 1
netbox/core/management/commands/rqworker.py

@@ -4,7 +4,6 @@ from django_rq.management.commands.rqworker import Command as _Command
 
 from netbox.registry import registry
 
-
 DEFAULT_QUEUES = ('high', 'default', 'low')
 
 logger = logging.getLogger('netbox.rqworker')

+ 2 - 1
netbox/core/migrations/0008_contenttype_proxy.py

@@ -1,6 +1,7 @@
-import core.models.object_types
 from django.db import migrations
 
+import core.models.object_types
+
 
 class Migration(migrations.Migration):
     dependencies = [

+ 2 - 1
netbox/core/models/__init__.py

@@ -1,4 +1,5 @@
-from .object_types import *
+from .object_types import *  # isort: split
+
 from .change_logging import *
 from .config import *
 from .data import *

+ 1 - 2
netbox/core/models/change_logging.py

@@ -10,8 +10,7 @@ from mptt.models import MPTTModel
 
 from core.choices import ObjectChangeActionChoices
 from core.querysets import ObjectChangeQuerySet
-from netbox.models.features import ChangeLoggingMixin
-from netbox.models.features import has_feature
+from netbox.models.features import ChangeLoggingMixin, has_feature
 from utilities.data import shallow_compare_dict
 
 __all__ = (

+ 2 - 1
netbox/core/models/config.py

@@ -1,7 +1,8 @@
 from django.core.cache import cache
 from django.db import models
 from django.urls import reverse
-from django.utils.translation import gettext, gettext_lazy as _
+from django.utils.translation import gettext
+from django.utils.translation import gettext_lazy as _
 
 from utilities.querysets import RestrictedQuerySet
 

+ 1 - 0
netbox/core/models/data.py

@@ -19,6 +19,7 @@ from netbox.models import PrimaryModel
 from netbox.models.features import JobsMixin
 from netbox.registry import registry
 from utilities.querysets import RestrictedQuerySet
+
 from ..choices import *
 from ..exceptions import SyncError
 

+ 3 - 2
netbox/core/models/files.py

@@ -4,15 +4,16 @@ from functools import cached_property
 
 from django.conf import settings
 from django.core.exceptions import ValidationError
-from django.db import models
 from django.core.files.storage import storages
+from django.db import models
 from django.utils.translation import gettext as _
 
-from ..choices import ManagedFileRootPathChoices
 from extras.storage import ScriptFileSystemStorage
 from netbox.models.features import SyncedDataMixin
 from utilities.querysets import RestrictedQuerySet
 
+from ..choices import ManagedFileRootPathChoices
+
 __all__ = (
     'ManagedFile',
 )

+ 1 - 0
netbox/core/search.py

@@ -1,4 +1,5 @@
 from netbox.search import SearchIndex, register_search
+
 from . import models
 
 

+ 4 - 3
netbox/core/signals.py

@@ -3,11 +3,11 @@ from threading import local
 
 from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ObjectDoesNotExist, ValidationError
+from django.core.signals import request_finished
 from django.db.models import CASCADE, RESTRICT
 from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel
 from django.db.models.signals import m2m_changed, post_migrate, post_save, pre_delete
-from django.dispatch import receiver, Signal
-from django.core.signals import request_finished
+from django.dispatch import Signal, receiver
 from django.utils.translation import gettext_lazy as _
 from django_prometheus.models import model_deletes, model_inserts, model_updates
 
@@ -18,10 +18,11 @@ from extras.events import enqueue_event
 from extras.models import Tag
 from extras.utils import run_validators
 from netbox.config import get_config
-from utilities.data import get_config_value_ci
 from netbox.context import current_request, events_queue
 from netbox.models.features import ChangeLoggingMixin, get_model_features, model_is_public
+from utilities.data import get_config_value_ci
 from utilities.exceptions import AbortRequest
+
 from .models import ConfigRevision, DataSource, ObjectChange
 
 __all__ = (

+ 1 - 1
netbox/core/tables/__init__.py

@@ -2,5 +2,5 @@ from .change_logging import *
 from .config import *
 from .data import *
 from .jobs import *
-from .tasks import *
 from .plugins import *
+from .tasks import *

+ 1 - 0
netbox/core/tables/change_logging.py

@@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _
 
 from core.models import ObjectChange
 from netbox.tables import NetBoxTable, columns
+
 from .template_code import *
 
 __all__ = (

+ 2 - 1
netbox/core/tables/data.py

@@ -1,8 +1,9 @@
-from django.utils.translation import gettext_lazy as _
 import django_tables2 as tables
+from django.utils.translation import gettext_lazy as _
 
 from core.models import *
 from netbox.tables import NetBoxTable, PrimaryModelTable, columns
+
 from .columns import BackendTypeColumn
 from .template_code import DATA_SOURCE_SYNC_BUTTON
 

+ 1 - 1
netbox/core/tables/jobs.py

@@ -1,10 +1,10 @@
 import django_tables2 as tables
 from django.utils.translation import gettext_lazy as _
 
-from netbox.tables import BaseTable, NetBoxTable, columns
 from core.constants import JOB_LOG_ENTRY_LEVELS
 from core.models import Job
 from core.tables.columns import BadgeColumn
+from netbox.tables import BaseTable, NetBoxTable, columns
 
 
 class JobTable(NetBoxTable):

+ 1 - 0
netbox/core/tables/plugins.py

@@ -2,6 +2,7 @@ import django_tables2 as tables
 from django.utils.translation import gettext_lazy as _
 
 from netbox.tables import BaseTable, columns
+
 from .template_code import PLUGIN_IS_INSTALLED, PLUGIN_NAME_TEMPLATE
 
 __all__ = (

+ 6 - 4
netbox/core/tests/test_api.py

@@ -1,17 +1,19 @@
 import uuid
 
-from django_rq import get_queue
-from django_rq.workers import get_worker
 from django.urls import reverse
 from django.utils import timezone
-from rq.job import Job as RQ_Job, JobStatus
+from django_rq import get_queue
+from django_rq.workers import get_worker
+from rest_framework import status
+from rq.job import Job as RQ_Job
+from rq.job import JobStatus
 from rq.registry import FailedJobRegistry, StartedJobRegistry
 
-from rest_framework import status
 from users.constants import TOKEN_PREFIX
 from users.models import Token, User
 from utilities.testing import APITestCase, APIViewTestCases, TestCase
 from utilities.testing.utils import disable_logging
+
 from ..models import *
 
 

+ 10 - 1
netbox/core/tests/test_changelog.py

@@ -7,7 +7,16 @@ from core.choices import ObjectChangeActionChoices
 from core.models import ObjectChange, ObjectType
 from dcim.choices import InterfaceTypeChoices, ModuleStatusChoices, SiteStatusChoices
 from dcim.models import (
-    Cable, CableTermination, Device, DeviceRole, DeviceType, Manufacturer, Module, ModuleBay, ModuleType, Interface,
+    Cable,
+    CableTermination,
+    Device,
+    DeviceRole,
+    DeviceType,
+    Interface,
+    Manufacturer,
+    Module,
+    ModuleBay,
+    ModuleType,
     Site,
 )
 from extras.choices import *

+ 1 - 0
netbox/core/tests/test_filtersets.py

@@ -8,6 +8,7 @@ from dcim.models import Site
 from ipam.models import IPAddress
 from users.models import User
 from utilities.testing import BaseFilterSetTests, ChangeLoggedFilterSetTests
+
 from ..choices import *
 from ..filtersets import *
 from ..models import *

+ 3 - 3
netbox/core/tests/test_models.py

@@ -1,12 +1,12 @@
-from unittest.mock import patch, MagicMock
+from unittest.mock import MagicMock, patch
 
 from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ObjectDoesNotExist
 from django.test import TestCase
 
-from core.models import DataSource, Job, ObjectType
 from core.choices import ObjectChangeActionChoices
-from dcim.models import Site, Location, Device
+from core.models import DataSource, Job, ObjectType
+from dcim.models import Device, Location, Site
 from netbox.constants import CENSOR_TOKEN, CENSOR_TOKEN_CHANGED
 
 

+ 1 - 0
netbox/core/tests/test_openapi_schema.py

@@ -4,6 +4,7 @@ Unit tests for OpenAPI schema generation.
 Refs: #20638
 """
 import json
+
 from django.test import TestCase
 
 

+ 2 - 1
netbox/core/tests/test_views.py

@@ -8,7 +8,8 @@ from django.utils import timezone
 from django_rq import get_queue
 from django_rq.settings import QUEUES_MAP
 from django_rq.workers import get_worker
-from rq.job import Job as RQ_Job, JobStatus
+from rq.job import Job as RQ_Job
+from rq.job import JobStatus
 from rq.registry import DeferredJobRegistry, FailedJobRegistry, FinishedJobRegistry, StartedJobRegistry
 
 from core.choices import ObjectChangeActionChoices

+ 1 - 0
netbox/core/urls.py

@@ -1,6 +1,7 @@
 from django.urls import include, path
 
 from utilities.urls import get_model_urls
+
 from . import views
 
 app_name = 'core'

+ 3 - 2
netbox/core/utils.py

@@ -1,11 +1,12 @@
 from django.http import Http404
 from django.utils.translation import gettext_lazy as _
 from django_rq.queues import get_queue, get_queue_by_index, get_redis_connection
-from django_rq.settings import QUEUES_MAP, QUEUES_LIST
+from django_rq.settings import QUEUES_LIST, QUEUES_MAP
 from django_rq.utils import get_jobs, stop_jobs
 from rq import requeue_job
 from rq.exceptions import NoSuchJobError
-from rq.job import Job as RQ_Job, JobStatus as RQJobStatus
+from rq.job import Job as RQ_Job
+from rq.job import JobStatus as RQJobStatus
 from rq.registry import (
     DeferredJobRegistry,
     FailedJobRegistry,

+ 9 - 7
netbox/core/views.py

@@ -1,28 +1,29 @@
 import json
 import platform
-
 from copy import deepcopy
+
 from django import __version__ as django_version
 from django.conf import settings
 from django.contrib import messages
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.core.cache import cache
-from django.db import connection, ProgrammingError
-from django.http import HttpResponse, HttpResponseForbidden, Http404
+from django.db import ProgrammingError, connection
+from django.http import Http404, HttpResponse, HttpResponseForbidden
 from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import View
 from django_rq.queues import get_connection, get_queue_by_index, get_redis_connection
-from django_rq.settings import QUEUES_MAP, QUEUES_LIST
+from django_rq.settings import QUEUES_LIST, QUEUES_MAP
 from django_rq.utils import get_statistics
 from rq.exceptions import NoSuchJobError
-from rq.job import Job as RQ_Job, JobStatus as RQJobStatus
+from rq.job import Job as RQ_Job
+from rq.job import JobStatus as RQJobStatus
 from rq.worker import Worker
 from rq.worker_registration import clean_worker_registry
 
 from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs_from_status, requeue_rq_job, stop_rq_job
-from netbox.config import get_config, PARAMS
+from netbox.config import PARAMS, get_config
 from netbox.object_actions import AddObject, BulkDelete, BulkExport, DeleteObject
 from netbox.plugins.utils import get_installed_plugins
 from netbox.views import generic
@@ -41,17 +42,18 @@ from utilities.views import (
     ViewTab,
     register_model_view,
 )
+
 from . import filtersets, forms, tables
 from .jobs import SyncDataSourceJob
 from .models import *
 from .plugins import get_catalog_plugins, get_local_plugins
 from .tables import CatalogPluginTable, JobLogEntryTable, PluginVersionTable
 
-
 #
 # Data sources
 #
 
+
 @register_model_view(DataSource, 'list', path='', detail=False)
 class DataSourceListView(generic.ObjectListView):
     queryset = DataSource.objects.annotate(

+ 8 - 8
netbox/dcim/api/serializers.py

@@ -1,13 +1,13 @@
 from .serializers_.cables import *
-from .serializers_.sites import *
-from .serializers_.racks import *
+from .serializers_.device_components import *
+from .serializers_.devices import *
+from .serializers_.devicetype_components import *
+from .serializers_.devicetypes import *
 from .serializers_.manufacturers import *
 from .serializers_.platforms import *
-from .serializers_.roles import *
-from .serializers_.devicetypes import *
-from .serializers_.devicetype_components import *
-from .serializers_.virtualchassis import *
-from .serializers_.devices import *
-from .serializers_.device_components import *
 from .serializers_.power import *
+from .serializers_.racks import *
 from .serializers_.rackunits import *
+from .serializers_.roles import *
+from .serializers_.sites import *
+from .serializers_.virtualchassis import *

+ 4 - 1
netbox/dcim/api/serializers_/cables.py

@@ -7,7 +7,10 @@ from dcim.models import Cable, CablePath, CableTermination
 from netbox.api.fields import ChoiceField, ContentTypeField
 from netbox.api.gfk_fields import GFKSerializerField
 from netbox.api.serializers import (
-    BaseModelSerializer, GenericObjectSerializer, NetBoxModelSerializer, PrimaryModelSerializer,
+    BaseModelSerializer,
+    GenericObjectSerializer,
+    NetBoxModelSerializer,
+    PrimaryModelSerializer,
 )
 from tenancy.api.serializers_.tenants import TenantSerializer
 from utilities.api import get_serializer_for_model

+ 13 - 2
netbox/dcim/api/serializers_/device_components.py

@@ -5,8 +5,18 @@ from rest_framework import serializers
 from dcim.choices import *
 from dcim.constants import *
 from dcim.models import (
-    ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, InventoryItem, ModuleBay, PortMapping,
-    PowerOutlet, PowerPort, RearPort, VirtualDeviceContext,
+    ConsolePort,
+    ConsoleServerPort,
+    DeviceBay,
+    FrontPort,
+    Interface,
+    InventoryItem,
+    ModuleBay,
+    PortMapping,
+    PowerOutlet,
+    PowerPort,
+    RearPort,
+    VirtualDeviceContext,
 )
 from ipam.api.serializers_.vlans import VLANSerializer, VLANTranslationPolicySerializer
 from ipam.api.serializers_.vrfs import VRFSerializer
@@ -20,6 +30,7 @@ from wireless.api.serializers_.nested import NestedWirelessLinkSerializer
 from wireless.api.serializers_.wirelesslans import WirelessLANSerializer
 from wireless.choices import *
 from wireless.models import WirelessLAN
+
 from .base import ConnectedEndpointsSerializer, PortSerializer
 from .cables import CabledObjectSerializer
 from .devices import DeviceSerializer, MACAddressSerializer, ModuleSerializer, VirtualDeviceContextSerializer

+ 1 - 0
netbox/dcim/api/serializers_/devices.py

@@ -15,6 +15,7 @@ from netbox.api.gfk_fields import GFKSerializerField
 from netbox.api.serializers import PrimaryModelSerializer
 from tenancy.api.serializers_.tenants import TenantSerializer
 from virtualization.api.serializers_.clusters import ClusterSerializer
+
 from .devicetypes import *
 from .nested import NestedDeviceBaySerializer, NestedDeviceSerializer, NestedModuleBaySerializer
 from .platforms import PlatformSerializer

+ 11 - 2
netbox/dcim/api/serializers_/devicetype_components.py

@@ -4,14 +4,23 @@ from rest_framework import serializers
 from dcim.choices import *
 from dcim.constants import *
 from dcim.models import (
-    ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, FrontPortTemplate, InterfaceTemplate,
-    InventoryItemTemplate, ModuleBayTemplate, PortTemplateMapping, PowerOutletTemplate, PowerPortTemplate,
+    ConsolePortTemplate,
+    ConsoleServerPortTemplate,
+    DeviceBayTemplate,
+    FrontPortTemplate,
+    InterfaceTemplate,
+    InventoryItemTemplate,
+    ModuleBayTemplate,
+    PortTemplateMapping,
+    PowerOutletTemplate,
+    PowerPortTemplate,
     RearPortTemplate,
 )
 from netbox.api.fields import ChoiceField, ContentTypeField
 from netbox.api.gfk_fields import GFKSerializerField
 from netbox.api.serializers import ChangeLogMessageSerializer, ValidatedModelSerializer
 from wireless.choices import *
+
 from .base import PortSerializer
 from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer
 from .manufacturers import ManufacturerSerializer

+ 1 - 0
netbox/dcim/api/serializers_/devicetypes.py

@@ -8,6 +8,7 @@ from dcim.models import DeviceType, ModuleType, ModuleTypeProfile
 from netbox.api.fields import AttributesField, ChoiceField
 from netbox.api.serializers import PrimaryModelSerializer
 from netbox.choices import *
+
 from .manufacturers import ManufacturerSerializer
 from .platforms import PlatformSerializer
 

+ 1 - 1
netbox/dcim/api/serializers_/nested.py

@@ -1,8 +1,8 @@
 from drf_spectacular.utils import extend_schema_serializer
 from rest_framework import serializers
 
-from netbox.api.serializers import WritableNestedSerializer
 from dcim import models
+from netbox.api.serializers import WritableNestedSerializer
 
 __all__ = (
     'NestedDeviceBaySerializer',

+ 1 - 0
netbox/dcim/api/serializers_/platforms.py

@@ -3,6 +3,7 @@ from rest_framework import serializers
 from dcim.models import Platform
 from extras.api.serializers_.configtemplates import ConfigTemplateSerializer
 from netbox.api.serializers import NestedGroupModelSerializer
+
 from .manufacturers import ManufacturerSerializer
 from .nested import NestedPlatformSerializer
 

+ 1 - 0
netbox/dcim/api/serializers_/power.py

@@ -3,6 +3,7 @@ from dcim.models import PowerFeed, PowerPanel
 from netbox.api.fields import ChoiceField, RelatedObjectCountField
 from netbox.api.serializers import PrimaryModelSerializer
 from tenancy.api.serializers_.tenants import TenantSerializer
+
 from .base import ConnectedEndpointsSerializer
 from .cables import CabledObjectSerializer
 from .racks import RackSerializer

+ 1 - 0
netbox/dcim/api/serializers_/racks.py

@@ -10,6 +10,7 @@ from netbox.choices import *
 from netbox.config import ConfigItem
 from tenancy.api.serializers_.tenants import TenantSerializer
 from users.api.serializers_.users import UserSerializer
+
 from .manufacturers import ManufacturerSerializer
 from .sites import LocationSerializer, SiteSerializer
 

+ 1 - 0
netbox/dcim/api/serializers_/rackunits.py

@@ -4,6 +4,7 @@ from rest_framework import serializers
 
 from dcim.choices import *
 from netbox.api.fields import ChoiceField
+
 from .devices import DeviceSerializer
 
 __all__ = (

+ 1 - 0
netbox/dcim/api/serializers_/roles.py

@@ -4,6 +4,7 @@ from dcim.models import DeviceRole, InventoryItemRole
 from extras.api.serializers_.configtemplates import ConfigTemplateSerializer
 from netbox.api.fields import RelatedObjectCountField
 from netbox.api.serializers import NestedGroupModelSerializer, OrganizationalModelSerializer
+
 from .nested import NestedDeviceRoleSerializer
 
 __all__ = (

+ 1 - 0
netbox/dcim/api/serializers_/sites.py

@@ -8,6 +8,7 @@ from ipam.models import ASN
 from netbox.api.fields import ChoiceField, RelatedObjectCountField, SerializedPKRelatedField
 from netbox.api.serializers import NestedGroupModelSerializer, PrimaryModelSerializer
 from tenancy.api.serializers_.tenants import TenantSerializer
+
 from .nested import NestedLocationSerializer, NestedRegionSerializer, NestedSiteGroupSerializer
 
 __all__ = (

+ 1 - 0
netbox/dcim/api/serializers_/virtualchassis.py

@@ -2,6 +2,7 @@ from rest_framework import serializers
 
 from dcim.models import VirtualChassis
 from netbox.api.serializers import PrimaryModelSerializer
+
 from .nested import NestedDeviceSerializer
 
 __all__ = (

+ 1 - 1
netbox/dcim/api/urls.py

@@ -1,6 +1,6 @@
 from netbox.api.routers import NetBoxRouter
-from . import views
 
+from . import views
 
 router = NetBoxRouter()
 router.APIRootView = views.DCIMRootView

+ 3 - 2
netbox/dcim/api/views.py

@@ -2,7 +2,7 @@ from django.contrib.contenttypes.prefetch import GenericPrefetch
 from django.http import Http404, HttpResponse
 from django.shortcuts import get_object_or_404
 from drf_spectacular.types import OpenApiTypes
-from drf_spectacular.utils import extend_schema, OpenApiParameter
+from drf_spectacular.utils import OpenApiParameter, extend_schema
 from rest_framework.decorators import action
 from rest_framework.response import Response
 from rest_framework.routers import APIRootView
@@ -16,11 +16,12 @@ from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin
 from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
 from netbox.api.metadata import ContentTypeMetadata
 from netbox.api.pagination import StripCountAnnotationsPaginator
-from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin, NetBoxReadOnlyModelViewSet
+from netbox.api.viewsets import MPTTLockedMixin, NetBoxModelViewSet, NetBoxReadOnlyModelViewSet
 from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
 from utilities.api import get_serializer_for_model
 from utilities.query_functions import CollateAsChar
 from virtualization.models import VirtualMachine
+
 from . import serializers
 from .exceptions import MissingFilterException
 

+ 2 - 1
netbox/dcim/apps.py

@@ -10,7 +10,8 @@ class DCIMConfig(AppConfig):
     def ready(self):
         from netbox.models.features import register_models
         from utilities.counters import connect_counters
-        from . import signals, search  # noqa: F401
+
+        from . import search, signals  # noqa: F401
         from .models import CableTermination, Device, DeviceType, ModuleType, RackType, VirtualChassis
 
         # Register models

+ 2 - 1
netbox/dcim/base_filtersets.py

@@ -1,8 +1,9 @@
 import django_filters
-
 from django.utils.translation import gettext as _
+
 from netbox.filtersets import BaseFilterSet
 from utilities.filters import MultiValueContentTypeFilter, TreeNodeMultipleChoiceFilter
+
 from .models import *
 
 __all__ = (

+ 1 - 1
netbox/dcim/choices.py

@@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _
 
 from utilities.choices import ChoiceSet
 
-
 #
 # Sites
 #
 
+
 class SiteStatusChoices(ChoiceSet):
     key = 'Site.status'
 

+ 1 - 1
netbox/dcim/fields.py

@@ -2,7 +2,7 @@ from django.contrib.postgres.fields import ArrayField
 from django.core.exceptions import ValidationError
 from django.db import models
 from django.utils.translation import gettext as _
-from netaddr import AddrFormatError, EUI, eui64_unix_expanded, mac_unix_expanded
+from netaddr import EUI, AddrFormatError, eui64_unix_expanded, mac_unix_expanded
 
 from .lookups import PathContains
 

+ 16 - 5
netbox/dcim/filtersets.py

@@ -10,25 +10,36 @@ from circuits.models import CircuitTermination, VirtualCircuit, VirtualCircuitTe
 from extras.filtersets import LocalConfigContextFilterSet
 from extras.models import ConfigTemplate
 from ipam.filtersets import PrimaryIPFilterSet
-from ipam.models import ASN, IPAddress, VLANTranslationPolicy, VRF
+from ipam.models import ASN, VRF, IPAddress, VLANTranslationPolicy
 from netbox.choices import ColorChoices
 from netbox.filtersets import (
-    AttributeFiltersMixin, BaseFilterSet, ChangeLoggedModelFilterSet, NestedGroupModelFilterSet,
-    OrganizationalModelFilterSet, PrimaryModelFilterSet, NetBoxModelFilterSet,
+    AttributeFiltersMixin,
+    BaseFilterSet,
+    ChangeLoggedModelFilterSet,
+    NestedGroupModelFilterSet,
+    NetBoxModelFilterSet,
+    OrganizationalModelFilterSet,
+    PrimaryModelFilterSet,
 )
 from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet
 from tenancy.models import *
 from users.filterset_mixins import OwnerFilterMixin
 from users.models import User
 from utilities.filters import (
-    MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueMACAddressFilter, MultiValueNumberFilter,
-    MultiValueWWNFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter,
+    MultiValueCharFilter,
+    MultiValueContentTypeFilter,
+    MultiValueMACAddressFilter,
+    MultiValueNumberFilter,
+    MultiValueWWNFilter,
+    NumericArrayFilter,
+    TreeNodeMultipleChoiceFilter,
 )
 from utilities.filtersets import register_filterset
 from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface
 from vpn.models import L2VPN
 from wireless.choices import WirelessChannelChoices, WirelessRoleChoices
 from wireless.models import WirelessLAN, WirelessLink
+
 from .choices import *
 from .constants import *
 from .models import *

+ 4 - 4
netbox/dcim/forms/__init__.py

@@ -1,9 +1,9 @@
-from .model_forms import *
-from .filtersets import *
-from .object_create import *
-from .object_import import *
 from .bulk_create import *
 from .bulk_edit import *
 from .bulk_import import *
 from .connections import *
+from .filtersets import *
 from .formsets import *
+from .model_forms import *
+from .object_create import *
+from .object_import import *

+ 1 - 0
netbox/dcim/forms/bulk_create.py

@@ -6,6 +6,7 @@ from extras.models import Tag
 from netbox.forms.mixins import CustomFieldsMixin
 from utilities.forms import form_from_model
 from utilities.forms.fields import DynamicModelMultipleChoiceField, ExpandableNameField
+
 from .object_create import ComponentCreateForm
 
 __all__ = (

+ 5 - 2
netbox/dcim/forms/bulk_edit.py

@@ -8,10 +8,13 @@ from dcim.constants import *
 from dcim.models import *
 from extras.models import ConfigTemplate
 from ipam.choices import VLANQinQRoleChoices
-from ipam.models import ASN, VLAN, VLANGroup, VRF
+from ipam.models import ASN, VLAN, VRF, VLANGroup
 from netbox.choices import *
 from netbox.forms import (
-    NestedGroupModelBulkEditForm, NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm,
+    NestedGroupModelBulkEditForm,
+    NetBoxModelBulkEditForm,
+    OrganizationalModelBulkEditForm,
+    PrimaryModelBulkEditForm,
 )
 from netbox.forms.mixins import ChangelogMessageMixin, OwnerMixin
 from tenancy.models import Tenant

+ 10 - 2
netbox/dcim/forms/bulk_import.py

@@ -13,16 +13,24 @@ from ipam.choices import VLANQinQRoleChoices
 from ipam.models import VLAN, VRF, IPAddress, VLANGroup
 from netbox.choices import *
 from netbox.forms import (
-    NestedGroupModelImportForm, NetBoxModelImportForm, OrganizationalModelImportForm, OwnerCSVMixin,
+    NestedGroupModelImportForm,
+    NetBoxModelImportForm,
+    OrganizationalModelImportForm,
+    OwnerCSVMixin,
     PrimaryModelImportForm,
 )
 from tenancy.models import Tenant
 from utilities.forms.fields import (
-    CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVTypedChoiceField,
+    CSVChoiceField,
+    CSVContentTypeField,
+    CSVModelChoiceField,
+    CSVModelMultipleChoiceField,
+    CSVTypedChoiceField,
     SlugField,
 )
 from virtualization.models import Cluster, VirtualMachine, VMInterface
 from wireless.choices import WirelessRoleChoices
+
 from .common import ModuleCommonForm
 
 __all__ = (

+ 1 - 0
netbox/dcim/forms/connections.py

@@ -5,6 +5,7 @@ from django.utils.translation import gettext_lazy as _
 from circuits.models import Circuit, CircuitTermination
 from dcim.models import *
 from utilities.forms.fields import DynamicModelMultipleChoiceField
+
 from .model_forms import CableForm
 
 

+ 3 - 1
netbox/dcim/forms/filtersets.py

@@ -9,7 +9,9 @@ from extras.models import ConfigTemplate
 from ipam.models import ASN, VRF, VLANTranslationPolicy
 from netbox.choices import *
 from netbox.forms import (
-    NestedGroupModelFilterSetForm, NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm,
+    NestedGroupModelFilterSetForm,
+    NetBoxModelFilterSetForm,
+    OrganizationalModelFilterSetForm,
     PrimaryModelFilterSetForm,
 )
 from netbox.forms.mixins import OwnerFilterMixin

+ 4 - 2
netbox/dcim/forms/mixins.py

@@ -9,10 +9,12 @@ from dcim.constants import LOCATION_SCOPE_TYPES
 from dcim.models import PortMapping, PortTemplateMapping, Site
 from utilities.forms import get_field_value
 from utilities.forms.fields import (
-    ContentTypeChoiceField, CSVContentTypeField, DynamicModelChoiceField,
+    ContentTypeChoiceField,
+    CSVContentTypeField,
+    DynamicModelChoiceField,
 )
-from utilities.templatetags.builtins.filters import bettertitle
 from utilities.forms.widgets import HTMXSelect
+from utilities.templatetags.builtins.filters import bettertitle
 
 __all__ = (
     'FrontPortFormMixin',

+ 13 - 3
netbox/dcim/forms/model_forms.py

@@ -10,22 +10,32 @@ from dcim.forms.mixins import FrontPortFormMixin
 from dcim.models import *
 from extras.models import ConfigTemplate
 from ipam.choices import VLANQinQRoleChoices
-from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VLANTranslationPolicy, VRF
+from ipam.models import ASN, VLAN, VRF, IPAddress, VLANGroup, VLANTranslationPolicy
 from netbox.forms import NestedGroupModelForm, NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm
 from netbox.forms.mixins import ChangelogMessageMixin, OwnerMixin
 from tenancy.forms import TenancyForm
 from users.models import User
 from utilities.forms import add_blank_choice, get_field_value
 from utilities.forms.fields import (
-    DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SlugField,
+    DynamicModelChoiceField,
+    DynamicModelMultipleChoiceField,
+    JSONField,
+    NumericArrayField,
+    SlugField,
 )
 from utilities.forms.rendering import FieldSet, InlineFields, TabbedGroups
 from utilities.forms.widgets import (
-    APISelect, ClearableFileInput, ClearableSelect, HTMXSelect, NumberWithOptions, SelectWithPK,
+    APISelect,
+    ClearableFileInput,
+    ClearableSelect,
+    HTMXSelect,
+    NumberWithOptions,
+    SelectWithPK,
 )
 from utilities.jsonschema import JSONSchemaProperty
 from virtualization.models import Cluster, VMInterface
 from wireless.models import WirelessLAN, WirelessLANGroup
+
 from .common import InterfaceCommonForm, ModuleCommonForm
 
 __all__ = (

+ 1 - 0
netbox/dcim/forms/object_create.py

@@ -7,6 +7,7 @@ from netbox.forms.mixins import OwnerMixin
 from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField
 from utilities.forms.rendering import FieldSet, TabbedGroups
 from utilities.forms.widgets import APISelect
+
 from . import model_forms
 
 __all__ = (

+ 5 - 3
netbox/dcim/graphql/filter_mixins.py

@@ -1,5 +1,5 @@
 from dataclasses import dataclass
-from typing import Annotated, TYPE_CHECKING
+from typing import TYPE_CHECKING, Annotated
 
 import strawberry
 import strawberry_django
@@ -7,13 +7,15 @@ from strawberry import ID
 from strawberry_django import BaseFilterLookup, FilterLookup
 
 from core.graphql.filters import ContentTypeFilter
+
 from .enums import *
 
 if TYPE_CHECKING:
-    from netbox.graphql.filter_lookups import IntegerLookup
+    from dcim.graphql.filters import LocationFilter, RegionFilter, SiteFilter, SiteGroupFilter
     from extras.graphql.filters import ConfigTemplateFilter
     from ipam.graphql.filters import VLANFilter, VLANTranslationPolicyFilter
-    from dcim.graphql.filters import LocationFilter, RegionFilter, SiteFilter, SiteGroupFilter
+    from netbox.graphql.filter_lookups import IntegerLookup
+
     from .filters import *
 
 __all__ = (

Некоторые файлы не были показаны из-за большого количества измененных файлов