Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mixin classes renaming and filter code reorganization #2798

Merged
merged 11 commits into from Nov 16, 2022
2 changes: 2 additions & 0 deletions changes/2779.changed
@@ -0,0 +1,2 @@
Renamed many mixin classes for clarity and consistency. Aliases remain but will raise `DeprecationWarning`.
Reorganized filterset code and created `nautobot.dcim.filters.mixins`, `nautobot.extras.filters.mixins`, and `nautobot.tenancy.filters.mixins` submodules.
1 change: 1 addition & 0 deletions changes/2798.added
@@ -0,0 +1 @@
Added `LOG_DEPRECATION_WARNINGS` configuration variable and corresponding environment-variable support.
1 change: 1 addition & 0 deletions changes/2798.changed
@@ -0,0 +1 @@
Changed logging of Nautobot deprecation warnings to be silent by default (can be enabled with `DEBUG` or `LOG_DEPRECATION_WARNINGS` settings).
18 changes: 11 additions & 7 deletions nautobot/circuits/api/serializers.py
Expand Up @@ -9,14 +9,14 @@
NestedSiteSerializer,
)
from nautobot.dcim.api.serializers import (
CableTerminationSerializer,
ConnectedEndpointSerializer,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
)
from nautobot.extras.api.serializers import (
NautobotModelSerializer,
NotesSerializerMixin,
StatusModelSerializerMixin,
TaggedObjectSerializer,
TaggedModelSerializerMixin,
)
from nautobot.tenancy.api.nested_serializers import NestedTenantSerializer

Expand All @@ -35,7 +35,7 @@
#


class ProviderSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class ProviderSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="circuits-api:provider-detail")
circuit_count = serializers.IntegerField(read_only=True)

Expand All @@ -60,7 +60,7 @@ class Meta:
#


class ProviderNetworkSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class ProviderNetworkSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="circuits-api:providernetwork-detail")
provider = NestedProviderSerializer()

Expand Down Expand Up @@ -118,7 +118,7 @@ class Meta:
]


class CircuitSerializer(NautobotModelSerializer, StatusModelSerializerMixin, TaggedObjectSerializer):
class CircuitSerializer(NautobotModelSerializer, StatusModelSerializerMixin, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="circuits-api:circuit-detail")
provider = NestedProviderSerializer()
type = NestedCircuitTypeSerializer()
Expand All @@ -144,7 +144,11 @@ class Meta:
]


