diff --git a/netbox/account/urls.py b/netbox/account/urls.py index d74677599..8f7d063a0 100644 --- a/netbox/account/urls.py +++ b/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' diff --git a/netbox/account/views.py b/netbox/account/views.py index 7dd423919..b0502f939 100644 --- a/netbox/account/views.py +++ b/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. diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 9a2af4a67..1035dfa96 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -1,2 +1,2 @@ -from .serializers_.providers import * from .serializers_.circuits import * +from .serializers_.providers import * diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 6ac4f39a3..af6fbc3ec 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/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__ = ( diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index 875c5c7f2..4ec01f134 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/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__ = ( diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index 3be620bd2..84f239447 100644 --- a/netbox/circuits/api/urls.py +++ b/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 diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index 05540d9ad..29c75dfdc 100644 --- a/netbox/circuits/api/views.py +++ b/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 diff --git a/netbox/circuits/apps.py b/netbox/circuits/apps.py index 7b29a1509..001470b2e 100644 --- a/netbox/circuits/apps.py +++ b/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 diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index 4d6132d7a..7ef01e85b 100644 --- a/netbox/circuits/choices.py +++ b/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' diff --git a/netbox/circuits/constants.py b/netbox/circuits/constants.py index 4642c22a3..e30982802 100644 --- a/netbox/circuits/constants.py +++ b/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', diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e41390909..d8d464d07 100644 --- a/netbox/circuits/filtersets.py +++ b/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 * diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index d03577ab9..1a0427445 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/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 diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index ec754f697..3065f6338 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/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 diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index d6e3300b8..e25f39a3a 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/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 diff --git a/netbox/circuits/graphql/filter_mixins.py b/netbox/circuits/graphql/filter_mixins.py index f7795f10a..87362e035 100644 --- a/netbox/circuits/graphql/filter_mixins.py +++ b/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 diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index 160dd9c2b..e72ee71e9 100644 --- a/netbox/circuits/graphql/filters.py +++ b/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__ = ( diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index 8592e929d..92538b498 100644 --- a/netbox/circuits/graphql/types.py +++ b/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: diff --git a/netbox/circuits/migrations/0001_squashed.py b/netbox/circuits/migrations/0001_squashed.py index 0b3d729e6..15b812645 100644 --- a/netbox/circuits/migrations/0001_squashed.py +++ b/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): diff --git a/netbox/circuits/migrations/0002_squashed_0029.py b/netbox/circuits/migrations/0002_squashed_0029.py index 0062575cd..3e5ca8d90 100644 --- a/netbox/circuits/migrations/0002_squashed_0029.py +++ b/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): diff --git a/netbox/circuits/migrations/0043_circuittype_color.py b/netbox/circuits/migrations/0043_circuittype_color.py index 400c419ef..a8730b20c 100644 --- a/netbox/circuits/migrations/0043_circuittype_color.py +++ b/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 diff --git a/netbox/circuits/migrations/0044_circuit_groups.py b/netbox/circuits/migrations/0044_circuit_groups.py index 08f6bc158..f848f06d2 100644 --- a/netbox/circuits/migrations/0044_circuit_groups.py +++ b/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 = [ diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 7e8ac4509..dfdf86a3c 100644 --- a/netbox/circuits/models/circuits.py +++ b/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__ = ( diff --git a/netbox/circuits/models/virtual_circuits.py b/netbox/circuits/models/virtual_circuits.py index c97a3560a..bdaa6309c 100644 --- a/netbox/circuits/models/virtual_circuits.py +++ b/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__ = ( diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index 6c25d3a9c..b1673fc1f 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/circuits/signals.py b/netbox/circuits/signals.py index 70f2abb41..6405a380b 100644 --- a/netbox/circuits/signals.py +++ b/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 diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index ae4e2c8bd..2b024f580 100644 --- a/netbox/circuits/tables/circuits.py +++ b/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__ = ( diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index 6b6a93608..92111d4c4 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/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 diff --git a/netbox/circuits/tests/test_tables.py b/netbox/circuits/tests/test_tables.py index 2ab001c9b..0e3ac1156 100644 --- a/netbox/circuits/tests/test_tables.py +++ b/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 diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index c5f232852..a2cb5464e 100644 --- a/netbox/circuits/urls.py +++ b/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' diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index a3266f460..970fb8560 100644 --- a/netbox/circuits/views.py +++ b/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( diff --git a/netbox/core/api/schema.py b/netbox/core/api/schema.py index 879712162..adc341f9c 100644 --- a/netbox/core/api/schema.py +++ b/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 diff --git a/netbox/core/api/urls.py b/netbox/core/api/urls.py index 5f2fcad10..31e9a24f5 100644 --- a/netbox/core/api/urls.py +++ b/netbox/core/api/urls.py @@ -1,4 +1,5 @@ from netbox.api.routers import NetBoxRouter + from . import views app_name = 'core-api' diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index 268d7d855..ab766c9dc 100644 --- a/netbox/core/api/views.py +++ b/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 diff --git a/netbox/core/apps.py b/netbox/core/apps.py index c081fb064..68b65f58c 100644 --- a/netbox/core/apps.py +++ b/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.models.features import register_models - from . import data_backends, events, search # noqa: F401 from netbox import context_managers # noqa: F401 + from netbox.models.features import register_models + + from . import data_backends, events, search # noqa: F401 # Register models register_models(*self.get_models()) diff --git a/netbox/core/checks.py b/netbox/core/checks.py index cab52a025..430eacbec 100644 --- a/netbox/core/checks.py +++ b/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', diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 6603a7d4f..a35001a78 100644 --- a/netbox/core/choices.py +++ b/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' diff --git a/netbox/core/data_backends.py b/netbox/core/data_backends.py index 86e16afa2..11f9900b5 100644 --- a/netbox/core/data_backends.py +++ b/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__ = ( diff --git a/netbox/core/dataclasses.py b/netbox/core/dataclasses.py index 21f97d01d..502dfa9a9 100644 --- a/netbox/core/dataclasses.py +++ b/netbox/core/dataclasses.py @@ -1,5 +1,4 @@ import logging - from dataclasses import dataclass, field from datetime import datetime diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 06f5748e4..2539b0c8a 100644 --- a/netbox/core/filtersets.py +++ b/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 * diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index d0e78507c..7b931190e 100644 --- a/netbox/core/forms/filtersets.py +++ b/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 diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 3b699b0d0..4f26d6024 100644 --- a/netbox/core/forms/model_forms.py +++ b/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 diff --git a/netbox/core/graphql/filter_mixins.py b/netbox/core/graphql/filter_mixins.py index 7383f6c4e..c094ecb24 100644 --- a/netbox/core/graphql/filter_mixins.py +++ b/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 diff --git a/netbox/core/graphql/filters.py b/netbox/core/graphql/filters.py index 2e78b878b..b4fe7af73 100644 --- a/netbox/core/graphql/filters.py +++ b/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: diff --git a/netbox/core/graphql/mixins.py b/netbox/core/graphql/mixins.py index bbcf1954c..27a9ee9eb 100644 --- a/netbox/core/graphql/mixins.py +++ b/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 diff --git a/netbox/core/graphql/types.py b/netbox/core/graphql/types.py index 12407b5c7..98e7aefae 100644 --- a/netbox/core/graphql/types.py +++ b/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__ = ( diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index 8b516e660..5859a9989 100644 --- a/netbox/core/jobs.py +++ b/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 diff --git a/netbox/core/management/commands/rqworker.py b/netbox/core/management/commands/rqworker.py index b2879c3d8..722150c72 100644 --- a/netbox/core/management/commands/rqworker.py +++ b/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') diff --git a/netbox/core/migrations/0008_contenttype_proxy.py b/netbox/core/migrations/0008_contenttype_proxy.py index a0af81813..271a183d4 100644 --- a/netbox/core/migrations/0008_contenttype_proxy.py +++ b/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 = [ diff --git a/netbox/core/models/__init__.py b/netbox/core/models/__init__.py index 27eb3a92b..07baf3fa5 100644 --- a/netbox/core/models/__init__.py +++ b/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 * diff --git a/netbox/core/models/change_logging.py b/netbox/core/models/change_logging.py index a011c457f..c5aab1838 100644 --- a/netbox/core/models/change_logging.py +++ b/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__ = ( diff --git a/netbox/core/models/config.py b/netbox/core/models/config.py index 5ad4cbe69..ac793d089 100644 --- a/netbox/core/models/config.py +++ b/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 diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 7565a7a20..8b4d0fd79 100644 --- a/netbox/core/models/data.py +++ b/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 diff --git a/netbox/core/models/files.py b/netbox/core/models/files.py index f51d12cfa..63027c587 100644 --- a/netbox/core/models/files.py +++ b/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', ) diff --git a/netbox/core/search.py b/netbox/core/search.py index 158911e6a..d87d4caee 100644 --- a/netbox/core/search.py +++ b/netbox/core/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/core/signals.py b/netbox/core/signals.py index edb95ae06..cdb787667 100644 --- a/netbox/core/signals.py +++ b/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__ = ( diff --git a/netbox/core/tables/__init__.py b/netbox/core/tables/__init__.py index cec7342f9..7ca351668 100644 --- a/netbox/core/tables/__init__.py +++ b/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 * diff --git a/netbox/core/tables/change_logging.py b/netbox/core/tables/change_logging.py index b35b711bb..535b73606 100644 --- a/netbox/core/tables/change_logging.py +++ b/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__ = ( diff --git a/netbox/core/tables/data.py b/netbox/core/tables/data.py index db688b22a..891e6b419 100644 --- a/netbox/core/tables/data.py +++ b/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 diff --git a/netbox/core/tables/jobs.py b/netbox/core/tables/jobs.py index 3720baa39..2406101a1 100644 --- a/netbox/core/tables/jobs.py +++ b/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): diff --git a/netbox/core/tables/plugins.py b/netbox/core/tables/plugins.py index d3f459cf3..42700b4e9 100644 --- a/netbox/core/tables/plugins.py +++ b/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__ = ( diff --git a/netbox/core/tests/test_api.py b/netbox/core/tests/test_api.py index a1dcf04d5..3d1857481 100644 --- a/netbox/core/tests/test_api.py +++ b/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 * diff --git a/netbox/core/tests/test_changelog.py b/netbox/core/tests/test_changelog.py index b9242605f..c3924bccb 100644 --- a/netbox/core/tests/test_changelog.py +++ b/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 * diff --git a/netbox/core/tests/test_filtersets.py b/netbox/core/tests/test_filtersets.py index 613833192..6659b382b 100644 --- a/netbox/core/tests/test_filtersets.py +++ b/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 * diff --git a/netbox/core/tests/test_models.py b/netbox/core/tests/test_models.py index 3a1c2acc7..d79f30b26 100644 --- a/netbox/core/tests/test_models.py +++ b/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 diff --git a/netbox/core/tests/test_openapi_schema.py b/netbox/core/tests/test_openapi_schema.py index 7fbe5662a..8158b87ec 100644 --- a/netbox/core/tests/test_openapi_schema.py +++ b/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 diff --git a/netbox/core/tests/test_views.py b/netbox/core/tests/test_views.py index 2f0ef59e6..f4254a299 100644 --- a/netbox/core/tests/test_views.py +++ b/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 diff --git a/netbox/core/urls.py b/netbox/core/urls.py index b922c8bed..572d5e65b 100644 --- a/netbox/core/urls.py +++ b/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' diff --git a/netbox/core/utils.py b/netbox/core/utils.py index 26adfdfa2..d5be09b49 100644 --- a/netbox/core/utils.py +++ b/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, diff --git a/netbox/core/views.py b/netbox/core/views.py index 133396ac2..be39dbabd 100644 --- a/netbox/core/views.py +++ b/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( diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 30aa2e1a0..33b43e7fe 100644 --- a/netbox/dcim/api/serializers.py +++ b/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 * diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 0ed0cf851..72e09afe5 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index e56471dd5..09a850ad5 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 6346a3b43..7be8e42c9 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index 9a9b5d470..147bc1701 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/devicetypes.py b/netbox/dcim/api/serializers_/devicetypes.py index 797d31d87..9df6dddd7 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/nested.py b/netbox/dcim/api/serializers_/nested.py index 5b1be4d98..2c72c429b 100644 --- a/netbox/dcim/api/serializers_/nested.py +++ b/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', diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index c86bd9773..26c1f20ec 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/power.py b/netbox/dcim/api/serializers_/power.py index a9f83cdbe..598a3c85e 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index e6f15ccfc..b87140bed 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/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 diff --git a/netbox/dcim/api/serializers_/rackunits.py b/netbox/dcim/api/serializers_/rackunits.py index 1f5306718..f2ffb9a56 100644 --- a/netbox/dcim/api/serializers_/rackunits.py +++ b/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__ = ( diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index a1c1d2be9..5d7cc609b 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/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__ = ( diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index d0f632945..7e49421b7 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/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__ = ( diff --git a/netbox/dcim/api/serializers_/virtualchassis.py b/netbox/dcim/api/serializers_/virtualchassis.py index 5e2ac7bec..d92f65514 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/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__ = ( diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 734ac13db..e20e36c2f 100644 --- a/netbox/dcim/api/urls.py +++ b/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 diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 9ecaaa76a..8a9d32c69 100644 --- a/netbox/dcim/api/views.py +++ b/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 diff --git a/netbox/dcim/apps.py b/netbox/dcim/apps.py index 67ff17489..0aad86fc8 100644 --- a/netbox/dcim/apps.py +++ b/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 diff --git a/netbox/dcim/base_filtersets.py b/netbox/dcim/base_filtersets.py index 2343d1899..854f59849 100644 --- a/netbox/dcim/base_filtersets.py +++ b/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__ = ( diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 1be3f7ca4..511d30bfc 100644 --- a/netbox/dcim/choices.py +++ b/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' diff --git a/netbox/dcim/fields.py b/netbox/dcim/fields.py index 5985aad3c..70a88d9c7 100644 --- a/netbox/dcim/fields.py +++ b/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 diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 228fb44ec..09f76d60b 100644 --- a/netbox/dcim/filtersets.py +++ b/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 * diff --git a/netbox/dcim/forms/__init__.py b/netbox/dcim/forms/__init__.py index 7510a979f..3d051df98 100644 --- a/netbox/dcim/forms/__init__.py +++ b/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 * diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index 337bb402f..bfa492111 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/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__ = ( diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 00a0667a7..8f4396e20 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/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 diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 066eb03fb..e26ab3b0d 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/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__ = ( diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index d3588da39..7694e61b9 100644 --- a/netbox/dcim/forms/connections.py +++ b/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 diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 2c539e896..28e9ee000 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/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 diff --git a/netbox/dcim/forms/mixins.py b/netbox/dcim/forms/mixins.py index 30314274d..a7d7a055d 100644 --- a/netbox/dcim/forms/mixins.py +++ b/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', diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 13d5f512b..2ad36d4fc 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/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__ = ( diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 2354ee5c5..a367d55b3 100644 --- a/netbox/dcim/forms/object_create.py +++ b/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__ = ( diff --git a/netbox/dcim/graphql/filter_mixins.py b/netbox/dcim/graphql/filter_mixins.py index f86969a8e..26c3daf5f 100644 --- a/netbox/dcim/graphql/filter_mixins.py +++ b/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__ = ( diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index edf6127c2..df878d3a3 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -1,8 +1,8 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated -from django.db.models import Q import strawberry import strawberry_django +from django.db.models import Q from strawberry.scalars import ID from strawberry_django import BaseFilterLookup, ComparisonFilterLookup, FilterLookup @@ -10,14 +10,21 @@ from dcim import models from dcim.constants import * from dcim.graphql.enums import InterfaceKindEnum from dcim.graphql.filter_mixins import ( - ComponentModelFilterMixin, ComponentTemplateFilterMixin, ModularComponentFilterMixin, - ModularComponentTemplateFilterMixin, RackFilterMixin, + ComponentModelFilterMixin, + ComponentTemplateFilterMixin, + ModularComponentFilterMixin, + ModularComponentTemplateFilterMixin, + RackFilterMixin, ) from extras.graphql.filter_mixins import ConfigContextFilterMixin from netbox.graphql.filter_mixins import ImageAttachmentFilterMixin, WeightFilterMixin from netbox.graphql.filters import ( - BaseModelFilter, ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter, + BaseModelFilter, + ChangeLoggedModelFilter, + NestedGroupModelFilter, NetBoxModelFilter, + OrganizationalModelFilter, + PrimaryModelFilter, ) from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin from virtualization.models import VMInterface @@ -32,7 +39,12 @@ if TYPE_CHECKING: from core.graphql.filters import ContentTypeFilter from extras.graphql.filters import ConfigTemplateFilter, ImageAttachmentFilter from ipam.graphql.filters import ( - ASNFilter, FHRPGroupAssignmentFilter, IPAddressFilter, PrefixFilter, VLANGroupFilter, VRFFilter, + ASNFilter, + FHRPGroupAssignmentFilter, + IPAddressFilter, + PrefixFilter, + VLANGroupFilter, + VRFFilter, ) from netbox.graphql.enums import ColorEnum from netbox.graphql.filter_lookups import FloatLookup, IntegerArrayLookup, IntegerLookup, TreeNodeFilter @@ -41,6 +53,7 @@ if TYPE_CHECKING: from vpn.graphql.filters import L2VPNFilter, TunnelTerminationFilter from wireless.graphql.enums import WirelessChannelEnum, WirelessRoleEnum from wireless.graphql.filters import WirelessLANFilter, WirelessLinkFilter + from .enums import * __all__ = ( diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index ac704c28e..d39b07efa 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/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 @@ -9,9 +9,14 @@ from extras.graphql.mixins import ConfigContextMixin, ContactsMixin, ImageAttach from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from netbox.graphql.scalars import BigInt from netbox.graphql.types import ( - BaseObjectType, NestedGroupObjectType, NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType, + BaseObjectType, + NestedGroupObjectType, + NetBoxObjectType, + OrganizationalObjectType, + PrimaryObjectType, ) from users.graphql.mixins import OwnerMixin + from .filters import * from .mixins import CabledObjectMixin, PathEndpointMixin @@ -29,7 +34,7 @@ if TYPE_CHECKING: ) from tenancy.graphql.types import TenantType from users.graphql.types import UserType - from virtualization.graphql.types import ClusterType, VMInterfaceType, VirtualMachineType + from virtualization.graphql.types import ClusterType, VirtualMachineType, VMInterfaceType from vpn.graphql.types import L2VPNTerminationType from wireless.graphql.types import WirelessLANType, WirelessLinkType diff --git a/netbox/dcim/management/commands/buildschema.py b/netbox/dcim/management/commands/buildschema.py index 62af08edc..889c8f0ae 100644 --- a/netbox/dcim/management/commands/buildschema.py +++ b/netbox/dcim/management/commands/buildschema.py @@ -3,7 +3,7 @@ import os from django.conf import settings from django.core.management.base import BaseCommand -from jinja2 import FileSystemLoader, Environment +from jinja2 import Environment, FileSystemLoader from dcim.choices import * from netbox.choices import WeightUnitChoices diff --git a/netbox/dcim/migrations/0001_squashed.py b/netbox/dcim/migrations/0001_squashed.py index f08fe1d70..8e1bb2112 100644 --- a/netbox/dcim/migrations/0001_squashed.py +++ b/netbox/dcim/migrations/0001_squashed.py @@ -1,15 +1,16 @@ -import dcim.fields -import ipam.fields import django.contrib.postgres.fields -from utilities.json import CustomFieldJSONEncoder import django.core.validators -from django.db import migrations, models import django.db.models.deletion import timezone_field.fields +from django.db import migrations, models + +import dcim.fields +import ipam.fields import utilities.fields import utilities.ordering import utilities.query_functions import utilities.validators +from utilities.json import CustomFieldJSONEncoder class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0002_squashed.py b/netbox/dcim/migrations/0002_squashed.py index ae1966e58..9a2fbc786 100644 --- a/netbox/dcim/migrations/0002_squashed.py +++ b/netbox/dcim/migrations/0002_squashed.py @@ -1,8 +1,8 @@ -from django.conf import settings -from django.db import migrations, models import django.db.models.deletion import mptt.fields import taggit.managers +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0003_squashed_0130.py b/netbox/dcim/migrations/0003_squashed_0130.py index 490ab8e8b..67a84a385 100644 --- a/netbox/dcim/migrations/0003_squashed_0130.py +++ b/netbox/dcim/migrations/0003_squashed_0130.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): diff --git a/netbox/dcim/migrations/0131_squashed_0159.py b/netbox/dcim/migrations/0131_squashed_0159.py index 1c1f2ff38..eb7787887 100644 --- a/netbox/dcim/migrations/0131_squashed_0159.py +++ b/netbox/dcim/migrations/0131_squashed_0159.py @@ -1,9 +1,10 @@ -import dcim.fields import django.core.validators -from django.db import migrations, models import django.db.models.deletion import mptt.fields import taggit.managers +from django.db import migrations, models + +import dcim.fields import utilities.fields import utilities.json import utilities.ordering diff --git a/netbox/dcim/migrations/0184_protect_child_interfaces.py b/netbox/dcim/migrations/0184_protect_child_interfaces.py index 58eca506d..f352c385a 100644 --- a/netbox/dcim/migrations/0184_protect_child_interfaces.py +++ b/netbox/dcim/migrations/0184_protect_child_interfaces.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.6 on 2023-10-20 11:48 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0191_module_bay_rebuild.py b/netbox/dcim/migrations/0191_module_bay_rebuild.py index 4f8a461f2..f7d114748 100644 --- a/netbox/dcim/migrations/0191_module_bay_rebuild.py +++ b/netbox/dcim/migrations/0191_module_bay_rebuild.py @@ -1,6 +1,6 @@ -from django.db import migrations import mptt import mptt.managers +from django.db import migrations def rebuild_mptt(apps, schema_editor): diff --git a/netbox/dcim/migrations/0193_poweroutlet_color.py b/netbox/dcim/migrations/0193_poweroutlet_color.py index f7e3c430c..60749f85f 100644 --- a/netbox/dcim/migrations/0193_poweroutlet_color.py +++ b/netbox/dcim/migrations/0193_poweroutlet_color.py @@ -1,8 +1,9 @@ # Generated by Django 5.0.9 on 2024-09-26 19:31 -import utilities.fields from django.db import migrations +import utilities.fields + class Migration(migrations.Migration): dependencies = [ diff --git a/netbox/dcim/migrations/0204_device_role_rebuild.py b/netbox/dcim/migrations/0204_device_role_rebuild.py index 69837c522..045b3b2ba 100644 --- a/netbox/dcim/migrations/0204_device_role_rebuild.py +++ b/netbox/dcim/migrations/0204_device_role_rebuild.py @@ -1,6 +1,6 @@ -from django.db import migrations import mptt import mptt.managers +from django.db import migrations def rebuild_mptt(apps, schema_editor): diff --git a/netbox/dcim/migrations/0214_platform_rebuild.py b/netbox/dcim/migrations/0214_platform_rebuild.py index 786703c62..307d34e83 100644 --- a/netbox/dcim/migrations/0214_platform_rebuild.py +++ b/netbox/dcim/migrations/0214_platform_rebuild.py @@ -1,6 +1,6 @@ -from django.db import migrations import mptt import mptt.managers +from django.db import migrations def rebuild_mptt(apps, schema_editor): diff --git a/netbox/dcim/migrations/0217_poweroutlettemplate_color.py b/netbox/dcim/migrations/0217_poweroutlettemplate_color.py index 95ebad57a..32ea3d2d7 100644 --- a/netbox/dcim/migrations/0217_poweroutlettemplate_color.py +++ b/netbox/dcim/migrations/0217_poweroutlettemplate_color.py @@ -1,6 +1,7 @@ -import utilities.fields from django.db import migrations +import utilities.fields + class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0219_devicetype_device_count.py b/netbox/dcim/migrations/0219_devicetype_device_count.py index c28304738..d9a9f4c5a 100644 --- a/netbox/dcim/migrations/0219_devicetype_device_count.py +++ b/netbox/dcim/migrations/0219_devicetype_device_count.py @@ -1,7 +1,8 @@ -import utilities.fields from django.db import migrations from django.db.models import Count, OuterRef, Subquery +import utilities.fields + def _populate_count_for_type( apps, schema_editor, app_name: str, model_name: str, target_field: str, related_name: str = 'instances' diff --git a/netbox/dcim/migrations/0222_port_mappings.py b/netbox/dcim/migrations/0222_port_mappings.py index 42de44dbc..0c23c5a6b 100644 --- a/netbox/dcim/migrations/0222_port_mappings.py +++ b/netbox/dcim/migrations/0222_port_mappings.py @@ -1,8 +1,8 @@ +from itertools import islice + import django.core.validators import django.db.models.deletion -from django.db import migrations -from django.db import models -from itertools import islice +from django.db import migrations, models def chunked(iterable, size): diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 9835e13f8..09ca106c7 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -24,6 +24,7 @@ from utilities.fields import ColorField, GenericArrayForeignKey from utilities.querysets import RestrictedQuerySet from utilities.serialization import deserialize_object, serialize_object from wireless.models import WirelessLink + from .device_components import FrontPort, PathEndpoint, PortMapping, RearPort __all__ = ( @@ -718,7 +719,7 @@ class CablePath(models.Model): Cable or WirelessLink connects (interfaces, console ports, circuit termination, etc.). All terminations must be of the same type and must belong to the same parent object. """ - from circuits.models import CircuitTermination, Circuit + from circuits.models import Circuit, CircuitTermination if not terminations: return None diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 22b48bc45..0d54331d8 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -15,12 +15,20 @@ from utilities.mptt import TreeManager from utilities.ordering import naturalize_interface from utilities.tracking import TrackingModelMixin from wireless.choices import WirelessRoleChoices + from .device_components import ( - ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, InventoryItem, ModuleBay, PowerOutlet, PowerPort, + ConsolePort, + ConsoleServerPort, + DeviceBay, + FrontPort, + Interface, + InventoryItem, + ModuleBay, + PowerOutlet, + PowerPort, RearPort, ) - __all__ = ( 'ConsolePortTemplate', 'ConsoleServerPortTemplate', diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index dd5696bc0..feda9db71 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -15,7 +15,7 @@ from dcim.fields import WWNField from dcim.models.base import PortMappingBase from dcim.models.mixins import InterfaceValidationMixin from netbox.choices import ColorChoices -from netbox.models import OrganizationalModel, NetBoxModel +from netbox.models import NetBoxModel, OrganizationalModel from netbox.models.mixins import OwnerMixin from utilities.fields import ColorField, NaturalOrderingField from utilities.mptt import TreeManager diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 12de3f477..fd5e7a7ec 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -29,6 +29,7 @@ from netbox.models.mixins import WeightMixin from utilities.fields import ColorField, CounterCacheField from utilities.prefetch import get_prefetchable_fields from utilities.tracking import TrackingModelMixin + from .device_components import * from .mixins import RenderConfigMixin from .modules import Module diff --git a/netbox/dcim/models/modules.py b/netbox/dcim/models/modules.py index d718cc08c..bf289decc 100644 --- a/netbox/dcim/models/modules.py +++ b/netbox/dcim/models/modules.py @@ -16,6 +16,7 @@ from utilities.fields import CounterCacheField from utilities.jsonschema import validate_schema from utilities.string import title from utilities.tracking import TrackingModelMixin + from .device_components import * __all__ = ( diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index 284cfe832..4c2825e57 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -8,6 +8,7 @@ from netbox.config import ConfigItem from netbox.models import PrimaryModel from netbox.models.features import ContactsMixin, ImageAttachmentsMixin from utilities.validators import ExclusionValidator + from .device_components import CabledObjectModel, PathEndpoint __all__ = ( diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index c4eaa7e20..60707cb06 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -15,12 +15,13 @@ from dcim.constants import * from dcim.svg import RackElevationSVG from netbox.choices import ColorChoices from netbox.models import OrganizationalModel, PrimaryModel -from netbox.models.mixins import WeightMixin from netbox.models.features import ContactsMixin, ImageAttachmentsMixin +from netbox.models.mixins import WeightMixin from utilities.conversion import to_grams from utilities.data import array_to_string, drange from utilities.fields import ColorField, CounterCacheField from utilities.tracking import TrackingModelMixin + from .device_components import PowerPort from .devices import Device from .modules import Module diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index 00dcbfad5..f956786c6 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index dd9b7a0a6..dd37817d1 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -8,10 +8,29 @@ from dcim.choices import CableEndChoices, LinkStatusChoices from ipam.models import Prefix from virtualization.models import Cluster, VMInterface from wireless.models import WirelessLAN + from .models import ( - Cable, CablePath, CableTermination, ConsolePort, ConsoleServerPort, Device, DeviceBay, FrontPort, Interface, - InventoryItem, Location, ModuleBay, PathEndpoint, PortMapping, PowerOutlet, PowerPanel, PowerPort, Rack, RearPort, - Site, VirtualChassis, + Cable, + CablePath, + CableTermination, + ConsolePort, + ConsoleServerPort, + Device, + DeviceBay, + FrontPort, + Interface, + InventoryItem, + Location, + ModuleBay, + PathEndpoint, + PortMapping, + PowerOutlet, + PowerPanel, + PowerPort, + Rack, + RearPort, + Site, + VirtualChassis, ) from .models.cables import trace_paths from .utils import create_cablepaths, rebuild_paths diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index b263a27cc..2d780fd61 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -1,10 +1,9 @@ import svgwrite +from django.conf import settings from svgwrite.container import Group, Hyperlink from svgwrite.shapes import Line, Polyline, Rect from svgwrite.text import Text -from django.conf import settings - from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH from utilities.html import foreground_color diff --git a/netbox/dcim/svg/racks.py b/netbox/dcim/svg/racks.py index 7bea9d91d..1256a1fbf 100644 --- a/netbox/dcim/svg/racks.py +++ b/netbox/dcim/svg/racks.py @@ -1,24 +1,23 @@ import decimal -import svgwrite -from svgwrite.container import Hyperlink -from svgwrite.image import Image -from svgwrite.gradients import LinearGradient -from svgwrite.masking import ClipPath -from svgwrite.shapes import Rect -from svgwrite.text import Text +import svgwrite from django.conf import settings from django.core.exceptions import FieldError from django.db.models import Q from django.template.defaultfilters import floatformat from django.urls import reverse from django.utils.http import urlencode +from svgwrite.container import Hyperlink +from svgwrite.gradients import LinearGradient +from svgwrite.image import Image +from svgwrite.masking import ClipPath +from svgwrite.shapes import Rect +from svgwrite.text import Text +from dcim.constants import RACK_ELEVATION_BORDER_WIDTH from netbox.config import get_config from utilities.data import array_to_ranges from utilities.html import foreground_color -from dcim.constants import RACK_ELEVATION_BORDER_WIDTH - __all__ = ( 'RackElevationSVG', diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index 72220591e..06c1b3056 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -7,6 +7,7 @@ from django_tables2.utils import Accessor from dcim.models import Cable from netbox.tables import PrimaryModelTable, columns from tenancy.tables import TenancyColumnsMixin + from .template_code import CABLE_LENGTH __all__ = ( diff --git a/netbox/dcim/tables/connections.py b/netbox/dcim/tables/connections.py index 40205a7a0..40dc372a9 100644 --- a/netbox/dcim/tables/connections.py +++ b/netbox/dcim/tables/connections.py @@ -1,9 +1,10 @@ -from django.utils.translation import gettext_lazy as _ import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ from django_tables2.utils import Accessor -from netbox.tables import BaseTable, columns from dcim.models import ConsolePort, Interface, PowerPort +from netbox.tables import BaseTable, columns + from .devices import PathEndpointTable __all__ = ( diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 409a5c101..b26d641c4 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -5,6 +5,7 @@ from django_tables2.utils import Accessor from dcim import models from netbox.tables import NestedGroupModelTable, NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin + from .template_code import * __all__ = ( diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index ee11fe787..652ff9d45 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim import models from netbox.tables import NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin + from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS, WEIGHT __all__ = ( diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py index 92f5183b7..8e857072c 100644 --- a/netbox/dcim/tables/modules.py +++ b/netbox/dcim/tables/modules.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import Module, ModuleType, ModuleTypeProfile from netbox.tables import PrimaryModelTable, columns + from .template_code import MODULETYPEPROFILE_ATTRIBUTES, WEIGHT __all__ = ( diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index d7d62ea17..feae780ad 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import PowerFeed, PowerPanel from netbox.tables import PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin + from .devices import CableTerminationTable __all__ = ( diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index c61d82434..639a5ff48 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -5,6 +5,7 @@ from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole, RackType from netbox.tables import OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin + from .template_code import OUTER_UNIT, WEIGHT __all__ = ( diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 544fb3cf8..66b5df3b4 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import Location, Region, Site, SiteGroup from netbox.tables import NestedGroupModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin + from .template_code import LOCATION_BUTTONS __all__ = ( diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 3c1d529be..23ca1ba62 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -5,7 +5,7 @@ from dcim.choices import * from dcim.filtersets import * from dcim.models import * from ipam.choices import VLANQinQRoleChoices -from ipam.models import ASN, IPAddress, RIR, VLAN, VLANTranslationPolicy, VRF +from ipam.models import ASN, RIR, VLAN, VRF, IPAddress, VLANTranslationPolicy from netbox.choices import ColorChoices, WeightUnitChoices from tenancy.models import Tenant, TenantGroup from users.models import User diff --git a/netbox/dcim/tests/test_forms.py b/netbox/dcim/tests/test_forms.py index a911cbf25..118c347fd 100644 --- a/netbox/dcim/tests/test_forms.py +++ b/netbox/dcim/tests/test_forms.py @@ -1,7 +1,11 @@ from django.test import TestCase from dcim.choices import ( - DeviceFaceChoices, DeviceStatusChoices, InterfaceModeChoices, InterfaceTypeChoices, PortTypeChoices, + DeviceFaceChoices, + DeviceStatusChoices, + InterfaceModeChoices, + InterfaceTypeChoices, + PortTypeChoices, PowerOutletStatusChoices, ) from dcim.forms import * diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 6e843015e..c3c3acf99 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -1,5 +1,5 @@ from django.core.exceptions import ValidationError -from django.test import tag, TestCase +from django.test import TestCase, tag from circuits.models import * from core.models import ObjectType diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 122593834..b24c81069 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views app_name = 'dcim' diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index d0497323d..df6fcd55c 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -15,12 +15,17 @@ from django.views.generic import View from circuits.models import Circuit, CircuitTermination from extras.ui.panels import CustomFieldsPanel, ImageAttachmentsPanel, TagsPanel from extras.views import ObjectConfigContextView, ObjectRenderConfigView -from ipam.models import ASN, IPAddress, Prefix, VLAN, VLANGroup +from ipam.models import ASN, VLAN, IPAddress, Prefix, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.object_actions import * from netbox.ui import actions, layout from netbox.ui.panels import ( - CommentsPanel, JSONPanel, NestedGroupObjectPanel, ObjectsTablePanel, OrganizationalObjectPanel, RelatedObjectsPanel, + CommentsPanel, + JSONPanel, + NestedGroupObjectPanel, + ObjectsTablePanel, + OrganizationalObjectPanel, + RelatedObjectsPanel, TemplatePanel, ) from netbox.views import generic @@ -31,13 +36,18 @@ from utilities.query import count_related from utilities.query_functions import CollateAsChar from utilities.request import safe_for_redirect from utilities.views import ( - GetRelatedModelsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, ViewTab, register_model_view + GetRelatedModelsMixin, + GetReturnURLMixin, + ObjectPermissionRequiredMixin, + ViewTab, + register_model_view, ) from virtualization.filtersets import VirtualMachineFilterSet from virtualization.forms import VirtualMachineFilterForm from virtualization.models import Cluster, VirtualMachine from virtualization.tables import VirtualMachineTable from wireless.models import WirelessLAN + from . import filtersets, forms, tables from .choices import DeviceFaceChoices, InterfaceModeChoices from .models import * diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index 1ef4d1e1d..f2368dbf5 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -9,11 +9,11 @@ from extras.constants import CUSTOMFIELD_EMPTY_VALUES from extras.models import CustomField from utilities.api import get_serializer_for_model - # # Custom fields # + class CustomFieldDefaultValues: """ Return a dictionary of all CustomFields assigned to the parent model and their default values. diff --git a/netbox/extras/api/mixins.py b/netbox/extras/api/mixins.py index ac4617bb8..a98218b78 100644 --- a/netbox/extras/api/mixins.py +++ b/netbox/extras/api/mixins.py @@ -6,6 +6,7 @@ from rest_framework.status import HTTP_400_BAD_REQUEST from netbox.api.authentication import TokenWritePermission from netbox.api.renderers import TextRenderer + from .serializers import ConfigTemplateSerializer __all__ = ( diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index eb8d050cd..08063681d 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -1,5 +1,7 @@ from .serializers_.attachments import * from .serializers_.bookmarks import * +from .serializers_.configcontexts import * +from .serializers_.configtemplates import * from .serializers_.customfields import * from .serializers_.customlinks import * from .serializers_.dashboard import * @@ -7,8 +9,6 @@ from .serializers_.events import * from .serializers_.exporttemplates import * from .serializers_.journaling import * from .serializers_.notifications import * -from .serializers_.configcontexts import * -from .serializers_.configtemplates import * from .serializers_.savedfilters import * from .serializers_.scripts import * from .serializers_.tableconfigs import * diff --git a/netbox/extras/api/serializers_/configcontexts.py b/netbox/extras/api/serializers_/configcontexts.py index a29bf3a24..5a2bc1d18 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -4,15 +4,15 @@ from core.api.serializers_.data import DataFileSerializer, DataSourceSerializer from dcim.api.serializers_.devicetypes import DeviceTypeSerializer from dcim.api.serializers_.platforms import PlatformSerializer from dcim.api.serializers_.roles import DeviceRoleSerializer -from dcim.api.serializers_.sites import LocationSerializer, RegionSerializer, SiteSerializer, SiteGroupSerializer +from dcim.api.serializers_.sites import LocationSerializer, RegionSerializer, SiteGroupSerializer, SiteSerializer from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.models import ConfigContext, ConfigContextProfile, Tag from netbox.api.fields import SerializedPKRelatedField from netbox.api.serializers import ChangeLogMessageSerializer, PrimaryModelSerializer, ValidatedModelSerializer -from users.api.serializers_.mixins import OwnerMixin -from tenancy.api.serializers_.tenants import TenantSerializer, TenantGroupSerializer +from tenancy.api.serializers_.tenants import TenantGroupSerializer, TenantSerializer from tenancy.models import Tenant, TenantGroup -from virtualization.api.serializers_.clusters import ClusterSerializer, ClusterGroupSerializer, ClusterTypeSerializer +from users.api.serializers_.mixins import OwnerMixin +from virtualization.api.serializers_.clusters import ClusterGroupSerializer, ClusterSerializer, ClusterTypeSerializer from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( diff --git a/netbox/extras/api/urls.py b/netbox/extras/api/urls.py index 52cf28b16..9478fbeb2 100644 --- a/netbox/extras/api/urls.py +++ b/netbox/extras/api/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from netbox.api.routers import NetBoxRouter + from . import views router = NetBoxRouter() diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index a9f6763cd..e72ad1ab5 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -23,6 +23,7 @@ from netbox.api.renderers import TextRenderer from netbox.api.viewsets import BaseViewSet, NetBoxModelViewSet from utilities.exceptions import RQWorkerNotRunningException from utilities.request import copy_safe_request + from . import serializers from .mixins import ConfigTemplateRenderMixin diff --git a/netbox/extras/apps.py b/netbox/extras/apps.py index 21232f95f..8aad97cd2 100644 --- a/netbox/extras/apps.py +++ b/netbox/extras/apps.py @@ -6,6 +6,7 @@ class ExtrasConfig(AppConfig): def ready(self): from netbox.models.features import register_models + from . import dashboard, lookups, search, signals # noqa: F401 # Register models diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index d2a5d94e5..de319bd15 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -5,11 +5,11 @@ from django.utils.translation import gettext_lazy as _ from netbox.choices import ButtonColorChoices from utilities.choices import ChoiceSet - # # CustomFields # + class CustomFieldTypeChoices(ChoiceSet): TYPE_TEXT = 'text' diff --git a/netbox/extras/conditions.py b/netbox/extras/conditions.py index e1128c5dc..bcf005947 100644 --- a/netbox/extras/conditions.py +++ b/netbox/extras/conditions.py @@ -1,6 +1,7 @@ import functools import operator import re + from django.utils.translation import gettext as _ __all__ = ( diff --git a/netbox/extras/dashboard/utils.py b/netbox/extras/dashboard/utils.py index 20c508b2a..291c4a4ec 100644 --- a/netbox/extras/dashboard/utils.py +++ b/netbox/extras/dashboard/utils.py @@ -4,8 +4,8 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext as _ -from netbox.registry import registry from extras.constants import DEFAULT_DASHBOARD +from netbox.registry import registry __all__ = ( 'get_dashboard', diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index 39bfcb13d..23303df63 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -22,6 +22,7 @@ from utilities.proxy import resolve_proxies from utilities.querydict import dict_to_querydict from utilities.templatetags.builtins.filters import render_markdown from utilities.views import get_action_url + from .utils import register_widget __all__ = ( diff --git a/netbox/extras/events.py b/netbox/extras/events.py index c4f09fc43..5e80e3e05 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -16,6 +16,7 @@ from utilities.api import get_serializer_for_model from utilities.request import copy_safe_request from utilities.rqworker import get_rq_retry from utilities.serialization import serialize_object + from .choices import EventRuleActionChoices from .models import EventRule diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 36860cdac..2b995e52a 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -9,11 +9,10 @@ from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxM from tenancy.models import Tenant, TenantGroup from users.filterset_mixins import OwnerFilterMixin from users.models import Group, User -from utilities.filters import ( - MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter -) +from utilities.filters import MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter from utilities.filtersets import register_filterset from virtualization.models import Cluster, ClusterGroup, ClusterType + from .choices import * from .filters import TagFilter, TagIDFilter from .models import * diff --git a/netbox/extras/forms/__init__.py b/netbox/extras/forms/__init__.py index 8bebaeec2..37c17153d 100644 --- a/netbox/extras/forms/__init__.py +++ b/netbox/extras/forms/__init__.py @@ -1,6 +1,6 @@ -from .model_forms import * -from .filtersets import * from .bulk_edit import * from .bulk_import import * +from .filtersets import * from .misc import * +from .model_forms import * from .scripts import * diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index d57b2f27c..f98de1dd5 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -13,8 +13,13 @@ from netbox.forms import NetBoxModelImportForm, OwnerCSVMixin, PrimaryModelImpor from users.models import Group, User from utilities.forms import CSVModelForm from utilities.forms.fields import ( - CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVMultipleChoiceField, - CSVMultipleContentTypeField, SlugField, + CSVChoiceField, + CSVContentTypeField, + CSVModelChoiceField, + CSVModelMultipleChoiceField, + CSVMultipleChoiceField, + CSVMultipleContentTypeField, + SlugField, ) __all__ = ( diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 7ff458c0f..3fd551929 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from core.models import ObjectType, DataFile, DataSource +from core.models import DataFile, DataSource, ObjectType from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * @@ -12,7 +12,10 @@ from tenancy.models import Tenant, TenantGroup from users.models import Group, 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 diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index b0252962e..189a38418 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -9,8 +9,8 @@ from django.utils.translation import gettext_lazy as _ from core.forms.mixins import SyncedDataMixin from core.models import ObjectType from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup -from extras.constants import IMAGE_ATTACHMENT_IMAGE_FORMATS from extras.choices import * +from extras.constants import IMAGE_ATTACHMENT_IMAGE_FORMATS from extras.models import * from netbox.events import get_event_type_choices from netbox.forms import NetBoxModelForm, PrimaryModelForm @@ -19,8 +19,13 @@ from tenancy.models import Tenant, TenantGroup from users.models import Group, User from utilities.forms import get_field_value from utilities.forms.fields import ( - CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, - DynamicModelMultipleChoiceField, JSONField, SlugField, + CommentField, + ContentTypeChoiceField, + ContentTypeMultipleChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + JSONField, + SlugField, ) from utilities.forms.rendering import FieldSet, ObjectAttribute from utilities.forms.widgets import ChoicesWidget, HTMXSelect diff --git a/netbox/extras/forms/reports.py b/netbox/extras/forms/reports.py index 72d0417f2..54ac22400 100644 --- a/netbox/extras/forms/reports.py +++ b/netbox/extras/forms/reports.py @@ -2,8 +2,8 @@ from django import forms from django.utils.translation import gettext_lazy as _ from core.choices import JobIntervalChoices -from utilities.forms.widgets import DateTimePicker, NumberWithOptions from utilities.datetime import local_now +from utilities.forms.widgets import DateTimePicker, NumberWithOptions __all__ = ( 'ReportForm', diff --git a/netbox/extras/forms/scripts.py b/netbox/extras/forms/scripts.py index 5f9820b44..d1ea7c69c 100644 --- a/netbox/extras/forms/scripts.py +++ b/netbox/extras/forms/scripts.py @@ -1,8 +1,9 @@ -from core.choices import JobIntervalChoices -from core.forms import ManagedFileForm from django import forms from django.core.files.storage import storages from django.utils.translation import gettext_lazy as _ + +from core.choices import JobIntervalChoices +from core.forms import ManagedFileForm from utilities.datetime import local_now from utilities.forms.widgets import DateTimePicker, NumberWithOptions diff --git a/netbox/extras/graphql/filter_mixins.py b/netbox/extras/graphql/filter_mixins.py index 4b5636c0e..341db4771 100644 --- a/netbox/extras/graphql/filter_mixins.py +++ b/netbox/extras/graphql/filter_mixins.py @@ -1,11 +1,12 @@ from dataclasses import dataclass -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django if TYPE_CHECKING: from netbox.graphql.filter_lookups import JSONFilter + from .filters import * __all__ = ( diff --git a/netbox/extras/graphql/filters.py b/netbox/extras/graphql/filters.py index 12b773f03..1996ae1b9 100644 --- a/netbox/extras/graphql/filters.py +++ b/netbox/extras/graphql/filters.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django @@ -13,13 +13,20 @@ from netbox.graphql.filters import ChangeLoggedModelFilter, PrimaryModelFilter if TYPE_CHECKING: from core.graphql.filters import ContentTypeFilter from dcim.graphql.filters import ( - DeviceRoleFilter, DeviceTypeFilter, LocationFilter, PlatformFilter, RegionFilter, SiteFilter, SiteGroupFilter, + DeviceRoleFilter, + DeviceTypeFilter, + LocationFilter, + PlatformFilter, + RegionFilter, + SiteFilter, + SiteGroupFilter, ) - from tenancy.graphql.filters import TenantFilter, TenantGroupFilter from netbox.graphql.enums import ColorEnum from netbox.graphql.filter_lookups import FloatLookup, IntegerLookup, JSONFilter, StringArrayLookup, TreeNodeFilter + from tenancy.graphql.filters import TenantFilter, TenantGroupFilter from users.graphql.filters import GroupFilter, UserFilter from virtualization.graphql.filters import ClusterFilter, ClusterGroupFilter, ClusterTypeFilter + from .enums import * __all__ = ( diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 881a53aa3..360cdc50a 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -14,9 +14,10 @@ __all__ = ( ) if TYPE_CHECKING: - from .types import ImageAttachmentType, JournalEntryType, TagType from tenancy.graphql.types import ContactAssignmentType + from .types import ImageAttachmentType, JournalEntryType, TagType + @strawberry.type class ConfigContextMixin: diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 8230edea8..bb37f5c29 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -1,4 +1,4 @@ -from typing import Annotated, List, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated, List import strawberry import strawberry_django @@ -8,6 +8,7 @@ from extras import models from extras.graphql.mixins import CustomFieldsMixin, TagsMixin from netbox.graphql.types import BaseObjectType, ContentTypeType, ObjectType, PrimaryObjectType from users.graphql.mixins import OwnerMixin + from .filters import * if TYPE_CHECKING: diff --git a/netbox/extras/jobs.py b/netbox/extras/jobs.py index 5b57cbce4..7514c1be0 100644 --- a/netbox/extras/jobs.py +++ b/netbox/extras/jobs.py @@ -2,8 +2,7 @@ import logging import traceback from contextlib import ExitStack -from django.db import router, transaction -from django.db import DEFAULT_DB_ALIAS +from django.db import DEFAULT_DB_ALIAS, router, transaction from django.utils.translation import gettext as _ from core.signals import clear_events @@ -13,6 +12,7 @@ from netbox.context_managers import event_tracking from netbox.jobs import JobRunner from netbox.registry import registry from utilities.exceptions import AbortScript, AbortTransaction + from .utils import is_report diff --git a/netbox/extras/management/commands/webhook_receiver.py b/netbox/extras/management/commands/webhook_receiver.py index 382c830fd..e05fda665 100644 --- a/netbox/extras/management/commands/webhook_receiver.py +++ b/netbox/extras/management/commands/webhook_receiver.py @@ -1,10 +1,9 @@ import json import sys -from http.server import HTTPServer, BaseHTTPRequestHandler +from http.server import BaseHTTPRequestHandler, HTTPServer from django.core.management.base import BaseCommand - request_counter = 1 diff --git a/netbox/extras/migrations/0001_squashed.py b/netbox/extras/migrations/0001_squashed.py index a2514fa5e..d89bd68d4 100644 --- a/netbox/extras/migrations/0001_squashed.py +++ b/netbox/extras/migrations/0001_squashed.py @@ -1,7 +1,8 @@ -from django.conf import settings import django.contrib.postgres.fields -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + import extras.models.customfields import extras.utils import utilities.fields diff --git a/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py b/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py index bc0e1bbd0..1937af242 100644 --- a/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py +++ b/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py @@ -1,8 +1,8 @@ # Generated by Django 4.2.9 on 2024-01-19 19:46 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/netbox/extras/migrations/0109_script_model.py b/netbox/extras/migrations/0109_script_model.py index f1f81b3bd..8d8fdb931 100644 --- a/netbox/extras/migrations/0109_script_model.py +++ b/netbox/extras/migrations/0109_script_model.py @@ -38,8 +38,8 @@ def is_script(obj): """ Returns True if the passed Python object is a Script or Report. """ - from extras.scripts import Script from extras.reports import Report + from extras.scripts import Script try: if issubclass(obj, Report) and obj != Report: diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index 1ac8af6d8..b346c039a 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -1,7 +1,8 @@ +from urllib.parse import urlparse + from django.conf import settings from django.core.files.storage import storages from django.db import migrations -from urllib.parse import urlparse from extras.storage import ScriptFileSystemStorage diff --git a/netbox/extras/migrations/0132_configcontextprofile.py b/netbox/extras/migrations/0132_configcontextprofile.py index adf9a9b83..9fe49d414 100644 --- a/netbox/extras/migrations/0132_configcontextprofile.py +++ b/netbox/extras/migrations/0132_configcontextprofile.py @@ -1,11 +1,12 @@ # Generated by Django 5.2.4 on 2025-08-08 16:40 import django.db.models.deletion -import netbox.models.deletion import taggit.managers +from django.db import migrations, models + +import netbox.models.deletion import utilities.json import utilities.jsonschema -from django.db import migrations, models class Migration(migrations.Migration): diff --git a/netbox/extras/models/configs.py b/netbox/extras/models/configs.py index ea861e673..88ec1276e 100644 --- a/netbox/extras/models/configs.py +++ b/netbox/extras/models/configs.py @@ -1,12 +1,12 @@ -import jsonschema from collections import defaultdict -from jsonschema.exceptions import ValidationError as JSONValidationError +import jsonschema from django.conf import settings from django.core.validators import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from jsonschema.exceptions import ValidationError as JSONValidationError from core.models import ObjectType from extras.models.mixins import RenderTemplateMixin diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index a29036821..c9cfc4105 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -1,7 +1,7 @@ import decimal import json import re -from datetime import datetime, date +from datetime import date, datetime import django_filters from django import forms @@ -27,8 +27,16 @@ from netbox.search import FieldTypes from utilities import filters from utilities.datetime import datetime_from_timestamp from utilities.forms.fields import ( - CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVMultipleChoiceField, DynamicChoiceField, - DynamicModelChoiceField, DynamicModelMultipleChoiceField, DynamicMultipleChoiceField, JSONField, LaxURLField, + CSVChoiceField, + CSVModelChoiceField, + CSVModelMultipleChoiceField, + CSVMultipleChoiceField, + DynamicChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + DynamicMultipleChoiceField, + JSONField, + LaxURLField, ) from utilities.forms.utils import add_blank_choice from utilities.forms.widgets import APISelect, APISelectMultiple, DatePicker, DateTimePicker diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 52ced1835..e44a359f6 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -23,7 +23,13 @@ from netbox.config import get_config from netbox.events import get_event_type_choices from netbox.models import ChangeLoggedModel from netbox.models.features import ( - CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin, has_feature + CloningMixin, + CustomFieldsMixin, + CustomLinksMixin, + ExportTemplatesMixin, + SyncedDataMixin, + TagsMixin, + has_feature, ) from netbox.models.mixins import OwnerMixin from utilities.html import clean_html diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index f2b15b0cf..f8c74671a 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -13,8 +13,9 @@ from django.utils.translation import gettext_lazy as _ from core.choices import ManagedFileRootPathChoices from core.models import ManagedFile from extras.utils import is_script -from netbox.models.features import JobsMixin, EventRulesMixin +from netbox.models.features import EventRulesMixin, JobsMixin from utilities.querysets import RestrictedQuerySet + from .mixins import PythonModuleMixin __all__ = ( diff --git a/netbox/extras/models/search.py b/netbox/extras/models/search.py index ae99f1735..9158a10c9 100644 --- a/netbox/extras/models/search.py +++ b/netbox/extras/models/search.py @@ -5,6 +5,7 @@ from django.utils.translation import gettext_lazy as _ from netbox.search.utils import get_indexer from utilities.fields import RestrictedGenericForeignKey + from ..fields import CachedValueField __all__ = ( diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index dc98ae65b..bff9598d1 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -3,7 +3,7 @@ from django.db import models from django.urls import reverse from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ -from taggit.models import TagBase, GenericTaggedItemBase +from taggit.models import GenericTaggedItemBase, TagBase from netbox.choices import ColorChoices from netbox.models import ChangeLoggedModel diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index 315ec86fb..7602aee53 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -1,5 +1,5 @@ from django.contrib.postgres.aggregates import JSONBAgg -from django.db.models import OuterRef, Subquery, Q +from django.db.models import OuterRef, Q, Subquery from extras.models.tags import TaggedItem from utilities.query_functions import EmptyGroupByJSONBAgg diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index 3ba7792a1..c16f00886 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -17,8 +17,8 @@ from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, from utilities.forms import add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.widgets import DatePicker, DateTimePicker -from .forms import ScriptForm +from .forms import ScriptForm __all__ = ( 'BaseScript', diff --git a/netbox/extras/search.py b/netbox/extras/search.py index 67a20d017..7aa4a6186 100644 --- a/netbox/extras/search.py +++ b/netbox/extras/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index e079abd17..e59096cfa 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -11,14 +11,15 @@ from netbox.models.features import has_feature from netbox.signals import post_clean from utilities.data import get_config_value_ci from utilities.exceptions import AbortRequest + from .models import CustomField, TaggedItem from .utils import run_validators - # # Custom fields # + def handle_cf_added_obj_types(instance, action, pk_set, **kwargs): """ Handle the population of default/null values when a CustomField is added to one or more ContentTypes. diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index e3a61f683..d9c61ee9f 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -5,12 +5,13 @@ from django.template.defaultfilters import filesizeformat from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ -from extras.models import * -from core.tables import JobTable from core.models import Job +from core.tables import JobTable +from extras.models import * from netbox.constants import EMPTY_TABLE_TEXT from netbox.events import get_event_text from netbox.tables import BaseTable, NetBoxTable, PrimaryModelTable, columns + from .columns import NotificationActionsColumn __all__ = ( diff --git a/netbox/extras/templatetags/custom_links.py b/netbox/extras/templatetags/custom_links.py index 4aeaaa6b1..584c8b8ec 100644 --- a/netbox/extras/templatetags/custom_links.py +++ b/netbox/extras/templatetags/custom_links.py @@ -6,7 +6,6 @@ from core.models import ObjectType from extras.models import CustomLink from netbox.choices import ButtonColorChoices - register = template.Library() LINK_BUTTON = '{}\n' diff --git a/netbox/extras/templatetags/dashboard.py b/netbox/extras/templatetags/dashboard.py index 67fa4024c..84c98a7ef 100644 --- a/netbox/extras/templatetags/dashboard.py +++ b/netbox/extras/templatetags/dashboard.py @@ -2,7 +2,6 @@ from django import template from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ - register = template.Library() diff --git a/netbox/extras/templatetags/log_levels.py b/netbox/extras/templatetags/log_levels.py index fba73a74f..a378efac0 100644 --- a/netbox/extras/templatetags/log_levels.py +++ b/netbox/extras/templatetags/log_levels.py @@ -2,7 +2,6 @@ from django import template from extras.choices import LogLevelChoices - register = template.Library() diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 520e9265b..1c4996bcc 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -9,10 +9,11 @@ from rest_framework import status from core.choices import ManagedFileRootPathChoices from core.events import * from core.models import DataFile, DataSource, ObjectType -from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site +from dcim.models import Device, DeviceRole, DeviceType, Location, Manufacturer, Rack, RackRole, Site from extras.choices import * from extras.models import * -from extras.scripts import BooleanVar, IntegerVar, Script as PythonClass, StringVar +from extras.scripts import BooleanVar, IntegerVar, StringVar +from extras.scripts import Script as PythonClass from users.constants import TOKEN_PREFIX from users.models import Group, Token, User from utilities.testing import APITestCase, APIViewTestCases diff --git a/netbox/extras/tests/test_custom_validation.py b/netbox/extras/tests/test_custom_validation.py index 6eb90e5b0..f76864a7d 100644 --- a/netbox/extras/tests/test_custom_validation.py +++ b/netbox/extras/tests/test_custom_validation.py @@ -1,5 +1,4 @@ -from django.test import TestCase -from django.test import override_settings +from django.test import TestCase, override_settings from circuits.api.serializers import ProviderSerializer from circuits.forms import ProviderForm diff --git a/netbox/extras/tests/test_customvalidators.py b/netbox/extras/tests/test_customvalidators.py index 9f85b4913..f7aafb61a 100644 --- a/netbox/extras/tests/test_customvalidators.py +++ b/netbox/extras/tests/test_customvalidators.py @@ -4,7 +4,7 @@ from django.db import transaction from django.test import TestCase, override_settings from dcim.choices import SiteStatusChoices -from dcim.models import Site, Region +from dcim.models import Region, Site from extras.validators import CustomValidator from ipam.models import ASN, RIR from users.models import User diff --git a/netbox/extras/tests/test_dashboard.py b/netbox/extras/tests/test_dashboard.py index fb94710c7..ac3a1afe5 100644 --- a/netbox/extras/tests/test_dashboard.py +++ b/netbox/extras/tests/test_dashboard.py @@ -1,4 +1,4 @@ -from django.test import tag, TestCase +from django.test import TestCase, tag from extras.dashboard.widgets import ObjectListWidget diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 04b348e5f..056776f75 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -9,8 +9,7 @@ from core.choices import ManagedFileRootPathChoices, ObjectChangeActionChoices from core.events import * from core.models import ObjectChange, ObjectType from dcim.filtersets import SiteFilterSet -from dcim.models import DeviceRole, DeviceType, Manufacturer, Platform, Rack, Region, Site, SiteGroup -from dcim.models import Location +from dcim.models import DeviceRole, DeviceType, Location, Manufacturer, Platform, Rack, Region, Site, SiteGroup from extras.choices import * from extras.filtersets import * from extras.models import * diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index a7de50623..e4cd4ff43 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -4,7 +4,7 @@ from pathlib import Path from django.contrib.contenttypes.models import ContentType from django.core.files.uploadedfile import SimpleUploadedFile from django.forms import ValidationError -from django.test import tag, TestCase +from django.test import TestCase, tag from core.models import AutoSyncRecord, DataSource, ObjectType from dcim.models import Device, DeviceRole, DeviceType, Location, Manufacturer, Platform, Region, Site, SiteGroup diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 727f0f803..44cce289c 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -1,7 +1,8 @@ +from unittest.mock import PropertyMock, patch + from django.contrib.contenttypes.models import ContentType -from django.urls import reverse from django.test import tag -from unittest.mock import patch, PropertyMock +from django.urls import reverse from core.choices import ManagedFileRootPathChoices from core.events import * @@ -9,9 +10,10 @@ from core.models import ObjectType from dcim.models import DeviceType, Manufacturer, Site from extras.choices import * from extras.models import * -from extras.scripts import Script as PythonClass, IntegerVar, BooleanVar +from extras.scripts import BooleanVar, IntegerVar +from extras.scripts import Script as PythonClass from users.models import Group, User -from utilities.testing import ViewTestCases, TestCase +from utilities.testing import TestCase, ViewTestCases class CustomFieldTestCase(ViewTestCases.PrimaryObjectViewTestCase): diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 5635f0c01..6a0e57bfe 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -3,7 +3,6 @@ from django.urls import include, path from extras import views from utilities.urls import get_model_urls - app_name = 'extras' urlpatterns = [ diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 461ed423f..fe4513310 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1,10 +1,11 @@ from datetime import datetime + from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.core.paginator import EmptyPage from django.db.models import Count, Q -from django.http import HttpResponseBadRequest, HttpResponseForbidden, HttpResponse, Http404 +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils import timezone @@ -25,7 +26,7 @@ from netbox.object_actions import * from netbox.views import generic from netbox.views.generic.mixins import TableMixin from utilities.forms import ConfirmationForm, get_field_value -from utilities.htmx import htmx_partial, htmx_maybe_redirect_current_page +from utilities.htmx import htmx_maybe_redirect_current_page, htmx_partial from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.query import count_related from utilities.querydict import normalize_querydict @@ -34,16 +35,17 @@ from utilities.rqworker import get_workers_for_queue from utilities.templatetags.builtins.filters import render_markdown from utilities.views import ContentTypePermissionRequiredMixin, get_action_url, register_model_view from virtualization.models import VirtualMachine + from . import filtersets, forms, tables from .constants import LOG_LEVEL_RANK from .models import * -from .tables import ReportResultsTable, ScriptResultsTable, ScriptJobTable - +from .tables import ReportResultsTable, ScriptJobTable, ScriptResultsTable # # Custom fields # + @register_model_view(CustomField, 'list', path='', detail=False) class CustomFieldListView(generic.ObjectListView): queryset = CustomField.objects.select_related('choice_set') diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 1492eb6ea..033e3b20b 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -8,6 +8,7 @@ from jinja2.exceptions import TemplateError from netbox.registry import registry from utilities.proxy import resolve_proxies + from .constants import WEBHOOK_EVENT_TYPES __all__ = ( diff --git a/netbox/ipam/api/field_serializers.py b/netbox/ipam/api/field_serializers.py index d12530a60..f22f9abfb 100644 --- a/netbox/ipam/api/field_serializers.py +++ b/netbox/ipam/api/field_serializers.py @@ -1,7 +1,6 @@ from django.utils.translation import gettext_lazy as _ -from rest_framework import serializers - from netaddr import AddrFormatError, IPNetwork +from rest_framework import serializers __all__ = ( 'IPAddressField', diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 0bdfc5385..5e3ad9609 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -1,7 +1,7 @@ from .serializers_.asns import * -from .serializers_.vrfs import * -from .serializers_.roles import * -from .serializers_.vlans import * -from .serializers_.ip import * from .serializers_.fhrpgroups import * +from .serializers_.ip import * +from .serializers_.roles import * from .serializers_.services import * +from .serializers_.vlans import * +from .serializers_.vrfs import * diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index dd821cb61..334755734 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -1,7 +1,7 @@ from rest_framework import serializers from dcim.models import Site -from ipam.models import ASN, ASNRange, RIR +from ipam.models import ASN, RIR, ASNRange from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index cf8770682..9c7b3fa08 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -1,8 +1,10 @@ from django.contrib.contenttypes.models import ContentType + from ipam.models import FHRPGroup, FHRPGroupAssignment from netbox.api.fields import ContentTypeField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import NetBoxModelSerializer, PrimaryModelSerializer + from .ip import IPAddressSerializer __all__ = ( diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index b520e76ff..e4a6f12cc 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -9,12 +9,13 @@ from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer + +from ..field_serializers import IPAddressField, IPNetworkField from .asns import RIRSerializer from .nested import NestedIPAddressSerializer from .roles import RoleSerializer from .vlans import VLANSerializer from .vrfs import VRFSerializer -from ..field_serializers import IPAddressField, IPNetworkField __all__ = ( 'AggregateSerializer', diff --git a/netbox/ipam/api/serializers_/nested.py b/netbox/ipam/api/serializers_/nested.py index b56b15984..62393bae6 100644 --- a/netbox/ipam/api/serializers_/nested.py +++ b/netbox/ipam/api/serializers_/nested.py @@ -2,6 +2,7 @@ from rest_framework import serializers from ipam import models from netbox.api.serializers import WritableNestedSerializer + from ..field_serializers import IPAddressField __all__ = ( diff --git a/netbox/ipam/api/serializers_/services.py b/netbox/ipam/api/serializers_/services.py index 824fc5738..9d075dfb6 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -6,6 +6,7 @@ from ipam.models import IPAddress, Service, ServiceTemplate from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import PrimaryModelSerializer + from .ip import IPAddressSerializer __all__ = ( diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index 871d6eadb..5e03074cd 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -10,6 +10,7 @@ from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import NetBoxModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer + from .nested import NestedVLANSerializer from .roles import RoleSerializer diff --git a/netbox/ipam/api/serializers_/vrfs.py b/netbox/ipam/api/serializers_/vrfs.py index 67630f83c..e4a08cbb4 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -1,4 +1,4 @@ -from ipam.models import RouteTarget, VRF +from ipam.models import VRF, RouteTarget from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import PrimaryModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer diff --git a/netbox/ipam/api/urls.py b/netbox/ipam/api/urls.py index ea76025ec..55581ff90 100644 --- a/netbox/ipam/api/urls.py +++ b/netbox/ipam/api/urls.py @@ -1,8 +1,8 @@ from django.urls import path from netbox.api.routers import NetBoxRouter -from . import views +from . import views router = NetBoxRouter() router.APIRootView = views.IPAMRootView diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index c8c35fff7..c0ceaf10a 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -24,6 +24,7 @@ from netbox.config import get_config from netbox.constants import ADVISORY_LOCK_KEYS from utilities.api import get_serializer_for_model from virtualization.models import VMInterface + from . import serializers diff --git a/netbox/ipam/apps.py b/netbox/ipam/apps.py index ae88d69a9..f9310af8d 100644 --- a/netbox/ipam/apps.py +++ b/netbox/ipam/apps.py @@ -9,7 +9,8 @@ class IPAMConfig(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 Prefix # Register models diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index 947f1adea..44c5e7d39 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -2,7 +2,6 @@ from django.db.models import Q from .choices import FHRPGroupProtocolChoices, IPAddressRoleChoices - # # VRFs # diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index a1fbdf097..b83c4ca30 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -1,5 +1,5 @@ from django.core.exceptions import ValidationError -from django.core.validators import MinValueValidator, MaxValueValidator +from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.utils.translation import gettext as _ from netaddr import AddrFormatError, IPNetwork diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 319271de6..eb65f1bba 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -12,16 +12,23 @@ from circuits.models import Provider from dcim.base_filtersets import ScopedFilterSet from dcim.models import Device, Interface, Region, Site, SiteGroup from netbox.filtersets import ( - ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet, PrimaryModelFilterSet, + ChangeLoggedModelFilterSet, + NetBoxModelFilterSet, + OrganizationalModelFilterSet, + PrimaryModelFilterSet, ) from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ( - MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter, NumericArrayFilter, + MultiValueCharFilter, + MultiValueContentTypeFilter, + MultiValueNumberFilter, + NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) from utilities.filtersets import register_filterset from virtualization.models import VirtualMachine, VMInterface from vpn.models import L2VPN + from .choices import * from .models import * diff --git a/netbox/ipam/formfields.py b/netbox/ipam/formfields.py index 75040e89c..e2260efe1 100644 --- a/netbox/ipam/formfields.py +++ b/netbox/ipam/formfields.py @@ -2,13 +2,13 @@ from django import forms from django.core.exceptions import ValidationError from django.core.validators import validate_ipv4_address, validate_ipv6_address from django.utils.translation import gettext_lazy as _ -from netaddr import IPAddress, IPNetwork, AddrFormatError - +from netaddr import AddrFormatError, IPAddress, IPNetwork # # Form fields # + class IPAddressFormField(forms.Field): default_error_messages = { 'invalid': _("Enter a valid IPv4 or IPv6 address (without a mask)."), diff --git a/netbox/ipam/forms/__init__.py b/netbox/ipam/forms/__init__.py index ba97d6dfa..5cec11aac 100644 --- a/netbox/ipam/forms/__init__.py +++ b/netbox/ipam/forms/__init__.py @@ -1,5 +1,5 @@ -from .model_forms import * -from .filtersets import * from .bulk_create import * from .bulk_edit import * from .bulk_import import * +from .filtersets import * +from .model_forms import * diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index b1837cfc1..bbe1d4e56 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -13,7 +13,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 ( - ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, + ContentTypeChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + NumericArrayField, NumericRangeArrayField, ) from utilities.forms.rendering import FieldSet diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index d8ae22eda..bbb9587b4 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -2,16 +2,20 @@ from django import forms from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, Interface, Site from dcim.forms.mixins import ScopedImportForm +from dcim.models import Device, Interface, Site from ipam.choices import * from ipam.constants import * from ipam.models import * from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, PrimaryModelImportForm from tenancy.models import Tenant from utilities.forms.fields import ( - CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField, + CSVChoiceField, + CSVContentTypeField, + CSVModelChoiceField, + CSVModelMultipleChoiceField, NumericRangeArrayField, + SlugField, ) from virtualization.models import VirtualMachine, VMInterface diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index e37d17d4b..756a92913 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from dcim.models import Location, Rack, Region, Site, SiteGroup, Device +from dcim.models import Device, Location, Rack, Region, Site, SiteGroup from ipam.choices import * from ipam.constants import * from ipam.models import * @@ -10,7 +10,7 @@ from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet -from virtualization.models import VirtualMachine, ClusterGroup, Cluster +from virtualization.models import Cluster, ClusterGroup, VirtualMachine from vpn.models import L2VPN __all__ = ( diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index c1ad60ff5..6cb378f32 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -1,10 +1,11 @@ from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, Interface, Site from dcim.forms.mixins import ScopedForm +from dcim.models import Device, Interface, Site from ipam.choices import * from ipam.constants import * from ipam.formfields import IPNetworkFormField @@ -14,15 +15,17 @@ from tenancy.forms import TenancyForm from utilities.exceptions import PermissionsViolation from utilities.forms import add_blank_choice from utilities.forms.fields import ( - ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, + ContentTypeChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + NumericArrayField, NumericRangeArrayField, ) from utilities.forms.rendering import FieldSet, InlineFields, ObjectAttribute, TabbedGroups from utilities.forms.utils import get_field_value from utilities.forms.widgets import DatePicker, HTMXSelect -from django.utils.safestring import mark_safe from utilities.templatetags.builtins.filters import bettertitle -from virtualization.models import VMInterface, VirtualMachine +from virtualization.models import VirtualMachine, VMInterface __all__ = ( 'AggregateForm', diff --git a/netbox/ipam/graphql/filter_mixins.py b/netbox/ipam/graphql/filter_mixins.py index 72d8e1404..130c6208b 100644 --- a/netbox/ipam/graphql/filter_mixins.py +++ b/netbox/ipam/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,6 +7,7 @@ from strawberry_django import BaseFilterLookup if TYPE_CHECKING: from netbox.graphql.filter_lookups import IntegerLookup + from .enums import * __all__ = ( diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 8f5b4253a..7f67cb39a 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -1,5 +1,5 @@ from datetime import date -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import netaddr import strawberry @@ -7,24 +7,28 @@ import strawberry_django from django.db.models import Q from netaddr.core import AddrFormatError from strawberry.scalars import ID -from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup +from strawberry_django import BaseFilterLookup, DateFilterLookup, FilterLookup from dcim.graphql.filter_mixins import ScopedFilterMixin from dcim.models import Device from ipam import models from ipam.graphql.filter_mixins import ServiceFilterMixin from netbox.graphql.filters import ( - ChangeLoggedModelFilter, NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter, + ChangeLoggedModelFilter, + NetBoxModelFilter, + OrganizationalModelFilter, + PrimaryModelFilter, ) from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin from virtualization.models import VMInterface if TYPE_CHECKING: - from netbox.graphql.filter_lookups import BigIntegerLookup, IntegerLookup, IntegerRangeArrayLookup from circuits.graphql.filters import ProviderFilter from core.graphql.filters import ContentTypeFilter from dcim.graphql.filters import SiteFilter + from netbox.graphql.filter_lookups import BigIntegerLookup, IntegerLookup, IntegerRangeArrayLookup from vpn.graphql.filters import L2VPNFilter + from .enums import * __all__ = ( diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index e63f0bff3..eeb561903 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/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 @@ -9,6 +9,7 @@ from extras.graphql.mixins import ContactsMixin from ipam import models from netbox.graphql.scalars import BigInt from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType + from .filters import * from .mixins import IPAddressesMixin @@ -23,7 +24,7 @@ if TYPE_CHECKING: SiteType, ) from tenancy.graphql.types import TenantType - from virtualization.graphql.types import ClusterGroupType, ClusterType, VMInterfaceType, VirtualMachineType + from virtualization.graphql.types import ClusterGroupType, ClusterType, VirtualMachineType, VMInterfaceType from vpn.graphql.types import L2VPNType, TunnelTerminationType from wireless.graphql.types import WirelessLANType diff --git a/netbox/ipam/management/commands/rebuild_prefixes.py b/netbox/ipam/management/commands/rebuild_prefixes.py index f84ff3ea4..8d0911c3b 100644 --- a/netbox/ipam/management/commands/rebuild_prefixes.py +++ b/netbox/ipam/management/commands/rebuild_prefixes.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from ipam.models import Prefix, VRF +from ipam.models import VRF, Prefix from ipam.utils import rebuild_prefixes diff --git a/netbox/ipam/migrations/0001_squashed.py b/netbox/ipam/migrations/0001_squashed.py index 15fb71dde..d4ae71792 100644 --- a/netbox/ipam/migrations/0001_squashed.py +++ b/netbox/ipam/migrations/0001_squashed.py @@ -1,11 +1,12 @@ import django.contrib.postgres.fields -from utilities.json import CustomFieldJSONEncoder import django.core.validators -from django.db import migrations, models import django.db.models.deletion import django.db.models.expressions -import ipam.fields import taggit.managers +from django.db import migrations, models + +import ipam.fields +from utilities.json import CustomFieldJSONEncoder class Migration(migrations.Migration): diff --git a/netbox/ipam/migrations/0002_squashed_0046.py b/netbox/ipam/migrations/0002_squashed_0046.py index 43b1223d0..9838d6b26 100644 --- a/netbox/ipam/migrations/0002_squashed_0046.py +++ b/netbox/ipam/migrations/0002_squashed_0046.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): diff --git a/netbox/ipam/migrations/0074_vlantranslationpolicy_vlantranslationrule.py b/netbox/ipam/migrations/0074_vlantranslationpolicy_vlantranslationrule.py index 5a13f18e6..69c65fa90 100644 --- a/netbox/ipam/migrations/0074_vlantranslationpolicy_vlantranslationrule.py +++ b/netbox/ipam/migrations/0074_vlantranslationpolicy_vlantranslationrule.py @@ -3,9 +3,10 @@ import django.core.validators 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 = [ diff --git a/netbox/ipam/models/__init__.py b/netbox/ipam/models/__init__.py index 0d0b3d6ac..790df5855 100644 --- a/netbox/ipam/models/__init__.py +++ b/netbox/ipam/models/__init__.py @@ -1,7 +1,7 @@ # Ensure that VRFs are imported before IPs/prefixes so dumpdata & loaddata work correctly from .asns import * from .fhrp import * -from .vrfs import * from .ip import * from .services import * from .vlans import * +from .vrfs import * diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 370ccb2b2..7de01a7ec 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -12,7 +12,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models.mixins import CachedScopeMixin from ipam.choices import * from ipam.constants import * -from ipam.fields import IPNetworkField, IPAddressField +from ipam.fields import IPAddressField, IPNetworkField from ipam.lookups import Host from ipam.managers import IPAddressManager from ipam.querysets import PrefixQuerySet diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 030633330..b60b2cb97 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -11,7 +11,7 @@ from dcim.models import Interface, Site, SiteGroup from ipam.choices import * from ipam.constants import * from ipam.querysets import VLANGroupQuerySet, VLANQuerySet -from netbox.models import OrganizationalModel, PrimaryModel, NetBoxModel +from netbox.models import NetBoxModel, OrganizationalModel, PrimaryModel from utilities.data import check_ranges_overlap, ranges_to_string, ranges_to_string_list from virtualization.models import VMInterface diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index 0d11c2cd8..17259071f 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/ipam/signals.py b/netbox/ipam/signals.py index 3b36b561f..7a6eadb3b 100644 --- a/netbox/ipam/signals.py +++ b/netbox/ipam/signals.py @@ -3,6 +3,7 @@ from django.dispatch import receiver from dcim.models import Device from virtualization.models import VirtualMachine + from .models import IPAddress, Prefix diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index a173db714..ee923c3d8 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -6,6 +6,7 @@ from django_tables2.utils import Accessor from ipam.models import * from netbox.tables import NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin, TenantColumn + from .template_code import * __all__ = ( diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index eaaee9a80..dc3d03269 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -9,6 +9,7 @@ from ipam.models import * from netbox.tables import NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns from tenancy.tables import TenancyColumnsMixin, TenantColumn from virtualization.models import VMInterface + from .template_code import * __all__ = ( diff --git a/netbox/ipam/tests/test_lookups.py b/netbox/ipam/tests/test_lookups.py index 5c8b7a770..8383cac31 100644 --- a/netbox/ipam/tests/test_lookups.py +++ b/netbox/ipam/tests/test_lookups.py @@ -1,5 +1,6 @@ -from django.test import TestCase from django.db.backends.postgresql.psycopg_any import NumericRange +from django.test import TestCase + from ipam.models import VLANGroup diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index c93a47d21..80ac92ef2 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -2,11 +2,11 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.test import TestCase, override_settings from netaddr import IPNetwork, IPSet -from utilities.data import string_to_ranges from dcim.models import Site, SiteGroup from ipam.choices import * from ipam.models import * +from utilities.data import string_to_ranges class TestAggregate(TestCase): diff --git a/netbox/ipam/tests/test_ordering.py b/netbox/ipam/tests/test_ordering.py index 2f7a5342d..2f904ab89 100644 --- a/netbox/ipam/tests/test_ordering.py +++ b/netbox/ipam/tests/test_ordering.py @@ -1,9 +1,8 @@ +import netaddr from django.test import TestCase from ipam.choices import IPAddressStatusChoices, PrefixStatusChoices -from ipam.models import IPAddress, Prefix, VRF - -import netaddr +from ipam.models import VRF, IPAddress, Prefix class OrderingTestBase(TestCase): diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 5b8b8dad8..e61287d76 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -7,7 +7,7 @@ from netaddr import IPNetwork from core.models import ObjectType from dcim.constants import InterfaceTypeChoices -from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site, Interface +from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site from ipam.choices import * from ipam.models import * from netbox.choices import CSVDelimiterChoices, ImportFormatChoices diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index c55e874a1..19da7fdcd 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views # noqa F401 app_name = 'ipam' diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 53885367e..619e7ffb8 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -import netaddr +import netaddr from django.utils.translation import gettext_lazy as _ from .constants import * -from .models import Prefix, VLAN +from .models import VLAN, Prefix __all__ = ( 'AvailableIPSpace', diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 189f50a7a..00f970c5d 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -18,17 +18,18 @@ from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view from virtualization.filtersets import VMInterfaceFilterSet from virtualization.forms import VMInterfaceFilterForm from virtualization.models import VirtualMachine, VMInterface + from . import filtersets, forms, tables from .choices import PrefixStatusChoices from .constants import * from .models import * -from .utils import add_requested_prefixes, add_available_vlans, annotate_ip_space - +from .utils import add_available_vlans, add_requested_prefixes, annotate_ip_space # # VRFs # + @register_model_view(VRF, 'list', path='', detail=False) class VRFListView(generic.ObjectListView): queryset = VRF.objects.all() diff --git a/netbox/netbox/api/authentication.py b/netbox/netbox/api/authentication.py index 031be19da..af9087481 100644 --- a/netbox/netbox/api/authentication.py +++ b/netbox/netbox/api/authentication.py @@ -5,7 +5,7 @@ from django.utils import timezone from drf_spectacular.extensions import OpenApiAuthenticationExtension from rest_framework import exceptions from rest_framework.authentication import BaseAuthentication, get_authorization_header -from rest_framework.permissions import BasePermission, DjangoObjectPermissions, SAFE_METHODS +from rest_framework.permissions import SAFE_METHODS, BasePermission, DjangoObjectPermissions from netbox.config import get_config from users.constants import TOKEN_PREFIX diff --git a/netbox/netbox/api/gfk_fields.py b/netbox/netbox/api/gfk_fields.py index d2bbeac4c..e0c9006b9 100644 --- a/netbox/netbox/api/gfk_fields.py +++ b/netbox/netbox/api/gfk_fields.py @@ -1,5 +1,6 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers + from utilities.api import get_serializer_for_model __all__ = ( diff --git a/netbox/netbox/api/serializers/__init__.py b/netbox/netbox/api/serializers/__init__.py index 2d95e932b..7a578fbb6 100644 --- a/netbox/netbox/api/serializers/__init__.py +++ b/netbox/netbox/api/serializers/__init__.py @@ -1,6 +1,7 @@ from .base import * from .features import * from .generic import * -from .nested import * -from .models import * +from .nested import * # isort: split + from .bulk import * +from .models import * diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 0aa1385b0..0d149e81c 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -5,6 +5,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from utilities.api import get_related_object_by_attrs + from .fields import NetBoxAPIHyperlinkedIdentityField, NetBoxURLHyperlinkedIdentityField __all__ = ( diff --git a/netbox/netbox/api/serializers/features.py b/netbox/netbox/api/serializers/features.py index 00315868e..b65d719ee 100644 --- a/netbox/netbox/api/serializers/features.py +++ b/netbox/netbox/api/serializers/features.py @@ -1,7 +1,8 @@ from rest_framework import serializers from rest_framework.fields import CreateOnlyDefault -from extras.api.customfields import CustomFieldsDataField, CustomFieldDefaultValues +from extras.api.customfields import CustomFieldDefaultValues, CustomFieldsDataField + from .base import ValidatedModelSerializer from .nested import NestedTagSerializer diff --git a/netbox/netbox/api/serializers/models.py b/netbox/netbox/api/serializers/models.py index 5d81f5b9a..94d863c8c 100644 --- a/netbox/netbox/api/serializers/models.py +++ b/netbox/netbox/api/serializers/models.py @@ -1,8 +1,9 @@ from rest_framework import serializers -from .features import NetBoxModelSerializer from users.api.serializers_.mixins import OwnerMixin +from .features import NetBoxModelSerializer + __all__ = ( 'NestedGroupModelSerializer', 'OrganizationalModelSerializer', diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index 4a5fc6214..3662c2830 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -1,5 +1,6 @@ from extras.models import Tag from utilities.api import get_related_object_by_attrs + from .base import BaseModelSerializer __all__ = ( diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 57bceb674..6dae31e8c 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -15,6 +15,7 @@ from netbox.constants import ADVISORY_LOCK_KEYS from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer from utilities.exceptions import AbortRequest from utilities.query import reapply_model_ordering + from . import mixins __all__ = ( diff --git a/netbox/netbox/authentication/__init__.py b/netbox/netbox/authentication/__init__.py index 8596c59ab..e1245def7 100644 --- a/netbox/netbox/authentication/__init__.py +++ b/netbox/netbox/authentication/__init__.py @@ -2,7 +2,8 @@ import logging from collections import defaultdict from django.conf import settings -from django.contrib.auth.backends import ModelBackend, RemoteUserBackend as _RemoteUserBackend +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.backends import RemoteUserBackend as _RemoteUserBackend from django.contrib.auth.models import AnonymousUser from django.core.exceptions import ImproperlyConfigured from django.db.models import Q @@ -11,8 +12,12 @@ from django.utils.translation import gettext_lazy as _ from users.constants import CONSTRAINT_TOKEN_USER from users.models import Group, ObjectPermission, User from utilities.permissions import ( - permission_is_exempt, qs_filter_from_constraints, resolve_permission, resolve_permission_type, + permission_is_exempt, + qs_filter_from_constraints, + resolve_permission, + resolve_permission_type, ) + from .misc import _mirror_groups AUTH_BACKEND_ATTRS = { @@ -302,7 +307,8 @@ class RemoteUserBackend(_RemoteUserBackend): # Create a new instance of django-auth-ldap's LDAPBackend with our own ObjectPermissions try: - from django_auth_ldap.backend import _LDAPUser, LDAPBackend as LDAPBackend_ + from django_auth_ldap.backend import LDAPBackend as LDAPBackend_ + from django_auth_ldap.backend import _LDAPUser class NBLDAPBackend(ObjectPermissionMixin, LDAPBackend_): def get_permission_filter(self, user_obj): @@ -324,8 +330,8 @@ class LDAPBackend: def __new__(cls, *args, **kwargs): try: - from django_auth_ldap.backend import LDAPSettings import ldap + from django_auth_ldap.backend import LDAPSettings except ModuleNotFoundError as e: if getattr(e, 'name') == 'django_auth_ldap': raise ImproperlyConfigured( diff --git a/netbox/netbox/context_managers.py b/netbox/netbox/context_managers.py index 1d2ff61a2..c0ac9c2d7 100644 --- a/netbox/netbox/context_managers.py +++ b/netbox/netbox/context_managers.py @@ -1,9 +1,9 @@ from collections import defaultdict from contextlib import contextmanager +from extras.events import flush_events from netbox.context import current_request, events_queue, query_cache from netbox.utils import register_request_processor -from extras.events import flush_events @register_request_processor diff --git a/netbox/netbox/denormalized.py b/netbox/netbox/denormalized.py index a94f83e18..3c2492a9c 100644 --- a/netbox/netbox/denormalized.py +++ b/netbox/netbox/denormalized.py @@ -5,7 +5,6 @@ from django.dispatch import receiver from netbox.registry import registry - logger = logging.getLogger('netbox.denormalized') diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index 33f7cb4a3..138229a70 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -1,13 +1,13 @@ import json +from copy import deepcopy import django_filters -from copy import deepcopy from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import Q +from django.utils.translation import gettext as _ from django_filters.exceptions import FieldLookupError from django_filters.utils import get_model_field, resolve_field -from django.utils.translation import gettext as _ from core.choices import ObjectChangeActionChoices from core.models import ObjectChange @@ -15,12 +15,14 @@ from extras.choices import CustomFieldFilterLogicChoices from extras.filters import TagFilter, TagIDFilter from extras.models import CustomField, SavedFilter from users.filterset_mixins import OwnerFilterMixin +from utilities import filters from utilities.constants import ( - FILTER_CHAR_BASED_LOOKUP_MAP, FILTER_NEGATION_LOOKUP_MAP, FILTER_TREENODE_NEGATION_LOOKUP_MAP, - FILTER_NUMERIC_BASED_LOOKUP_MAP + FILTER_CHAR_BASED_LOOKUP_MAP, + FILTER_NEGATION_LOOKUP_MAP, + FILTER_NUMERIC_BASED_LOOKUP_MAP, + FILTER_TREENODE_NEGATION_LOOKUP_MAP, ) from utilities.forms.fields import MACAddressField -from utilities import filters __all__ = ( 'AttributeFiltersMixin', diff --git a/netbox/netbox/forms/__init__.py b/netbox/netbox/forms/__init__.py index fa06fafa0..fe5e5f7d3 100644 --- a/netbox/netbox/forms/__init__.py +++ b/netbox/netbox/forms/__init__.py @@ -1,5 +1,5 @@ -from .model_forms import * -from .bulk_import import * from .bulk_edit import * +from .bulk_import import * from .filtersets import * +from .model_forms import * from .search import * diff --git a/netbox/netbox/forms/bulk_edit.py b/netbox/netbox/forms/bulk_edit.py index 182342106..2e4e59982 100644 --- a/netbox/netbox/forms/bulk_edit.py +++ b/netbox/netbox/forms/bulk_edit.py @@ -6,6 +6,7 @@ from extras.choices import * from extras.models import Tag from utilities.forms import BulkEditForm from utilities.forms.fields import CommentField, DynamicModelMultipleChoiceField + from .mixins import ChangelogMessageMixin, CustomFieldsMixin, OwnerMixin __all__ = ( diff --git a/netbox/netbox/forms/bulk_import.py b/netbox/netbox/forms/bulk_import.py index c5609a2a7..6bd50442b 100644 --- a/netbox/netbox/forms/bulk_import.py +++ b/netbox/netbox/forms/bulk_import.py @@ -6,7 +6,8 @@ from extras.choices import * from extras.models import CustomField, Tag from users.models import Owner from utilities.forms import CSVModelForm -from utilities.forms.fields import CSVModelMultipleChoiceField, CSVModelChoiceField, SlugField +from utilities.forms.fields import CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField + from .model_forms import NetBoxModelForm __all__ = ( diff --git a/netbox/netbox/forms/filtersets.py b/netbox/netbox/forms/filtersets.py index 8ff20264e..f97025c75 100644 --- a/netbox/netbox/forms/filtersets.py +++ b/netbox/netbox/forms/filtersets.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from extras.choices import * from utilities.forms.fields import QueryField from utilities.forms.mixins import FilterModifierMixin + from .mixins import CustomFieldsMixin, OwnerFilterMixin, SavedFiltersMixin __all__ = ( diff --git a/netbox/netbox/forms/mixins.py b/netbox/netbox/forms/mixins.py index 1460c86ba..30bb332d1 100644 --- a/netbox/netbox/forms/mixins.py +++ b/netbox/netbox/forms/mixins.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext as _ from core.models import ObjectType from extras.choices import * from extras.models import * -from users.models import OwnerGroup, Owner +from users.models import Owner, OwnerGroup from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField __all__ = ( diff --git a/netbox/netbox/forms/model_forms.py b/netbox/netbox/forms/model_forms.py index 49a724201..a500365f9 100644 --- a/netbox/netbox/forms/model_forms.py +++ b/netbox/netbox/forms/model_forms.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from extras.choices import * from utilities.forms.fields import CommentField, SlugField from utilities.forms.mixins import CheckLastUpdatedMixin + from .mixins import ChangelogMessageMixin, CustomFieldsMixin, OwnerMixin, TagsMixin __all__ = ( diff --git a/netbox/netbox/graphql/filter_lookups.py b/netbox/netbox/graphql/filter_lookups.py index a029fd134..88ca374d2 100644 --- a/netbox/netbox/graphql/filter_lookups.py +++ b/netbox/netbox/graphql/filter_lookups.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import TypeVar, Tuple, Generic +from typing import Generic, Tuple, TypeVar import strawberry import strawberry_django diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index 3bb818907..b0ddd94f5 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -1,10 +1,10 @@ from dataclasses import dataclass from datetime import datetime -from typing import TypeVar, TYPE_CHECKING, Annotated +from typing import TYPE_CHECKING, Annotated, TypeVar import strawberry import strawberry_django -from strawberry_django import BaseFilterLookup, FilterLookup, DatetimeFilterLookup +from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup __all__ = ( 'DistanceFilterMixin', @@ -17,10 +17,11 @@ T = TypeVar('T') if TYPE_CHECKING: - from .enums import * from core.graphql.filters import * from extras.graphql.filters import * + from .enums import * + @dataclass class ImageAttachmentFilterMixin: diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index a7609c9d2..16bb22c21 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -1,8 +1,8 @@ import strawberry from django.conf import settings -from strawberry_django.optimizer import DjangoOptimizerExtension from strawberry.extensions import MaxAliasesLimiter from strawberry.schema.config import StrawberryConfig +from strawberry_django.optimizer import DjangoOptimizerExtension from circuits.graphql.schema import CircuitsQuery from core.graphql.schema import CoreQuery diff --git a/netbox/netbox/graphql/types.py b/netbox/netbox/graphql/types.py index df569390d..dcef7b22b 100644 --- a/netbox/netbox/graphql/types.py +++ b/netbox/netbox/graphql/types.py @@ -1,7 +1,7 @@ import strawberry import strawberry_django -from strawberry.types import Info from django.contrib.contenttypes.models import ContentType +from strawberry.types import Info from core.graphql.mixins import ChangelogMixin from core.models import ObjectType as ObjectType_ diff --git a/netbox/netbox/graphql/views.py b/netbox/netbox/graphql/views.py index 46a073c93..800432fbd 100644 --- a/netbox/netbox/graphql/views.py +++ b/netbox/netbox/graphql/views.py @@ -1,6 +1,6 @@ from django.conf import settings from django.contrib.auth.views import redirect_to_login -from django.http import HttpResponseNotFound, HttpResponseForbidden +from django.http import HttpResponseForbidden, HttpResponseNotFound from django.urls import reverse from django.views.decorators.csrf import csrf_exempt from rest_framework.exceptions import AuthenticationFailed diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py index 72dcece1f..30afba6fc 100644 --- a/netbox/netbox/jobs.py +++ b/netbox/netbox/jobs.py @@ -3,8 +3,8 @@ from abc import ABC, abstractmethod from datetime import timedelta from django.core.exceptions import ImproperlyConfigured -from django.utils.functional import classproperty from django.utils import timezone +from django.utils.functional import classproperty from django_pglocks import advisory_lock from rq.timeouts import JobTimeoutException diff --git a/netbox/netbox/metrics.py b/netbox/netbox/metrics.py index 59619d34a..7f6ffacb0 100644 --- a/netbox/netbox/metrics.py +++ b/netbox/netbox/metrics.py @@ -1,5 +1,5 @@ -from django_prometheus.conf import NAMESPACE from django_prometheus import middleware +from django_prometheus.conf import NAMESPACE from prometheus_client import Counter __all__ = ( diff --git a/netbox/netbox/middleware.py b/netbox/netbox/middleware.py index 66c980778..45a48c2be 100644 --- a/netbox/netbox/middleware.py +++ b/netbox/netbox/middleware.py @@ -5,7 +5,7 @@ from django.conf import settings from django.contrib import auth, messages from django.contrib.auth.middleware import RemoteUserMiddleware as RemoteUserMiddleware_ from django.core.exceptions import ImproperlyConfigured -from django.db import connection, ProgrammingError +from django.db import ProgrammingError, connection from django.db.utils import InternalError from django.http import Http404, HttpResponseRedirect from django_prometheus import middleware diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 51cef465c..c627b4b22 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -405,6 +405,7 @@ class ContactsMixin(models.Model): inherited: If `True`, inherited contacts from parent objects are included. """ from tenancy.models import ContactAssignment + from . import NestedGroupModel filter = Q( diff --git a/netbox/netbox/navigation/__init__.py b/netbox/netbox/navigation/__init__.py index 9b61968bc..83792d06e 100644 --- a/netbox/netbox/navigation/__init__.py +++ b/netbox/netbox/navigation/__init__.py @@ -1,9 +1,8 @@ from dataclasses import dataclass -from typing import Sequence, Optional +from typing import Optional, Sequence from django.urls import reverse_lazy - __all__ = ( 'get_model_item', 'get_model_buttons', diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index a068f0d18..1de2df0aa 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -3,6 +3,7 @@ from functools import cache from django.utils.translation import gettext_lazy as _ from netbox.registry import registry + from . import * # diff --git a/netbox/netbox/plugins/__init__.py b/netbox/netbox/plugins/__init__.py index b7bb0ef9f..01a36662e 100644 --- a/netbox/netbox/plugins/__init__.py +++ b/netbox/netbox/plugins/__init__.py @@ -10,6 +10,7 @@ from core.exceptions import IncompatiblePluginError from netbox.registry import registry from netbox.search import register_search from netbox.utils import register_data_backend + from .navigation import * from .registration import * from .templates import * diff --git a/netbox/netbox/plugins/registration.py b/netbox/netbox/plugins/registration.py index 0001d50c9..c6b48482c 100644 --- a/netbox/netbox/plugins/registration.py +++ b/netbox/netbox/plugins/registration.py @@ -3,6 +3,7 @@ import inspect from django.utils.translation import gettext_lazy as _ from netbox.registry import registry + from .navigation import PluginMenu, PluginMenuButton, PluginMenuItem from .templates import PluginTemplateExtension diff --git a/netbox/netbox/plugins/urls.py b/netbox/netbox/plugins/urls.py index 791c1d7b5..117a7c365 100644 --- a/netbox/netbox/plugins/urls.py +++ b/netbox/netbox/plugins/urls.py @@ -6,6 +6,7 @@ from django.urls import path from django.utils.module_loading import import_string, module_has_submodule from netbox.registry import registry + from . import views plugin_patterns = [] diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index a28fd17e7..829d0de93 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -1,4 +1,5 @@ import collections + from django.utils.translation import gettext as _ diff --git a/netbox/netbox/search/backends.py b/netbox/netbox/search/backends.py index d73ab50d3..2aa1fbcf6 100644 --- a/netbox/netbox/search/backends.py +++ b/netbox/netbox/search/backends.py @@ -1,15 +1,15 @@ from collections import defaultdict +import netaddr from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ImproperlyConfigured -from django.db.models import F, Window, Q, prefetch_related_objects +from django.db.models import F, Q, Window, prefetch_related_objects from django.db.models.fields.related import ForeignKey from django.db.models.functions import window from django.db.models.signals import post_delete, post_save from django.utils.module_loading import import_string from django.utils.translation import gettext_lazy as _ -import netaddr from netaddr.core import AddrFormatError from core.models import ObjectType @@ -18,6 +18,7 @@ from netbox.registry import registry from utilities.object_types import object_type_identifier from utilities.querysets import RestrictedPrefetch from utilities.string import title + from . import FieldTypes, LookupTypes, get_indexer DEFAULT_LOOKUP_TYPE = LookupTypes.PARTIAL diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index db64fb884..d0e413091 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -6,6 +6,7 @@ import platform import sys import warnings +import storages.utils # type: ignore from django.contrib.messages import constants as messages from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.validators import URLValidator @@ -17,12 +18,11 @@ from netbox.config import PARAMS as CONFIG_PARAMS from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW from netbox.plugins import PluginConfig from netbox.registry import registry -import storages.utils # type: ignore from utilities.release import load_release_data from utilities.security import validate_peppers from utilities.string import trailing_slash -from .monkey import get_unique_validators +from .monkey import get_unique_validators # # Environment setup @@ -957,6 +957,7 @@ for plugin_name in PLUGINS: from rest_framework.utils import field_mapping # noqa: E402 from strawberry_django import pagination # noqa: E402 from strawberry_django.fields.field import StrawberryDjangoField # noqa: E402 + from netbox.graphql.pagination import OffsetPaginationInput, apply_pagination # noqa: E402 # TODO: Remove this once #20547 has been implemented diff --git a/netbox/netbox/signals.py b/netbox/netbox/signals.py index 61685856c..f26a2541b 100644 --- a/netbox/netbox/signals.py +++ b/netbox/netbox/signals.py @@ -1,5 +1,4 @@ from django.dispatch import Signal - # Signals that a model has completed its clean() method post_clean = Signal() diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index a1ac0a3e4..0214445cf 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -23,6 +23,7 @@ from utilities.html import highlight from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.string import title from utilities.views import get_action_url + from .template_code import * __all__ = ( diff --git a/netbox/netbox/tests/dummy_plugin/api/serializers.py b/netbox/netbox/tests/dummy_plugin/api/serializers.py index 239d7d998..2ee1e5617 100644 --- a/netbox/netbox/tests/dummy_plugin/api/serializers.py +++ b/netbox/netbox/tests/dummy_plugin/api/serializers.py @@ -1,4 +1,5 @@ from rest_framework.serializers import ModelSerializer + from netbox.tests.dummy_plugin.models import DummyModel diff --git a/netbox/netbox/tests/dummy_plugin/api/urls.py b/netbox/netbox/tests/dummy_plugin/api/urls.py index d6c27809b..04f438aa9 100644 --- a/netbox/netbox/tests/dummy_plugin/api/urls.py +++ b/netbox/netbox/tests/dummy_plugin/api/urls.py @@ -1,4 +1,5 @@ from rest_framework import routers + from .views import DummyViewSet router = routers.DefaultRouter() diff --git a/netbox/netbox/tests/dummy_plugin/api/views.py b/netbox/netbox/tests/dummy_plugin/api/views.py index 58f221285..99f786990 100644 --- a/netbox/netbox/tests/dummy_plugin/api/views.py +++ b/netbox/netbox/tests/dummy_plugin/api/views.py @@ -1,5 +1,7 @@ from rest_framework.viewsets import ModelViewSet + from netbox.tests.dummy_plugin.models import DummyModel + from .serializers import DummySerializer diff --git a/netbox/netbox/tests/dummy_plugin/graphql.py b/netbox/netbox/tests/dummy_plugin/graphql.py index a8bbfcea2..ca378066f 100644 --- a/netbox/netbox/tests/dummy_plugin/graphql.py +++ b/netbox/netbox/tests/dummy_plugin/graphql.py @@ -1,4 +1,5 @@ from typing import List + import strawberry import strawberry_django diff --git a/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py index 517178bd9..2e015b250 100644 --- a/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py +++ b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py @@ -1,7 +1,8 @@ import taggit.managers -import utilities.json from django.db import migrations, models +import utilities.json + class Migration(migrations.Migration): diff --git a/netbox/netbox/tests/dummy_plugin/navigation.py b/netbox/netbox/tests/dummy_plugin/navigation.py index 803cb67dc..64efb8899 100644 --- a/netbox/netbox/tests/dummy_plugin/navigation.py +++ b/netbox/netbox/tests/dummy_plugin/navigation.py @@ -1,6 +1,6 @@ from django.utils.translation import gettext as _ -from netbox.plugins.navigation import PluginMenu, PluginMenuButton, PluginMenuItem +from netbox.plugins.navigation import PluginMenu, PluginMenuButton, PluginMenuItem items = ( PluginMenuItem( diff --git a/netbox/netbox/tests/dummy_plugin/preferences.py b/netbox/netbox/tests/dummy_plugin/preferences.py index f925ee6e0..6535ad4e3 100644 --- a/netbox/netbox/tests/dummy_plugin/preferences.py +++ b/netbox/netbox/tests/dummy_plugin/preferences.py @@ -1,6 +1,5 @@ from users.preferences import UserPreference - preferences = { 'pref1': UserPreference( label='First preference', diff --git a/netbox/netbox/tests/dummy_plugin/search.py b/netbox/netbox/tests/dummy_plugin/search.py index 4b1c6f10e..fa808e1c0 100644 --- a/netbox/netbox/tests/dummy_plugin/search.py +++ b/netbox/netbox/tests/dummy_plugin/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex + from .models import DummyModel diff --git a/netbox/netbox/tests/dummy_plugin/urls.py b/netbox/netbox/tests/dummy_plugin/urls.py index ff6b1cee6..ed708ea1b 100644 --- a/netbox/netbox/tests/dummy_plugin/urls.py +++ b/netbox/netbox/tests/dummy_plugin/urls.py @@ -2,7 +2,6 @@ from django.urls import path from . import views - urlpatterns = ( path('models/', views.DummyModelsView.as_view(), name='dummy_model_list'), path('models/add/', views.DummyModelAddView.as_view(), name='dummy_model_add'), diff --git a/netbox/netbox/tests/dummy_plugin/views.py b/netbox/netbox/tests/dummy_plugin/views.py index 3aac26cf3..888eb91f3 100644 --- a/netbox/netbox/tests/dummy_plugin/views.py +++ b/netbox/netbox/tests/dummy_plugin/views.py @@ -7,15 +7,17 @@ from django.views.generic import View from dcim.models import Site from netbox.views import generic from utilities.views import register_model_view + from .models import DummyModel, DummyNetBoxModel + # Trigger registration of custom column from .tables import mycol # noqa: F401 - # # DummyModel # + class DummyModelsView(View): def get(self, request): diff --git a/netbox/netbox/tests/test_api.py b/netbox/netbox/tests/test_api.py index 8392a49dd..5cc2bf060 100644 --- a/netbox/netbox/tests/test_api.py +++ b/netbox/netbox/tests/test_api.py @@ -6,8 +6,8 @@ from rest_framework.request import Request from netbox.api.exceptions import QuerySetNotOrdered from netbox.api.pagination import OptionalLimitOffsetPagination -from utilities.testing import APITestCase from users.models import Token +from utilities.testing import APITestCase class AppTest(APITestCase): diff --git a/netbox/netbox/tests/test_config.py b/netbox/netbox/tests/test_config.py index f8c892363..ebdfdb166 100644 --- a/netbox/netbox/tests/test_config.py +++ b/netbox/netbox/tests/test_config.py @@ -1,11 +1,10 @@ from django.conf import settings from django.core.cache import cache -from django.test import override_settings, TestCase +from django.test import TestCase, override_settings from core.models import ConfigRevision from netbox.config import clear_config, get_config - # Prefix cache keys to avoid interfering with the local environment CACHES = settings.CACHES CACHES['default'].update({'KEY_PREFIX': 'TEST-'}) diff --git a/netbox/netbox/tests/test_graphql.py b/netbox/netbox/tests/test_graphql.py index 297fe79d3..1c542000e 100644 --- a/netbox/netbox/tests/test_graphql.py +++ b/netbox/netbox/tests/test_graphql.py @@ -5,8 +5,8 @@ from django.urls import reverse from rest_framework import status from dcim.choices import LocationStatusChoices -from dcim.models import Site, Location -from utilities.testing import disable_warnings, APITestCase, TestCase +from dcim.models import Location, Site +from utilities.testing import APITestCase, TestCase, disable_warnings class GraphQLTestCase(TestCase): diff --git a/netbox/netbox/tests/test_jobs.py b/netbox/netbox/tests/test_jobs.py index dea8b30d2..085047bfc 100644 --- a/netbox/netbox/tests/test_jobs.py +++ b/netbox/netbox/tests/test_jobs.py @@ -4,12 +4,13 @@ from django.test import TestCase from django.utils import timezone from django_rq import get_queue -from ..jobs import * -from core.models import DataSource, Job from core.choices import JobStatusChoices from core.exceptions import JobFailed +from core.models import DataSource, Job from utilities.testing import disable_warnings +from ..jobs import * + class TestJobRunner(JobRunner): diff --git a/netbox/netbox/tests/test_model_features.py b/netbox/netbox/tests/test_model_features.py index de548a800..1cf85afa9 100644 --- a/netbox/netbox/tests/test_model_features.py +++ b/netbox/netbox/tests/test_model_features.py @@ -2,13 +2,13 @@ from unittest import skipIf from django.conf import settings from django.test import TestCase +from taggit.models import Tag from core.models import AutoSyncRecord, DataSource from dcim.models import Site from extras.models import CustomLink from ipam.models import Prefix from netbox.models.features import get_model_features, has_feature, model_is_public -from taggit.models import Tag class ModelFeaturesTestCase(TestCase): diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index a8595d10d..c0eecd09d 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -7,14 +7,14 @@ from django.urls import reverse from core.choices import JobIntervalChoices from core.models import ObjectType +from netbox.graphql.schema import Query +from netbox.plugins.navigation import PluginMenu, PluginMenuButton, PluginMenuItem +from netbox.plugins.utils import get_plugin_config +from netbox.registry import registry from netbox.tests.dummy_plugin import config as dummy_config from netbox.tests.dummy_plugin.data_backends import DummyBackend from netbox.tests.dummy_plugin.jobs import DummySystemJob from netbox.tests.dummy_plugin.webhook_callbacks import set_context -from netbox.plugins.navigation import PluginMenu, PluginMenuItem, PluginMenuButton -from netbox.plugins.utils import get_plugin_config -from netbox.graphql.schema import Query -from netbox.registry import registry @skipIf('netbox.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") diff --git a/netbox/netbox/tests/test_views.py b/netbox/netbox/tests/test_views.py index 50cfa5755..06d83fef9 100644 --- a/netbox/netbox/tests/test_views.py +++ b/netbox/netbox/tests/test_views.py @@ -1,7 +1,7 @@ import urllib.parse -from django.urls import reverse from django.test import Client, override_settings +from django.urls import reverse from dcim.models import Site from netbox.constants import EMPTY_TABLE_TEXT diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index e706f295f..6629e41e2 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -8,8 +8,8 @@ from account.views import LoginView, LogoutView from netbox.api.views import APIRootView, AuthenticationCheckView, StatusView from netbox.graphql.schema import schema from netbox.graphql.views import NetBoxGraphQLView -from netbox.plugins.urls import plugin_patterns, plugin_api_patterns -from netbox.views import HomeView, MediaView, StaticMediaFailureView, SearchView, htmx +from netbox.plugins.urls import plugin_api_patterns, plugin_patterns +from netbox.views import HomeView, MediaView, SearchView, StaticMediaFailureView, htmx _patterns = [ diff --git a/netbox/netbox/views/__init__.py b/netbox/netbox/views/__init__.py index d1f1f3d1a..777267e49 100644 --- a/netbox/netbox/views/__init__.py +++ b/netbox/netbox/views/__init__.py @@ -1,2 +1,2 @@ -from .misc import * from .errors import * +from .misc import * diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 4e6f8c343..febf312b2 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -36,6 +36,7 @@ from utilities.request import safe_for_redirect from utilities.string import title from utilities.tables import get_table_configs from utilities.views import GetReturnURLMixin, get_action_url + from .base import BaseMultiObjectView from .mixins import ActionsMixin, TableMixin from .utils import get_prerequisite_model diff --git a/netbox/netbox/views/generic/feature_views.py b/netbox/netbox/views/generic/feature_views.py index 338ed0628..d79488ebb 100644 --- a/netbox/netbox/views/generic/feature_views.py +++ b/netbox/netbox/views/generic/feature_views.py @@ -1,6 +1,6 @@ +from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType -from django.contrib import messages from django.db import router, transaction from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render @@ -12,12 +12,13 @@ from core.tables import JobTable, ObjectChangeTable from extras.forms import JournalEntryForm from extras.models import ImageAttachment, JournalEntry from extras.tables import JournalEntryTable -from tenancy.models import ContactAssignment -from tenancy.tables import ContactAssignmentTable from tenancy.filtersets import ContactAssignmentFilterSet from tenancy.forms import ContactAssignmentFilterForm +from tenancy.models import ContactAssignment +from tenancy.tables import ContactAssignmentTable from utilities.permissions import get_permission_for_model from utilities.views import ConditionalLoginRequiredMixin, GetReturnURLMixin, ViewTab + from .base import BaseMultiObjectView from .object_views import ObjectChildrenView diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 1beaf0275..82a3aa8d6 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -23,6 +23,7 @@ from utilities.querydict import normalize_querydict, prepare_cloned_fields from utilities.request import safe_for_redirect from utilities.tables import get_table_configs from utilities.views import GetReturnURLMixin, get_action_url + from .base import BaseObjectView from .mixins import ActionsMixin, TableMixin from .utils import get_prerequisite_model diff --git a/netbox/netbox/views/misc.py b/netbox/netbox/views/misc.py index ef2af834d..29833fba9 100644 --- a/netbox/netbox/views/misc.py +++ b/netbox/netbox/views/misc.py @@ -1,6 +1,6 @@ +import logging import re from collections import namedtuple -import logging from django.conf import settings from django.contrib import messages diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index 025a858b9..036a560ce 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -1,2 +1,2 @@ -from .serializers_.tenants import * from .serializers_.contacts import * +from .serializers_.tenants import * diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index 1821dc3ac..6c1116920 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -4,10 +4,14 @@ from rest_framework import serializers from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import ( - NestedGroupModelSerializer, NetBoxModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer, + NestedGroupModelSerializer, + NetBoxModelSerializer, + OrganizationalModelSerializer, + PrimaryModelSerializer, ) from tenancy.choices import ContactPriorityChoices -from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole +from tenancy.models import Contact, ContactAssignment, ContactGroup, ContactRole + from .nested import NestedContactGroupSerializer __all__ = ( diff --git a/netbox/tenancy/api/serializers_/tenants.py b/netbox/tenancy/api/serializers_/tenants.py index 277bdc987..1603be2db 100644 --- a/netbox/tenancy/api/serializers_/tenants.py +++ b/netbox/tenancy/api/serializers_/tenants.py @@ -3,6 +3,7 @@ from rest_framework import serializers from netbox.api.fields import RelatedObjectCountField from netbox.api.serializers import NestedGroupModelSerializer, PrimaryModelSerializer from tenancy.models import Tenant, TenantGroup + from .nested import NestedTenantGroupSerializer __all__ = ( diff --git a/netbox/tenancy/api/urls.py b/netbox/tenancy/api/urls.py index 18ea98241..45576029f 100644 --- a/netbox/tenancy/api/urls.py +++ b/netbox/tenancy/api/urls.py @@ -1,6 +1,6 @@ from netbox.api.routers import NetBoxRouter -from . import views +from . import views router = NetBoxRouter() router.APIRootView = views.TenancyRootView diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 371b8ec24..0c8616dc6 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -1,8 +1,9 @@ from rest_framework.routers import APIRootView -from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin +from netbox.api.viewsets import MPTTLockedMixin, NetBoxModelViewSet from tenancy import filtersets from tenancy.models import * + from . import serializers diff --git a/netbox/tenancy/apps.py b/netbox/tenancy/apps.py index d08d178e9..9d4d080dc 100644 --- a/netbox/tenancy/apps.py +++ b/netbox/tenancy/apps.py @@ -6,6 +6,7 @@ class TenancyConfig(AppConfig): def ready(self): from netbox.models.features import register_models + from . import search # noqa: F401 # Register models diff --git a/netbox/tenancy/choices.py b/netbox/tenancy/choices.py index 177a6f2b5..de0203c13 100644 --- a/netbox/tenancy/choices.py +++ b/netbox/tenancy/choices.py @@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _ from utilities.choices import ChoiceSet - # # Contacts # + class ContactPriorityChoices(ChoiceSet): PRIORITY_PRIMARY = 'primary' PRIORITY_SECONDARY = 'secondary' diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index ec70e6858..7d4b8e4ea 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -3,10 +3,14 @@ from django.db.models import Q from django.utils.translation import gettext as _ from netbox.filtersets import ( - NestedGroupModelFilterSet, NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, + NestedGroupModelFilterSet, + NetBoxModelFilterSet, + OrganizationalModelFilterSet, + PrimaryModelFilterSet, ) from utilities.filters import MultiValueContentTypeFilter, TreeNodeMultipleChoiceFilter from utilities.filtersets import register_filterset + from .models import * __all__ = ( diff --git a/netbox/tenancy/forms/__init__.py b/netbox/tenancy/forms/__init__.py index 96c1e50f7..6f991586d 100644 --- a/netbox/tenancy/forms/__init__.py +++ b/netbox/tenancy/forms/__init__.py @@ -1,5 +1,5 @@ -from .forms import * -from .model_forms import * -from .filtersets import * from .bulk_edit import * from .bulk_import import * +from .filtersets import * +from .forms import * +from .model_forms import * diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index d85bcb01f..3565e7d13 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -2,14 +2,18 @@ from django import forms from django.utils.translation import gettext_lazy as _ from netbox.forms import ( - NestedGroupModelBulkEditForm, NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm, + NestedGroupModelBulkEditForm, + NetBoxModelBulkEditForm, + OrganizationalModelBulkEditForm, + PrimaryModelBulkEditForm, ) -from tenancy.choices import ContactPriorityChoices -from tenancy.models import * from utilities.forms import add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet +from ..choices import ContactPriorityChoices +from ..models import * + __all__ = ( 'ContactAssignmentBulkEditForm', 'ContactBulkEditForm', diff --git a/netbox/tenancy/forms/bulk_import.py b/netbox/tenancy/forms/bulk_import.py index befac65c1..d80e05776 100644 --- a/netbox/tenancy/forms/bulk_import.py +++ b/netbox/tenancy/forms/bulk_import.py @@ -3,12 +3,15 @@ from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from netbox.forms import ( - NestedGroupModelImportForm, NetBoxModelImportForm, OrganizationalModelImportForm, + NestedGroupModelImportForm, + NetBoxModelImportForm, + OrganizationalModelImportForm, PrimaryModelImportForm, ) -from tenancy.models import * from utilities.forms.fields import CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField +from ..models import * + __all__ = ( 'ContactAssignmentImportForm', 'ContactImportForm', diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 78057d4e4..46b720971 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -3,17 +3,22 @@ from django.utils.translation import gettext_lazy as _ from core.models import ObjectType from netbox.forms import ( - NestedGroupModelFilterSetForm, NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, + NestedGroupModelFilterSetForm, + NetBoxModelFilterSetForm, + OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm, ) -from tenancy.choices import * -from tenancy.models import * -from tenancy.forms import ContactModelFilterForm from utilities.forms.fields import ( - ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, + ContentTypeMultipleChoiceField, + DynamicModelMultipleChoiceField, + TagFilterField, ) from utilities.forms.rendering import FieldSet +from ..choices import * +from ..models import * +from .forms import ContactModelFilterForm + __all__ = ( 'ContactAssignmentFilterForm', 'ContactFilterForm', diff --git a/netbox/tenancy/forms/forms.py b/netbox/tenancy/forms/forms.py index 0edb36348..84b02247d 100644 --- a/netbox/tenancy/forms/forms.py +++ b/netbox/tenancy/forms/forms.py @@ -1,9 +1,10 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from tenancy.models import * from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField +from ..models import * + __all__ = ( 'ContactModelFilterForm', 'TenancyForm', diff --git a/netbox/tenancy/forms/model_forms.py b/netbox/tenancy/forms/model_forms.py index 6b55d1140..453fef131 100644 --- a/netbox/tenancy/forms/model_forms.py +++ b/netbox/tenancy/forms/model_forms.py @@ -2,10 +2,11 @@ from django import forms from django.utils.translation import gettext_lazy as _ from netbox.forms import NestedGroupModelForm, NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm -from tenancy.models import * from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField from utilities.forms.rendering import FieldSet, ObjectAttribute +from ..models import * + __all__ = ( 'ContactAssignmentForm', 'ContactForm', diff --git a/netbox/tenancy/graphql/filter_mixins.py b/netbox/tenancy/graphql/filter_mixins.py index 1e924ac2d..773cc59a8 100644 --- a/netbox/tenancy/graphql/filter_mixins.py +++ b/netbox/tenancy/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,6 +7,7 @@ from strawberry import ID if TYPE_CHECKING: from netbox.graphql.filter_lookups import TreeNodeFilter + from .filters import ContactAssignmentFilter, TenantFilter, TenantGroupFilter __all__ = ( diff --git a/netbox/tenancy/graphql/filters.py b/netbox/tenancy/graphql/filters.py index f97106d9b..01442d9c7 100644 --- a/netbox/tenancy/graphql/filters.py +++ b/netbox/tenancy/graphql/filters.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django @@ -7,14 +7,18 @@ from strawberry_django import BaseFilterLookup, FilterLookup from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin from netbox.graphql.filters import ( - ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter, + ChangeLoggedModelFilter, + NestedGroupModelFilter, + OrganizationalModelFilter, + PrimaryModelFilter, ) from tenancy import models + from .filter_mixins import ContactFilterMixin if TYPE_CHECKING: - from core.graphql.filters import ContentTypeFilter from circuits.graphql.filters import CircuitFilter, CircuitGroupFilter, VirtualCircuitFilter + from core.graphql.filters import ContentTypeFilter from dcim.graphql.filters import ( CableFilter, DeviceFilter, @@ -38,9 +42,10 @@ if TYPE_CHECKING: VRFFilter, ) from netbox.graphql.filter_lookups import TreeNodeFilter - from wireless.graphql.filters import WirelessLANFilter, WirelessLinkFilter from virtualization.graphql.filters import ClusterFilter, VirtualMachineFilter from vpn.graphql.filters import L2VPNFilter, TunnelFilter + from wireless.graphql.filters import WirelessLANFilter, WirelessLinkFilter + from .enums import * __all__ = ( diff --git a/netbox/tenancy/graphql/types.py b/netbox/tenancy/graphql/types.py index 89d2bb971..4929c7b12 100644 --- a/netbox/tenancy/graphql/types.py +++ b/netbox/tenancy/graphql/types.py @@ -1,11 +1,12 @@ -from typing import Annotated, List, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated, List import strawberry import strawberry_django -from extras.graphql.mixins import CustomFieldsMixin, TagsMixin, ContactsMixin +from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin from netbox.graphql.types import BaseObjectType, NestedGroupObjectType, OrganizationalObjectType, PrimaryObjectType from tenancy import models + from .filters import * from .mixins import ContactAssignmentsMixin @@ -16,15 +17,15 @@ if TYPE_CHECKING: DeviceType, LocationType, PowerFeedType, - RackType, RackReservationType, + RackType, SiteType, VirtualDeviceContextType, ) from ipam.graphql.types import ( AggregateType, - ASNType, ASNRangeType, + ASNType, IPAddressType, IPRangeType, PrefixType, @@ -33,9 +34,9 @@ if TYPE_CHECKING: VRFType, ) from netbox.graphql.types import ContentTypeType - from wireless.graphql.types import WirelessLANType, WirelessLinkType from virtualization.graphql.types import ClusterType, VirtualMachineType from vpn.graphql.types import L2VPNType, TunnelType + from wireless.graphql.types import WirelessLANType, WirelessLinkType __all__ = ( 'ContactAssignmentType', diff --git a/netbox/tenancy/migrations/0001_squashed_0012.py b/netbox/tenancy/migrations/0001_squashed_0012.py index d7e0817ee..f670003cf 100644 --- a/netbox/tenancy/migrations/0001_squashed_0012.py +++ b/netbox/tenancy/migrations/0001_squashed_0012.py @@ -1,8 +1,9 @@ -from utilities.json import CustomFieldJSONEncoder -from django.db import migrations, models import django.db.models.deletion import mptt.fields import taggit.managers +from django.db import migrations, models + +from utilities.json import CustomFieldJSONEncoder class Migration(migrations.Migration): diff --git a/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py b/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py index 849386624..a019a54d8 100644 --- a/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py +++ b/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py @@ -1,6 +1,7 @@ # Generated by Django 4.2.6 on 2023-11-06 20:23 from django.db import migrations, models + import utilities.json diff --git a/netbox/tenancy/search.py b/netbox/tenancy/search.py index c30f3fd17..e7b51360d 100644 --- a/netbox/tenancy/search.py +++ b/netbox/tenancy/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/tenancy/tables/columns.py b/netbox/tenancy/tables/columns.py index 005bcf737..86f164611 100644 --- a/netbox/tenancy/tables/columns.py +++ b/netbox/tenancy/tables/columns.py @@ -1,7 +1,8 @@ -from django.utils.translation import gettext_lazy as _ import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ from netbox.tables import columns + from .template_code import * __all__ = ( diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py index cd0caabdc..d183bfc10 100644 --- a/netbox/tenancy/urls.py +++ b/netbox/tenancy/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views # noqa F401 app_name = 'tenancy' diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 57696d816..3e427a3ce 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -5,14 +5,15 @@ from netbox.object_actions import BulkDelete, BulkEdit, BulkExport, BulkImport 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 * - # # Tenant groups # + @register_model_view(TenantGroup, 'list', path='', detail=False) class TenantGroupListView(generic.ObjectListView): queryset = TenantGroup.objects.add_related_count( diff --git a/netbox/users/api/serializers.py b/netbox/users/api/serializers.py index 9e64515c2..c3886748a 100644 --- a/netbox/users/api/serializers.py +++ b/netbox/users/api/serializers.py @@ -1,4 +1,4 @@ -from .serializers_.users import * +from .serializers_.owners import * from .serializers_.permissions import * from .serializers_.tokens import * -from .serializers_.owners import * +from .serializers_.users import * diff --git a/netbox/users/api/serializers_/owners.py b/netbox/users/api/serializers_/owners.py index 2d704d591..c702b850a 100644 --- a/netbox/users/api/serializers_/owners.py +++ b/netbox/users/api/serializers_/owners.py @@ -1,6 +1,7 @@ from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import ValidatedModelSerializer from users.models import Group, Owner, OwnerGroup, User + from .users import GroupSerializer, UserSerializer __all__ = ( diff --git a/netbox/users/api/serializers_/permissions.py b/netbox/users/api/serializers_/permissions.py index 8f3bd13a8..4418f0e76 100644 --- a/netbox/users/api/serializers_/permissions.py +++ b/netbox/users/api/serializers_/permissions.py @@ -2,6 +2,7 @@ from core.models import ObjectType from netbox.api.fields import ContentTypeField, SerializedPKRelatedField from netbox.api.serializers import ValidatedModelSerializer from users.models import Group, ObjectPermission, User + from .nested import NestedGroupSerializer, NestedUserSerializer __all__ = ( diff --git a/netbox/users/api/serializers_/tokens.py b/netbox/users/api/serializers_/tokens.py index 5a202dbfd..60f094239 100644 --- a/netbox/users/api/serializers_/tokens.py +++ b/netbox/users/api/serializers_/tokens.py @@ -5,6 +5,7 @@ from rest_framework.exceptions import AuthenticationFailed, PermissionDenied from netbox.api.fields import IPNetworkSerializer from netbox.api.serializers import ValidatedModelSerializer from users.models import Token + from .users import * __all__ = ( diff --git a/netbox/users/api/serializers_/users.py b/netbox/users/api/serializers_/users.py index da2aa1820..de0830eef 100644 --- a/netbox/users/api/serializers_/users.py +++ b/netbox/users/api/serializers_/users.py @@ -6,6 +6,7 @@ from rest_framework import serializers from netbox.api.fields import SerializedPKRelatedField from netbox.api.serializers import ValidatedModelSerializer from users.models import Group, ObjectPermission, User + from .permissions import ObjectPermissionSerializer __all__ = ( diff --git a/netbox/users/api/urls.py b/netbox/users/api/urls.py index 8ee9edd5b..abe0883db 100644 --- a/netbox/users/api/urls.py +++ b/netbox/users/api/urls.py @@ -1,8 +1,8 @@ from django.urls import include, path from netbox.api.routers import NetBoxRouter -from . import views +from . import views router = NetBoxRouter() router.APIRootView = views.UsersRootView diff --git a/netbox/users/api/views.py b/netbox/users/api/views.py index de48dc17b..c5eb4947d 100644 --- a/netbox/users/api/views.py +++ b/netbox/users/api/views.py @@ -15,6 +15,7 @@ from users import filtersets from users.models import Group, ObjectPermission, Owner, OwnerGroup, Token, User, UserConfig from utilities.data import deepmerge from utilities.querysets import RestrictedQuerySet + from . import serializers diff --git a/netbox/users/apps.py b/netbox/users/apps.py index 4bfd612d9..34b075148 100644 --- a/netbox/users/apps.py +++ b/netbox/users/apps.py @@ -6,6 +6,7 @@ class UsersConfig(AppConfig): def ready(self): from netbox.models.features import register_models + from . import signals # noqa: F401 # Register models diff --git a/netbox/users/constants.py b/netbox/users/constants.py index 0888d16bc..18add80cb 100644 --- a/netbox/users/constants.py +++ b/netbox/users/constants.py @@ -2,7 +2,6 @@ import string from django.db.models import Q - OBJECTPERMISSION_OBJECT_TYPES = ( (Q(public=True) & ~Q(app_label='core', model='objecttype')) | Q(app_label='core', model__in=['managedfile']) diff --git a/netbox/users/filterset_mixins.py b/netbox/users/filterset_mixins.py index 113d6211c..e75f4b98c 100644 --- a/netbox/users/filterset_mixins.py +++ b/netbox/users/filterset_mixins.py @@ -1,7 +1,7 @@ import django_filters from django.utils.translation import gettext as _ -from users.models import OwnerGroup, Owner +from users.models import Owner, OwnerGroup __all__ = ( 'OwnerFilterMixin', diff --git a/netbox/users/forms/bulk_import.py b/netbox/users/forms/bulk_import.py index 16f2fd378..490587d99 100644 --- a/netbox/users/forms/bulk_import.py +++ b/netbox/users/forms/bulk_import.py @@ -1,11 +1,11 @@ from django import forms from django.utils.translation import gettext as _ -from users.models import * + from users.choices import TokenVersionChoices +from users.models import * from utilities.forms import CSVModelForm from utilities.forms.fields import CSVModelChoiceField, CSVModelMultipleChoiceField - __all__ = ( 'GroupImportForm', 'OwnerGroupImportForm', diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 4c1a6a1eb..c1576e6a3 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -19,7 +19,10 @@ from users.constants import * from users.models import * from utilities.data import flatten_dict from utilities.forms.fields import ( - ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, + ContentTypeMultipleChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + JSONField, ) from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DateTimePicker, SplitMultiSelectWidget diff --git a/netbox/users/graphql/mixins.py b/netbox/users/graphql/mixins.py index f185eba66..d8db210ee 100644 --- a/netbox/users/graphql/mixins.py +++ b/netbox/users/graphql/mixins.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry diff --git a/netbox/users/graphql/types.py b/netbox/users/graphql/types.py index e04fc8668..d01d549fa 100644 --- a/netbox/users/graphql/types.py +++ b/netbox/users/graphql/types.py @@ -4,6 +4,7 @@ import strawberry_django from netbox.graphql.types import BaseObjectType from users.models import Group, Owner, OwnerGroup, User + from .filters import * __all__ = ( diff --git a/netbox/users/migrations/0001_squashed_0011.py b/netbox/users/migrations/0001_squashed_0011.py index ffba6f21b..23098fa73 100644 --- a/netbox/users/migrations/0001_squashed_0011.py +++ b/netbox/users/migrations/0001_squashed_0011.py @@ -1,9 +1,10 @@ -from django.conf import settings import django.contrib.auth.models import django.contrib.postgres.fields import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + import users.models diff --git a/netbox/users/migrations/0002_squashed_0004.py b/netbox/users/migrations/0002_squashed_0004.py index 275d7a7a9..f152a0180 100644 --- a/netbox/users/migrations/0002_squashed_0004.py +++ b/netbox/users/migrations/0002_squashed_0004.py @@ -1,6 +1,7 @@ import django.contrib.auth.models import django.contrib.postgres.fields from django.db import migrations, models + import ipam.fields diff --git a/netbox/users/migrations/0006_custom_group_model.py b/netbox/users/migrations/0006_custom_group_model.py index 99be38cb4..06fea9338 100644 --- a/netbox/users/migrations/0006_custom_group_model.py +++ b/netbox/users/migrations/0006_custom_group_model.py @@ -1,6 +1,7 @@ -import users.models from django.db import migrations, models +import users.models + def update_custom_fields(apps, schema_editor): """ diff --git a/netbox/users/models/__init__.py b/netbox/users/models/__init__.py index c6223e996..516619934 100644 --- a/netbox/users/models/__init__.py +++ b/netbox/users/models/__init__.py @@ -1,5 +1,5 @@ -from .users import * +from .owners import * +from .permissions import * from .preferences import * from .tokens import * -from .permissions import * -from .owners import * +from .users import * diff --git a/netbox/users/models/users.py b/netbox/users/models/users.py index cbfb46330..8ed165c5a 100644 --- a/netbox/users/models/users.py +++ b/netbox/users/models/users.py @@ -1,8 +1,12 @@ from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.models import ( GroupManager as DjangoGroupManager, +) +from django.contrib.auth.models import ( Permission, PermissionsMixin, +) +from django.contrib.auth.models import ( UserManager as DjangoUserManager, ) from django.contrib.auth.validators import UnicodeUsernameValidator diff --git a/netbox/users/tests/test_api.py b/netbox/users/tests/test_api.py index 5eed904c8..1a66df67a 100644 --- a/netbox/users/tests/test_api.py +++ b/netbox/users/tests/test_api.py @@ -5,7 +5,7 @@ from core.models import ObjectType from users.constants import TOKEN_DEFAULT_LENGTH from users.models import Group, ObjectPermission, Owner, OwnerGroup, Token, User from utilities.data import deepmerge -from utilities.testing import APIViewTestCases, APITestCase, create_test_user +from utilities.testing import APITestCase, APIViewTestCases, create_test_user class AppTest(APITestCase): diff --git a/netbox/users/tests/test_models.py b/netbox/users/tests/test_models.py index df3192260..b62ddc9d2 100644 --- a/netbox/users/tests/test_models.py +++ b/netbox/users/tests/test_models.py @@ -5,7 +5,7 @@ from django.test import TestCase, override_settings from django.utils import timezone from users.choices import TokenVersionChoices -from users.models import User, Token +from users.models import Token, User from utilities.testing import create_test_user diff --git a/netbox/users/tests/test_preferences.py b/netbox/users/tests/test_preferences.py index 13120d328..81757fb31 100644 --- a/netbox/users/tests/test_preferences.py +++ b/netbox/users/tests/test_preferences.py @@ -8,7 +8,6 @@ from users.models import User from users.preferences import UserPreference from utilities.testing import TestCase - DEFAULT_USER_PREFERENCES = { 'pagination': { 'per_page': 250, diff --git a/netbox/users/tests/test_tables.py b/netbox/users/tests/test_tables.py index 0ac51e45e..74c4df3b8 100644 --- a/netbox/users/tests/test_tables.py +++ b/netbox/users/tests/test_tables.py @@ -1,4 +1,4 @@ -from django.test import RequestFactory, tag, TestCase +from django.test import RequestFactory, TestCase, tag from users.models import Token from users.tables import TokenTable diff --git a/netbox/users/urls.py b/netbox/users/urls.py index d820295b0..3fe9b3083 100644 --- a/netbox/users/urls.py +++ b/netbox/users/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views # noqa F401 app_name = 'users' diff --git a/netbox/users/views.py b/netbox/users/views.py index 09a88a14b..44f311615 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -8,14 +8,15 @@ from netbox.views import generic from users.ui import panels from utilities.query import count_related from utilities.views import GetRelatedModelsMixin, register_model_view -from . import filtersets, forms, tables -from .models import Group, User, ObjectPermission, Owner, OwnerGroup, Token +from . import filtersets, forms, tables +from .models import Group, ObjectPermission, Owner, OwnerGroup, Token, User # # Tokens # + @register_model_view(Token, 'list', path='', detail=False) class TokenListView(generic.ObjectListView): queryset = Token.objects.all() diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index 7c9fcf607..076ce3b0c 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -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 diff --git a/netbox/utilities/counters.py b/netbox/utilities/counters.py index b396d4617..16b66a57d 100644 --- a/netbox/utilities/counters.py +++ b/netbox/utilities/counters.py @@ -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 diff --git a/netbox/utilities/forms/fields/array.py b/netbox/utilities/forms/fields/array.py index e4f6c972f..290835fa8 100644 --- a/netbox/utilities/forms/fields/array.py +++ b/netbox/utilities/forms/fields/array.py @@ -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 diff --git a/netbox/utilities/forms/fields/csv.py b/netbox/utilities/forms/fields/csv.py index eab2773c1..497a1816e 100644 --- a/netbox/utilities/forms/fields/csv.py +++ b/netbox/utilities/forms/fields/csv.py @@ -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 diff --git a/netbox/utilities/forms/fields/fields.py b/netbox/utilities/forms/fields/fields.py index 560ef25e9..bd8600c4c 100644 --- a/netbox/utilities/forms/fields/fields.py +++ b/netbox/utilities/forms/fields/fields.py @@ -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 diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 1608573c3..d79cdac02 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -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__ = ( diff --git a/netbox/utilities/forms/widgets/select.py b/netbox/utilities/forms/widgets/select.py index 97b6ecf5a..4e0c06211 100644 --- a/netbox/utilities/forms/widgets/select.py +++ b/netbox/utilities/forms/widgets/select.py @@ -1,6 +1,7 @@ from django import forms from netbox.choices import ColorChoices + from ..utils import add_blank_choice __all__ = ( diff --git a/netbox/utilities/htmx.py b/netbox/utilities/htmx.py index 75fbab265..a712e9742 100644 --- a/netbox/utilities/htmx.py +++ b/netbox/utilities/htmx.py @@ -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', diff --git a/netbox/utilities/mptt.py b/netbox/utilities/mptt.py index 7ded5b72b..4914fccab 100644 --- a/netbox/utilities/mptt.py +++ b/netbox/utilities/mptt.py @@ -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__ = ( diff --git a/netbox/utilities/paginator.py b/netbox/utilities/paginator.py index 1db815446..2ed08e15c 100644 --- a/netbox/utilities/paginator.py +++ b/netbox/utilities/paginator.py @@ -1,4 +1,4 @@ -from django.core.paginator import Paginator, Page +from django.core.paginator import Page, Paginator from netbox.config import get_config diff --git a/netbox/utilities/permissions.py b/netbox/utilities/permissions.py index ba245dae1..81a1ff70b 100644 --- a/netbox/utilities/permissions.py +++ b/netbox/utilities/permissions.py @@ -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 _ diff --git a/netbox/utilities/proxy.py b/netbox/utilities/proxy.py index 8c9e3d196..0cc2b00ed 100644 --- a/netbox/utilities/proxy.py +++ b/netbox/utilities/proxy.py @@ -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', diff --git a/netbox/utilities/query.py b/netbox/utilities/query.py index 5eaff836f..408ec87f2 100644 --- a/netbox/utilities/query.py +++ b/netbox/utilities/query.py @@ -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 diff --git a/netbox/utilities/querydict.py b/netbox/utilities/querydict.py index 17a0c8c2b..0d5702426 100644 --- a/netbox/utilities/querydict.py +++ b/netbox/utilities/querydict.py @@ -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__ = ( diff --git a/netbox/utilities/request.py b/netbox/utilities/request.py index 92b879139..da642ba24 100644 --- a/netbox/utilities/request.py +++ b/netbox/utilities/request.py @@ -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__ = ( diff --git a/netbox/utilities/serializers/json.py b/netbox/utilities/serializers/json.py index e64e9e0f6..ee7dd6cb2 100644 --- a/netbox/utilities/serializers/json.py +++ b/netbox/utilities/serializers/json.py @@ -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 diff --git a/netbox/utilities/socks.py b/netbox/utilities/socks.py index 6b62e8fc7..59c377426 100644 --- a/netbox/utilities/socks.py +++ b/netbox/utilities/socks.py @@ -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') diff --git a/netbox/utilities/templatetags/builtins/tags.py b/netbox/utilities/templatetags/builtins/tags.py index 663bf5647..074605367 100644 --- a/netbox/utilities/templatetags/builtins/tags.py +++ b/netbox/utilities/templatetags/builtins/tags.py @@ -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 diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 19318111e..89261b335 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -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', diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 56cabef5d..7ca8f332d 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -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 diff --git a/netbox/utilities/testing/base.py b/netbox/utilities/testing/base.py index c84530325..b39dd69b7 100644 --- a/netbox/utilities/testing/base.py +++ b/netbox/utilities/testing/base.py @@ -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__ = ( diff --git a/netbox/utilities/testing/views.py b/netbox/utilities/testing/views.py index c4ef28e26..c07f7eacb 100644 --- a/netbox/utilities/testing/views.py +++ b/netbox/utilities/testing/views.py @@ -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 diff --git a/netbox/utilities/tests/test_data.py b/netbox/utilities/tests/test_data.py index 7d75d9085..0d4bd95df 100644 --- a/netbox/utilities/tests/test_data.py +++ b/netbox/utilities/tests/test_data.py @@ -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, diff --git a/netbox/utilities/tests/test_filter_modifiers.py b/netbox/utilities/tests/test_filter_modifiers.py index 9adabde62..0bc6eb4c3 100644 --- a/netbox/utilities/tests/test_filter_modifiers.py +++ b/netbox/utilities/tests/test_filter_modifiers.py @@ -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 diff --git a/netbox/utilities/tests/test_filters.py b/netbox/utilities/tests/test_filters.py index 3c24fe10c..1c64f8d28 100644 --- a/netbox/utilities/tests/test_filters.py +++ b/netbox/utilities/tests/test_filters.py @@ -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): diff --git a/netbox/utilities/tests/test_forms.py b/netbox/utilities/tests/test_forms.py index 6e523c271..2224cc195 100644 --- a/netbox/utilities/tests/test_forms.py +++ b/netbox/utilities/tests/test_forms.py @@ -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 diff --git a/netbox/utilities/tests/test_request.py b/netbox/utilities/tests/test_request.py index 69f677323..46580cc38 100644 --- a/netbox/utilities/tests/test_request.py +++ b/netbox/utilities/tests/test_request.py @@ -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 diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 72b7c3a6d..ef170da2f 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -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__ = ( diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index cb86844d2..c07db311a 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -1,6 +1,7 @@ -from dcim.constants import LOCATION_SCOPE_TYPES from django.contrib.contenttypes.models import ContentType from rest_framework import serializers + +from dcim.constants import LOCATION_SCOPE_TYPES from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 2309987b3..70355a1bb 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -1,8 +1,8 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from dcim.api.serializers_.devices import DeviceSerializer from dcim.api.serializers_.device_components import MACAddressSerializer +from dcim.api.serializers_.devices import DeviceSerializer from dcim.api.serializers_.platforms import PlatformSerializer from dcim.api.serializers_.roles import DeviceRoleSerializer from dcim.api.serializers_.sites import SiteSerializer @@ -19,6 +19,7 @@ from users.api.serializers_.mixins import OwnerMixin from virtualization.choices import * from virtualization.models import VirtualDisk, VirtualMachine, VMInterface from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer + from .clusters import ClusterSerializer from .nested import NestedVMInterfaceSerializer diff --git a/netbox/virtualization/api/urls.py b/netbox/virtualization/api/urls.py index ce71605a1..013f8b78e 100644 --- a/netbox/virtualization/api/urls.py +++ b/netbox/virtualization/api/urls.py @@ -1,6 +1,6 @@ from netbox.api.routers import NetBoxRouter -from . import views +from . import views router = NetBoxRouter() router.APIRootView = views.VirtualizationRootView diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 93980ce28..4fe0e9ca7 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -6,6 +6,7 @@ from netbox.api.viewsets import NetBoxModelViewSet from utilities.query_functions import CollateAsChar from virtualization import filtersets from virtualization.models import * + from . import serializers diff --git a/netbox/virtualization/apps.py b/netbox/virtualization/apps.py index 42754c693..d337e0219 100644 --- a/netbox/virtualization/apps.py +++ b/netbox/virtualization/apps.py @@ -7,6 +7,7 @@ class VirtualizationConfig(AppConfig): def ready(self): from netbox.models.features import register_models from utilities.counters import connect_counters + from . import search, signals # noqa: F401 from .models import VirtualMachine diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py index b00c9f1e2..8e2217c40 100644 --- a/netbox/virtualization/choices.py +++ b/netbox/virtualization/choices.py @@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _ from utilities.choices import ChoiceSet - # # Clusters # + class ClusterStatusChoices(ChoiceSet): key = 'Cluster.status' diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index 6b3bdb424..8378d56b5 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -6,16 +6,16 @@ from netaddr.core import AddrFormatError from dcim.base_filtersets import ScopedFilterSet from dcim.filtersets import CommonInterfaceFilterSet -from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup -from dcim.models import MACAddress +from dcim.models import Device, DeviceRole, MACAddress, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate from ipam.filtersets import PrimaryIPFilterSet from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet -from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet +from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from users.filterset_mixins import OwnerFilterMixin from utilities.filters import MultiValueCharFilter, MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter from utilities.filtersets import register_filterset + from .choices import * from .models import * diff --git a/netbox/virtualization/forms/__init__.py b/netbox/virtualization/forms/__init__.py index 3c9dd3651..d856109af 100644 --- a/netbox/virtualization/forms/__init__.py +++ b/netbox/virtualization/forms/__init__.py @@ -1,6 +1,6 @@ -from .model_forms import * -from .filtersets import * -from .object_create import * from .bulk_create import * from .bulk_edit import * from .bulk_import import * +from .filtersets import * +from .model_forms import * +from .object_create import * diff --git a/netbox/virtualization/forms/bulk_create.py b/netbox/virtualization/forms/bulk_create.py index 875ff60fa..ebc396c1e 100644 --- a/netbox/virtualization/forms/bulk_create.py +++ b/netbox/virtualization/forms/bulk_create.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _ from utilities.forms import form_from_model from utilities.forms.fields import ExpandableNameField -from virtualization.models import VirtualDisk, VMInterface, VirtualMachine +from virtualization.models import VirtualDisk, VirtualMachine, VMInterface __all__ = ( 'VirtualDiskBulkCreateForm', diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 3d1363114..2811fb16a 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -6,7 +6,7 @@ from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN from dcim.forms.mixins import ScopedBulkEditForm from dcim.models import Device, DeviceRole, Platform, Site from extras.models import ConfigTemplate -from ipam.models import VLAN, VLANGroup, VLANTranslationPolicy, VRF +from ipam.models import VLAN, VRF, VLANGroup, VLANTranslationPolicy from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm from netbox.forms.mixins import OwnerMixin from tenancy.models import Tenant diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index b6eb7480e..b29d24b45 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -7,8 +7,7 @@ from dcim.models import Device, DeviceRole, Platform, Site from extras.models import ConfigTemplate from ipam.choices import VLANQinQRoleChoices from ipam.models import VLAN, VRF, VLANGroup -from netbox.forms import NetBoxModelImportForm -from netbox.forms import OrganizationalModelImportForm, OwnerCSVMixin, PrimaryModelImportForm +from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, OwnerCSVMixin, PrimaryModelImportForm from tenancy.models import Tenant from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField from virtualization.choices import * diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index b74f1b901..eac686730 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -9,7 +9,7 @@ from dcim.forms.mixins import ScopedForm from dcim.models import Device, DeviceRole, MACAddress, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate from ipam.choices import VLANQinQRoleChoices -from ipam.models import IPAddress, VLAN, VLANGroup, VLANTranslationPolicy, VRF +from ipam.models import VLAN, VRF, IPAddress, VLANGroup, VLANTranslationPolicy from netbox.forms import NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm from netbox.forms.mixins import OwnerMixin from tenancy.forms import TenancyForm diff --git a/netbox/virtualization/forms/object_create.py b/netbox/virtualization/forms/object_create.py index 2f6844a5c..b3ecd88f1 100644 --- a/netbox/virtualization/forms/object_create.py +++ b/netbox/virtualization/forms/object_create.py @@ -1,5 +1,7 @@ from django.utils.translation import gettext_lazy as _ + from utilities.forms.fields import ExpandableNameField + from .model_forms import VirtualDiskForm, VMInterfaceForm __all__ = ( diff --git a/netbox/virtualization/graphql/filter_mixins.py b/netbox/virtualization/graphql/filter_mixins.py index c387f4c4e..2bf313ac5 100644 --- a/netbox/virtualization/graphql/filter_mixins.py +++ b/netbox/virtualization/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 diff --git a/netbox/virtualization/graphql/filters.py b/netbox/virtualization/graphql/filters.py index 3bb71be6f..99c324bf8 100644 --- a/netbox/virtualization/graphql/filters.py +++ b/netbox/virtualization/graphql/filters.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django @@ -14,8 +14,6 @@ from virtualization import models from virtualization.graphql.filter_mixins import VMComponentFilterMixin if TYPE_CHECKING: - from .enums import * - from netbox.graphql.filter_lookups import FloatLookup, IntegerLookup from dcim.graphql.filters import DeviceFilter, DeviceRoleFilter, MACAddressFilter, PlatformFilter, SiteFilter from ipam.graphql.filters import ( FHRPGroupAssignmentFilter, @@ -24,8 +22,11 @@ if TYPE_CHECKING: VLANGroupFilter, VRFFilter, ) + from netbox.graphql.filter_lookups import FloatLookup, IntegerLookup from vpn.graphql.filters import L2VPNFilter, TunnelTerminationFilter + from .enums import * + __all__ = ( 'ClusterFilter', 'ClusterGroupFilter', diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 59323e7e5..5928fd6a5 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/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 @@ -6,9 +6,10 @@ import strawberry_django from extras.graphql.mixins import ConfigContextMixin, ContactsMixin from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from netbox.graphql.scalars import BigInt -from netbox.graphql.types import OrganizationalObjectType, PrimaryObjectType, NetBoxObjectType +from netbox.graphql.types import NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType from users.graphql.mixins import OwnerMixin from virtualization import models + from .filters import * if TYPE_CHECKING: diff --git a/netbox/virtualization/migrations/0001_squashed_0022.py b/netbox/virtualization/migrations/0001_squashed_0022.py index caa890b13..28fb98a0c 100644 --- a/netbox/virtualization/migrations/0001_squashed_0022.py +++ b/netbox/virtualization/migrations/0001_squashed_0022.py @@ -1,12 +1,13 @@ -import dcim.fields -from utilities.json import CustomFieldJSONEncoder import django.core.validators -from django.db import migrations, models import django.db.models.deletion import taggit.managers +from django.db import migrations, models + +import dcim.fields import utilities.fields import utilities.ordering import utilities.query_functions +from utilities.json import CustomFieldJSONEncoder class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0037_protect_child_interfaces.py b/netbox/virtualization/migrations/0037_protect_child_interfaces.py index a19e4e9ce..12de40467 100644 --- a/netbox/virtualization/migrations/0037_protect_child_interfaces.py +++ b/netbox/virtualization/migrations/0037_protect_child_interfaces.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.6 on 2023-10-20 11:48 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0038_virtualdisk.py b/netbox/virtualization/migrations/0038_virtualdisk.py index 2f7824121..b86cde338 100644 --- a/netbox/virtualization/migrations/0038_virtualdisk.py +++ b/netbox/virtualization/migrations/0038_virtualdisk.py @@ -1,6 +1,7 @@ -from django.db import migrations, models import django.db.models.deletion import taggit.managers +from django.db import migrations, models + import utilities.fields import utilities.json import utilities.ordering diff --git a/netbox/virtualization/migrations/0040_convert_disk_size.py b/netbox/virtualization/migrations/0040_convert_disk_size.py index e3c3cd2ac..e337c17fc 100644 --- a/netbox/virtualization/migrations/0040_convert_disk_size.py +++ b/netbox/virtualization/migrations/0040_convert_disk_size.py @@ -1,5 +1,6 @@ from django.db import migrations from django.db.models import F, Sum + from netbox.settings import DISK_BASE_UNIT diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 00d145e69..65f4928b5 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index c770581d0..a0b4d1067 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -6,6 +6,7 @@ from netbox.tables import NetBoxTable, PrimaryModelTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin from utilities.templatetags.helpers import humanize_disk_megabytes from virtualization.models import VirtualDisk, VirtualMachine, VMInterface + from .template_code import * __all__ = ( diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 40c4df2ba..453298025 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -11,11 +11,15 @@ from dcim.models import Site from extras.choices import CustomFieldTypeChoices from extras.models import ConfigTemplate, CustomField from ipam.choices import VLANQinQRoleChoices -from ipam.models import Prefix, VLAN, VRF +from ipam.models import VLAN, VRF, Prefix from users.constants import TOKEN_PREFIX from users.models import Token from utilities.testing import ( - APITestCase, APIViewTestCases, create_test_device, create_test_virtualmachine, disable_logging, + APITestCase, + APIViewTestCases, + create_test_device, + create_test_virtualmachine, + disable_logging, ) from virtualization.choices import * from virtualization.models import * diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index 13a007c15..d9e96d940 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -3,7 +3,7 @@ from django.test import TestCase from dcim.choices import InterfaceModeChoices from dcim.models import Device, DeviceRole, MACAddress, Platform, Region, Site, SiteGroup from ipam.choices import VLANQinQRoleChoices -from ipam.models import IPAddress, VLAN, VLANTranslationPolicy, VRF +from ipam.models import VLAN, VRF, IPAddress, VLANTranslationPolicy from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.choices import * diff --git a/netbox/virtualization/tests/test_models.py b/netbox/virtualization/tests/test_models.py index 7be423bf1..c35ff75a0 100644 --- a/netbox/virtualization/tests/test_models.py +++ b/netbox/virtualization/tests/test_models.py @@ -2,8 +2,8 @@ from django.core.exceptions import ValidationError from django.test import TestCase from dcim.models import Site -from virtualization.models import * from tenancy.models import Tenant +from virtualization.models import * class VirtualMachineTestCase(TestCase): diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 679f6f229..725260529 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views app_name = 'virtualization' diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 09bfdf61a..eb4d31be4 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -15,7 +15,14 @@ from extras.views import ObjectConfigContextView, ObjectRenderConfigView from ipam.models import IPAddress, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.object_actions import ( - AddObject, BulkDelete, BulkEdit, BulkExport, BulkImport, BulkRename, DeleteObject, EditObject, + AddObject, + BulkDelete, + BulkEdit, + BulkExport, + BulkImport, + BulkRename, + DeleteObject, + EditObject, ) from netbox.ui import actions, layout from netbox.ui.panels import CommentsPanel, ObjectsTablePanel, TemplatePanel @@ -23,16 +30,17 @@ from netbox.views import generic from utilities.query import count_related from utilities.query_functions import CollateAsChar from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view + from . import filtersets, forms, tables from .models import * from .object_actions import BulkAddComponents from .ui import panels - # # Cluster types # + @register_model_view(ClusterType, 'list', path='', detail=False) class ClusterTypeListView(generic.ObjectListView): queryset = ClusterType.objects.annotate( diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index 9e4afa8f8..e2e02c008 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -1,3 +1,3 @@ from .serializers_.crypto import * -from .serializers_.tunnels import * from .serializers_.l2vpn import * +from .serializers_.tunnels import * diff --git a/netbox/vpn/api/serializers_/tunnels.py b/netbox/vpn/api/serializers_/tunnels.py index eb5cfc302..98f579bd4 100644 --- a/netbox/vpn/api/serializers_/tunnels.py +++ b/netbox/vpn/api/serializers_/tunnels.py @@ -7,6 +7,7 @@ from netbox.api.serializers import NetBoxModelSerializer, OrganizationalModelSer from tenancy.api.serializers_.tenants import TenantSerializer from vpn.choices import * from vpn.models import Tunnel, TunnelGroup, TunnelTermination + from .crypto import IPSecProfileSerializer __all__ = ( diff --git a/netbox/vpn/api/urls.py b/netbox/vpn/api/urls.py index 5358325f3..c40910a62 100644 --- a/netbox/vpn/api/urls.py +++ b/netbox/vpn/api/urls.py @@ -1,4 +1,5 @@ from netbox.api.routers import NetBoxRouter + from . import views router = NetBoxRouter() diff --git a/netbox/vpn/api/views.py b/netbox/vpn/api/views.py index 4119d396a..741f08c09 100644 --- a/netbox/vpn/api/views.py +++ b/netbox/vpn/api/views.py @@ -3,6 +3,7 @@ from rest_framework.routers import APIRootView from netbox.api.viewsets import NetBoxModelViewSet from vpn import filtersets from vpn.models import * + from . import serializers __all__ = ( diff --git a/netbox/vpn/apps.py b/netbox/vpn/apps.py index 1afa0d527..e44630419 100644 --- a/netbox/vpn/apps.py +++ b/netbox/vpn/apps.py @@ -7,6 +7,7 @@ class VPNConfig(AppConfig): def ready(self): from netbox.models.features import register_models + from . import search # noqa: F401 # Register models diff --git a/netbox/vpn/choices.py b/netbox/vpn/choices.py index db03e48f8..6f4e2f4f7 100644 --- a/netbox/vpn/choices.py +++ b/netbox/vpn/choices.py @@ -2,11 +2,11 @@ from django.utils.translation import gettext_lazy as _ from utilities.choices import ChoiceSet - # # Tunnels # + class TunnelStatusChoices(ChoiceSet): key = 'Tunnel.status' diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index b819de106..ef63c40bb 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -4,12 +4,13 @@ from django.utils.translation import gettext as _ from core.models import ObjectType from dcim.models import Device, Interface -from ipam.models import IPAddress, RouteTarget, VLAN +from ipam.models import VLAN, IPAddress, RouteTarget from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter from utilities.filtersets import register_filterset from virtualization.models import VirtualMachine, VMInterface + from .choices import * from .models import * diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index 9add8b674..7b095053a 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -2,7 +2,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface -from ipam.models import IPAddress, VLAN +from ipam.models import VLAN, IPAddress from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, PrimaryModelImportForm from tenancy.models import Tenant from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index f47000e92..ef9ce5e5e 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -3,11 +3,14 @@ from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ from dcim.models import Device, Region, Site -from ipam.models import RouteTarget, VLAN +from ipam.models import VLAN, RouteTarget from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms.fields import ( - ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, + ContentTypeMultipleChoiceField, + DynamicModelChoiceField, + DynamicModelMultipleChoiceField, + TagFilterField, ) from utilities.forms.rendering import FieldSet from utilities.forms.utils import add_blank_choice diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index fc1922550..82bc79e4e 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -3,7 +3,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface -from ipam.models import IPAddress, RouteTarget, VLAN +from ipam.models import VLAN, IPAddress, RouteTarget from netbox.forms import NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm from tenancy.forms import TenancyForm from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField diff --git a/netbox/vpn/graphql/filters.py b/netbox/vpn/graphql/filters.py index f1cd54149..79f3a31e6 100644 --- a/netbox/vpn/graphql/filters.py +++ b/netbox/vpn/graphql/filters.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django @@ -7,7 +7,10 @@ from strawberry_django import BaseFilterLookup, FilterLookup from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin from netbox.graphql.filters import ( - ChangeLoggedModelFilter, NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter, + ChangeLoggedModelFilter, + NetBoxModelFilter, + OrganizationalModelFilter, + PrimaryModelFilter, ) from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin from vpn import models @@ -16,6 +19,7 @@ if TYPE_CHECKING: from core.graphql.filters import ContentTypeFilter from ipam.graphql.filters import IPAddressFilter, RouteTargetFilter from netbox.graphql.filter_lookups import BigIntegerLookup, IntegerLookup + from .enums import * __all__ = ( diff --git a/netbox/vpn/graphql/types.py b/netbox/vpn/graphql/types.py index 902880511..87b99d2a9 100644 --- a/netbox/vpn/graphql/types.py +++ b/netbox/vpn/graphql/types.py @@ -1,11 +1,12 @@ -from typing import Annotated, List, TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Annotated, List, Union import strawberry import strawberry_django from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin -from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType, PrimaryObjectType +from netbox.graphql.types import NetBoxObjectType, ObjectType, OrganizationalObjectType, PrimaryObjectType from vpn import models + from .filters import * if TYPE_CHECKING: diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py index eed3c6329..f3c09b1e9 100644 --- a/netbox/vpn/migrations/0001_initial.py +++ b/netbox/vpn/migrations/0001_initial.py @@ -1,6 +1,7 @@ -from django.db import migrations, models import django.db.models.deletion import taggit.managers +from django.db import migrations, models + import utilities.json diff --git a/netbox/vpn/migrations/0002_move_l2vpn.py b/netbox/vpn/migrations/0002_move_l2vpn.py index 41ccb8a8d..73a0fca24 100644 --- a/netbox/vpn/migrations/0002_move_l2vpn.py +++ b/netbox/vpn/migrations/0002_move_l2vpn.py @@ -1,6 +1,7 @@ -from django.db import migrations, models import django.db.models.deletion import taggit.managers +from django.db import migrations, models + import utilities.json diff --git a/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py b/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py index ce042b4db..1c854a1fd 100644 --- a/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py +++ b/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.8 on 2024-01-05 19:31 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/netbox/vpn/search.py b/netbox/vpn/search.py index 342a57f38..bfa091c1d 100644 --- a/netbox/vpn/search.py +++ b/netbox/vpn/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/vpn/tests/test_filtersets.py b/netbox/vpn/tests/test_filtersets.py index e024cd2a0..fd444dc4c 100644 --- a/netbox/vpn/tests/test_filtersets.py +++ b/netbox/vpn/tests/test_filtersets.py @@ -2,7 +2,7 @@ from django.test import TestCase from dcim.choices import InterfaceTypeChoices from dcim.models import Device, Interface, Site -from ipam.models import IPAddress, VLAN, RouteTarget +from ipam.models import VLAN, IPAddress, RouteTarget from utilities.testing import ChangeLoggedFilterSetTests, create_test_device, create_test_virtualmachine from virtualization.models import VirtualMachine, VMInterface from vpn.choices import * diff --git a/netbox/vpn/tests/test_models.py b/netbox/vpn/tests/test_models.py index e464dccd9..d9349ac35 100644 --- a/netbox/vpn/tests/test_models.py +++ b/netbox/vpn/tests/test_models.py @@ -1,7 +1,7 @@ from django.core.exceptions import ValidationError from django.test import TestCase -from dcim.models import Interface, Device, DeviceRole, DeviceType, Manufacturer, Site +from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site from ipam.models import VLAN from vpn.models import * diff --git a/netbox/vpn/tests/test_tables.py b/netbox/vpn/tests/test_tables.py index 0c7a4ae80..e7c0fbd5c 100644 --- a/netbox/vpn/tests/test_tables.py +++ b/netbox/vpn/tests/test_tables.py @@ -1,4 +1,4 @@ -from django.test import RequestFactory, tag, TestCase +from django.test import RequestFactory, TestCase, tag from vpn.models import TunnelTermination from vpn.tables import TunnelTerminationTable diff --git a/netbox/vpn/tests/test_views.py b/netbox/vpn/tests/test_views.py index 6d2239169..63c69985d 100644 --- a/netbox/vpn/tests/test_views.py +++ b/netbox/vpn/tests/test_views.py @@ -1,6 +1,6 @@ from dcim.choices import InterfaceTypeChoices from dcim.models import Interface -from ipam.models import RouteTarget, VLAN +from ipam.models import VLAN, RouteTarget from utilities.testing import ViewTestCases, create_tags, create_test_device from vpn.choices import * from vpn.models import * diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py index 1169dcd15..c83536994 100644 --- a/netbox/vpn/urls.py +++ b/netbox/vpn/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views # noqa F401 app_name = 'vpn' diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index 1d699ab74..219eab681 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -3,14 +3,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 * - # # Tunnel groups # + @register_model_view(TunnelGroup, 'list', path='', detail=False) class TunnelGroupListView(generic.ObjectListView): queryset = TunnelGroup.objects.annotate( diff --git a/netbox/wireless/api/serializers_/wirelesslans.py b/netbox/wireless/api/serializers_/wirelesslans.py index 517e93863..0a055a568 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -9,6 +9,7 @@ from netbox.api.serializers import NestedGroupModelSerializer, PrimaryModelSeria from tenancy.api.serializers_.tenants import TenantSerializer from wireless.choices import * from wireless.models import WirelessLAN, WirelessLANGroup + from .nested import NestedWirelessLANGroupSerializer __all__ = ( diff --git a/netbox/wireless/api/urls.py b/netbox/wireless/api/urls.py index 5375172eb..0c093147c 100644 --- a/netbox/wireless/api/urls.py +++ b/netbox/wireless/api/urls.py @@ -1,6 +1,6 @@ from netbox.api.routers import NetBoxRouter -from . import views +from . import views router = NetBoxRouter() router.APIRootView = views.WirelessRootView diff --git a/netbox/wireless/api/views.py b/netbox/wireless/api/views.py index 999743981..f5883e930 100644 --- a/netbox/wireless/api/views.py +++ b/netbox/wireless/api/views.py @@ -1,8 +1,9 @@ from rest_framework.routers import APIRootView -from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin +from netbox.api.viewsets import MPTTLockedMixin, NetBoxModelViewSet from wireless import filtersets from wireless.models import * + from . import serializers diff --git a/netbox/wireless/apps.py b/netbox/wireless/apps.py index ea2d9bbc0..908abeb04 100644 --- a/netbox/wireless/apps.py +++ b/netbox/wireless/apps.py @@ -6,7 +6,8 @@ class WirelessConfig(AppConfig): def ready(self): from netbox.models.features import register_models - from . import signals, search # noqa: F401 + + from . import search, signals # noqa: F401 # Register models register_models(*self.get_models()) diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 2790a29f6..10f21faba 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -9,6 +9,7 @@ from netbox.filtersets import NestedGroupModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import TreeNodeMultipleChoiceFilter from utilities.filtersets import register_filterset + from .choices import * from .models import * diff --git a/netbox/wireless/forms/__init__.py b/netbox/wireless/forms/__init__.py index 3098b356a..1499f98b2 100644 --- a/netbox/wireless/forms/__init__.py +++ b/netbox/wireless/forms/__init__.py @@ -1,4 +1,4 @@ -from .model_forms import * -from .filtersets import * from .bulk_edit import * from .bulk_import import * +from .filtersets import * +from .model_forms import * diff --git a/netbox/wireless/graphql/filter_mixins.py b/netbox/wireless/graphql/filter_mixins.py index d5b85425a..5ecf2188d 100644 --- a/netbox/wireless/graphql/filter_mixins.py +++ b/netbox/wireless/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 diff --git a/netbox/wireless/graphql/filters.py b/netbox/wireless/graphql/filters.py index b1432ac8c..10c67d200 100644 --- a/netbox/wireless/graphql/filters.py +++ b/netbox/wireless/graphql/filters.py @@ -1,4 +1,4 @@ -from typing import Annotated, TYPE_CHECKING +from typing import TYPE_CHECKING, Annotated import strawberry import strawberry_django @@ -7,14 +7,16 @@ from strawberry_django import BaseFilterLookup, FilterLookup from dcim.graphql.filter_mixins import ScopedFilterMixin from netbox.graphql.filter_mixins import DistanceFilterMixin -from netbox.graphql.filters import PrimaryModelFilter, NestedGroupModelFilter +from netbox.graphql.filters import NestedGroupModelFilter, PrimaryModelFilter from tenancy.graphql.filter_mixins import TenancyFilterMixin from wireless import models + from .filter_mixins import WirelessAuthenticationFilterMixin if TYPE_CHECKING: from dcim.graphql.filters import InterfaceFilter from ipam.graphql.filters import VLANFilter + from .enums import * __all__ = ( diff --git a/netbox/wireless/graphql/types.py b/netbox/wireless/graphql/types.py index 124056b91..5cdf813cf 100644 --- a/netbox/wireless/graphql/types.py +++ b/netbox/wireless/graphql/types.py @@ -1,10 +1,11 @@ -from typing import Annotated, List, TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Annotated, List, Union import strawberry import strawberry_django from netbox.graphql.types import NestedGroupObjectType, PrimaryObjectType from wireless import models + from .filters import * if TYPE_CHECKING: diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 060f83f13..35e5bb9dc 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -7,6 +7,7 @@ from dcim.constants import WIRELESS_IFACE_TYPES from dcim.models.mixins import CachedScopeMixin from netbox.models import NestedGroupModel, PrimaryModel from netbox.models.mixins import DistanceMixin + from .choices import * from .constants import * diff --git a/netbox/wireless/search.py b/netbox/wireless/search.py index 3c1565cb7..092cd3377 100644 --- a/netbox/wireless/search.py +++ b/netbox/wireless/search.py @@ -1,4 +1,5 @@ from netbox.search import SearchIndex, register_search + from . import models diff --git a/netbox/wireless/signals.py b/netbox/wireless/signals.py index ce55e55f3..d5cc1152d 100644 --- a/netbox/wireless/signals.py +++ b/netbox/wireless/signals.py @@ -1,19 +1,20 @@ import logging -from django.db.models.signals import post_save, post_delete +from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from dcim.exceptions import UnsupportedCablePath from dcim.models import CablePath, Interface from dcim.utils import create_cablepaths from utilities.exceptions import AbortRequest -from .models import WirelessLink +from .models import WirelessLink # # Wireless links # + @receiver(post_save, sender=WirelessLink) def update_connected_interfaces(instance, created, raw=False, **kwargs): """ diff --git a/netbox/wireless/tests/test_filtersets.py b/netbox/wireless/tests/test_filtersets.py index 443418bd8..5338e6a06 100644 --- a/netbox/wireless/tests/test_filtersets.py +++ b/netbox/wireless/tests/test_filtersets.py @@ -5,10 +5,10 @@ from dcim.models import Interface, Location, Region, Site, SiteGroup from ipam.models import VLAN from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant +from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from wireless.choices import * from wireless.filtersets import * from wireless.models import * -from utilities.testing import ChangeLoggedFilterSetTests, create_test_device class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): diff --git a/netbox/wireless/tests/test_views.py b/netbox/wireless/tests/test_views.py index 587ae7f89..ef2e24b4f 100644 --- a/netbox/wireless/tests/test_views.py +++ b/netbox/wireless/tests/test_views.py @@ -1,11 +1,12 @@ from django.contrib.contenttypes.models import ContentType -from wireless.choices import * -from wireless.models import * + from dcim.choices import InterfaceTypeChoices, LinkStatusChoices from dcim.models import Interface, Site from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant from utilities.testing import ViewTestCases, create_tags, create_test_device +from wireless.choices import * +from wireless.models import * class WirelessLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): diff --git a/netbox/wireless/urls.py b/netbox/wireless/urls.py index ee69c46de..555394a59 100644 --- a/netbox/wireless/urls.py +++ b/netbox/wireless/urls.py @@ -1,6 +1,7 @@ from django.urls import include, path from utilities.urls import get_model_urls + from . import views # noqa F401 app_name = 'wireless' diff --git a/netbox/wireless/utils.py b/netbox/wireless/utils.py index 5494179d1..c3abceb86 100644 --- a/netbox/wireless/utils.py +++ b/netbox/wireless/utils.py @@ -1,4 +1,5 @@ from decimal import Decimal + from django.utils.translation import gettext_lazy as _ from .choices import WirelessChannelChoices diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index 1f7c3fc76..4533970f8 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -2,14 +2,15 @@ from dcim.models import Interface 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 * - # # Wireless LAN groups # + @register_model_view(WirelessLANGroup, 'list', path='', detail=False) class WirelessLANGroupListView(generic.ObjectListView): queryset = WirelessLANGroup.objects.add_related_count( diff --git a/ruff.toml b/ruff.toml index 72b8a8200..e4dd6f574 100644 --- a/ruff.toml +++ b/ruff.toml @@ -36,6 +36,7 @@ extend-select = [ "E3", # pycodestyle errors: blank lines / spacing around definitions "E501", # pycodestyle: line too long (enforced with `line-length` above) "W", # pycodestyle warnings (various style warnings, often whitespace/newlines) + "I", # import sorting (isort-equivalent) ] ignore = [ "F403", # pyflakes: `from ... import *` used; unable to detect undefined names @@ -44,6 +45,23 @@ ignore = [ ] preview = true +[lint.isort] +known-first-party = [ + "account", + "circuits", + "core", + "dcim", + "extras", + "ipam", + "netbox", + "tenancy", + "users", + "utilities", + "virtualization", + "vpn", + "wireless", +] + [lint.per-file-ignores] "template_code.py" = ["E501"]