class CircuitTerminationSerializer(NautobotModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
class CircuitTerminationSerializer(
NautobotModelSerializer,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="circuits-api:circuittermination-detail")
circuit = NestedCircuitSerializer()
site = NestedSiteSerializer(required=False, allow_null=True)
Expand Down
15 changes: 9 additions & 6 deletions nautobot/circuits/filters.py
@@ -1,11 +1,14 @@
import django_filters
from django.db.models import Q

from nautobot.dcim.filter_mixins import LocatableModelFilterSetMixin
from nautobot.dcim.filters import CableTerminationFilterSet, PathEndpointFilterSet
from nautobot.dcim.filters import (
CableTerminationModelFilterSetMixin,
LocatableModelFilterSetMixin,
PathEndpointModelFilterSetMixin,
)
from nautobot.dcim.models import Location, Region, Site
from nautobot.extras.filters import NautobotFilterSet, StatusModelFilterSetMixin
from nautobot.tenancy.filters import TenancyFilterSet
from nautobot.tenancy.filters import TenancyModelFilterSetMixin
from nautobot.utilities.filters import (
BaseFilterSet,
NameSlugSearchFilterSet,
Expand Down Expand Up @@ -110,7 +113,7 @@ class Meta:
fields = ["id", "name", "slug"]


class CircuitFilterSet(NautobotFilterSet, StatusModelFilterSetMixin, TenancyFilterSet):
class CircuitFilterSet(NautobotFilterSet, StatusModelFilterSetMixin, TenancyModelFilterSetMixin):
q = SearchFilter(
filter_predicates={
"cid": "icontains",
Expand Down Expand Up @@ -183,9 +186,9 @@ class Meta:

class CircuitTerminationFilterSet(
BaseFilterSet,
CableTerminationFilterSet,
CableTerminationModelFilterSetMixin,
LocatableModelFilterSetMixin,
PathEndpointFilterSet,
PathEndpointModelFilterSetMixin,
):
q = SearchFilter(
filter_predicates={
Expand Down
4 changes: 4 additions & 0 deletions nautobot/core/settings.py
Expand Up @@ -76,6 +76,10 @@
GIT_ROOT = os.getenv("NAUTOBOT_GIT_ROOT", os.path.join(NAUTOBOT_ROOT, "git").rstrip("/"))
HTTP_PROXIES = None
JOBS_ROOT = os.getenv("NAUTOBOT_JOBS_ROOT", os.path.join(NAUTOBOT_ROOT, "jobs").rstrip("/"))

# Log Nautobot deprecation warnings. Note that this setting is ignored (deprecation logs always enabled) if DEBUG = True
LOG_DEPRECATION_WARNINGS = is_truthy(os.getenv("NAUTOBOT_LOG_DEPRECATION_WARNINGS", "False"))

MAINTENANCE_MODE = is_truthy(os.getenv("NAUTOBOT_MAINTENANCE_MODE", "False"))
# Metrics
METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_METRICS_ENABLED", "False"))
Expand Down
4 changes: 4 additions & 0 deletions nautobot/core/templates/nautobot_config.py.j2
Expand Up @@ -367,6 +367,10 @@ SECRET_KEY = os.getenv("NAUTOBOT_SECRET_KEY", "{{ secret_key }}")
#
# JOBS_ROOT = os.getenv("NAUTOBOT_JOBS_ROOT", os.path.join(NAUTOBOT_ROOT, "jobs").rstrip("/"))

# Log Nautobot deprecation warnings. Note that this setting is ignored (deprecation logs always enabled) if DEBUG = True
#
# LOG_DEPRECATION_WARNINGS = is_truthy(os.getenv("NAUTOBOT_LOG_DEPRECATION_WARNINGS", "False"))

# Setting this to True will display a "maintenance mode" banner at the top of every page.
#
# MAINTENANCE_MODE = is_truthy(os.getenv("NAUTOBOT_MAINTENANCE_MODE", "False"))
Expand Down
83 changes: 48 additions & 35 deletions nautobot/dcim/api/serializers.py
Expand Up @@ -75,7 +75,7 @@
from nautobot.extras.api.serializers import (
NautobotModelSerializer,
StatusModelSerializerMixin,
TaggedObjectSerializer,
TaggedModelSerializerMixin,
)
from nautobot.extras.api.nested_serializers import NestedConfigContextSchemaSerializer, NestedSecretsGroupSerializer
from nautobot.extras.models import Status
Expand All @@ -89,6 +89,7 @@
from nautobot.users.api.nested_serializers import NestedUserSerializer
from nautobot.utilities.api import get_serializer_for_model
from nautobot.utilities.config import get_settings_or_config
from nautobot.utilities.deprecation import class_deprecated_in_favor_of
from nautobot.virtualization.api.nested_serializers import NestedClusterSerializer

# Not all of these variable(s) are not actually used anywhere in this file, but required for the
Expand Down Expand Up @@ -132,7 +133,7 @@
)


class CableTerminationSerializer(serializers.ModelSerializer):
class CableTerminationModelSerializerMixin(serializers.ModelSerializer):
glennmatthews marked this conversation as resolved.
Show resolved Hide resolved
cable_peer_type = serializers.SerializerMethodField(read_only=True)
cable_peer = serializers.SerializerMethodField(read_only=True)

Expand All @@ -154,7 +155,13 @@ def get_cable_peer(self, obj):
return None


class ConnectedEndpointSerializer(ValidatedModelSerializer):
# TODO: remove in 2.2
@class_deprecated_in_favor_of(CableTerminationModelSerializerMixin)
class CableTerminationSerializer(CableTerminationModelSerializerMixin):
pass


class PathEndpointModelSerializerMixin(ValidatedModelSerializer):
glennmatthews marked this conversation as resolved.
Show resolved Hide resolved
connected_endpoint_type = serializers.SerializerMethodField(read_only=True)
connected_endpoint = serializers.SerializerMethodField(read_only=True)
connected_endpoint_reachable = serializers.SerializerMethodField(read_only=True)
Expand Down Expand Up @@ -183,6 +190,12 @@ def get_connected_endpoint_reachable(self, obj):
return None


# TODO: remove in 2.2
@class_deprecated_in_favor_of(PathEndpointModelSerializerMixin)
class ConnectedEndpointSerializer(PathEndpointModelSerializerMixin):
pass


#
# Regions/sites
#
Expand All @@ -207,7 +220,7 @@ class Meta:
]


class SiteSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class SiteSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:site-detail")
region = NestedRegionSerializer(required=False, allow_null=True)
tenant = NestedTenantSerializer(required=False, allow_null=True)
Expand Down Expand Up @@ -283,7 +296,7 @@ class Meta:
]


class LocationSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class LocationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:location-detail")
location_type = NestedLocationTypeSerializer()
parent = NestedLocationSerializer(required=False, allow_null=True)
Expand Down Expand Up @@ -384,7 +397,7 @@ class Meta:
]


class RackSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class RackSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:rack-detail")
site = NestedSiteSerializer()
location = NestedLocationSerializer(required=False, allow_null=True)
Expand Down Expand Up @@ -450,7 +463,7 @@ class RackUnitSerializer(serializers.Serializer):
occupied = serializers.BooleanField(read_only=True)


class RackReservationSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class RackReservationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:rackreservation-detail")
rack = NestedRackSerializer()
user = NestedUserSerializer()
Expand Down Expand Up @@ -513,7 +526,7 @@ class Meta:
]


class DeviceTypeSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class DeviceTypeSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:devicetype-detail")
manufacturer = NestedManufacturerSerializer()
subdevice_role = ChoiceField(choices=SubdeviceRoleChoices, allow_blank=True, required=False)
Expand Down Expand Up @@ -743,7 +756,7 @@ class Meta:
]


class DeviceSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class DeviceSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:device-detail")
device_type = NestedDeviceTypeSerializer()
device_role = NestedDeviceRoleSerializer()
Expand Down Expand Up @@ -842,9 +855,9 @@ class DeviceNAPALMSerializer(serializers.Serializer):

class ConsoleServerPortSerializer(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:consoleserverport-detail")
device = NestedDeviceSerializer()
Expand All @@ -871,9 +884,9 @@ class Meta:

class ConsolePortSerializer(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:consoleport-detail")
device = NestedDeviceSerializer()
Expand All @@ -900,9 +913,9 @@ class Meta:

class PowerOutletSerializer(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:poweroutlet-detail")
device = NestedDeviceSerializer()
Expand Down Expand Up @@ -933,9 +946,9 @@ class Meta:

class PowerPortSerializer(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:powerport-detail")
device = NestedDeviceSerializer()
Expand Down Expand Up @@ -965,9 +978,9 @@ class Meta:
# 2.0 TODO: This becomes non-default in 2.0, removed in 2.2.
class InterfaceSerializerVersion12(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:interface-detail")
device = NestedDeviceSerializer()
Expand Down Expand Up @@ -1062,7 +1075,7 @@ class Meta:
fields.insert(4, "status")


class RearPortSerializer(NautobotModelSerializer, TaggedObjectSerializer, CableTerminationSerializer):
class RearPortSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, CableTerminationModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:rearport-detail")
device = NestedDeviceSerializer()
type = ChoiceField(choices=PortTypeChoices)
Expand Down Expand Up @@ -1096,7 +1109,7 @@ class Meta:
fields = ["id", "url", "name", "label"]


class FrontPortSerializer(NautobotModelSerializer, TaggedObjectSerializer, CableTerminationSerializer):
class FrontPortSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, CableTerminationModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:frontport-detail")
device = NestedDeviceSerializer()
type = ChoiceField(choices=PortTypeChoices)
Expand All @@ -1120,7 +1133,7 @@ class Meta:
]


class DeviceBaySerializer(NautobotModelSerializer, TaggedObjectSerializer):
class DeviceBaySerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:devicebay-detail")
device = NestedDeviceSerializer()
installed_device = NestedDeviceSerializer(required=False, allow_null=True)
Expand All @@ -1137,7 +1150,7 @@ class Meta:
]


class DeviceRedundancyGroupSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class DeviceRedundancyGroupSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:deviceredundancygroup-detail")
failover_strategy = ChoiceField(choices=DeviceRedundancyGroupFailoverStrategyChoices)

Expand All @@ -1159,7 +1172,7 @@ class Meta:
#


class InventoryItemSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class InventoryItemSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:inventoryitem-detail")
device = NestedDeviceSerializer()
# Provide a default value to satisfy UniqueTogetherValidator
Expand Down Expand Up @@ -1190,7 +1203,7 @@ class Meta:
#


class CableSerializer(NautobotModelSerializer, TaggedObjectSerializer, StatusModelSerializerMixin):
class CableSerializer(NautobotModelSerializer, TaggedModelSerializerMixin, StatusModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:cable-detail")
termination_a_type = ContentTypeField(queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS))
termination_b_type = ContentTypeField(queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS))
Expand Down Expand Up @@ -1342,7 +1355,7 @@ def get_connected_endpoint_reachable(self, obj):
#


class VirtualChassisSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class VirtualChassisSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:virtualchassis-detail")
master = NestedDeviceSerializer(required=False, allow_null=True)
member_count = serializers.IntegerField(read_only=True)
Expand All @@ -1363,7 +1376,7 @@ class Meta:
#


class PowerPanelSerializer(NautobotModelSerializer, TaggedObjectSerializer):
class PowerPanelSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:powerpanel-detail")
site = NestedSiteSerializer()
location = NestedLocationSerializer(required=False, allow_null=True)
Expand All @@ -1384,9 +1397,9 @@ class Meta:

class PowerFeedSerializer(
NautobotModelSerializer,
TaggedObjectSerializer,
CableTerminationSerializer,
ConnectedEndpointSerializer,
TaggedModelSerializerMixin,
CableTerminationModelSerializerMixin,
PathEndpointModelSerializerMixin,
StatusModelSerializerMixin,
):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:powerfeed-detail")
Expand Down