From 0447572d5bf0616f57743da977898048c0055f62 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 20 Jun 2024 09:34:03 -0700 Subject: [PATCH] 15156 review changes --- netbox/netbox/api/serializers/base.py | 40 +--------------------- netbox/netbox/api/serializers/fields.py | 45 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 netbox/netbox/api/serializers/fields.py diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 46f06544b..622e54a63 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -6,6 +6,7 @@ from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes from utilities.api import get_related_object_by_attrs +from .fields import NetBoxAPIHyperlinkedIdentityField, NetBoxURLHyperlinkedIdentityField __all__ = ( 'BaseModelSerializer', @@ -13,45 +14,6 @@ __all__ = ( ) -class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): - """ - Overrides HyperlinkedIdentityField to use standard NetBox view naming - instead of passing in the view_name. Initialize with a blank view_name - and it will get replaced in the get_url call. Derived classes must - define a get_view_name. - """ - def get_url(self, obj, view_name, request, format): - """ - Given an object, return the URL that hyperlinks to the object. - - May raise a `NoReverseMatch` if the `view_name` and `lookup_field` - attributes are not configured to correctly match the URL conf. - """ - # Unsaved objects will not yet have a valid URL. - if hasattr(obj, 'pk') and obj.pk in (None, ''): - return None - - lookup_value = getattr(obj, self.lookup_field) - kwargs = {self.lookup_url_kwarg: lookup_value} - - model_name = self.parent.Meta.model._meta.model_name - app_name = self.parent.Meta.model._meta.app_label - view_name = self.get_view_name(app_name, model_name) - return self.reverse(view_name, kwargs=kwargs, request=request, format=format) - - -class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): - - def get_view_name(self, app_name, model_name): - return f'{app_name}-api:{model_name}-detail' - - -class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): - - def get_view_name(self, app_name, model_name): - return f'{app_name}:{model_name}' - - class BaseModelSerializer(serializers.ModelSerializer): url = NetBoxAPIHyperlinkedIdentityField(view_name="") display_url = NetBoxURLHyperlinkedIdentityField(view_name="") diff --git a/netbox/netbox/api/serializers/fields.py b/netbox/netbox/api/serializers/fields.py new file mode 100644 index 000000000..d03344bef --- /dev/null +++ b/netbox/netbox/api/serializers/fields.py @@ -0,0 +1,45 @@ +from rest_framework import serializers + +__all__ = ( + 'NetBoxAPIHyperlinkedIdentityField', + 'NetBoxURLHyperlinkedIdentityField', +) + + +class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + """ + Overrides HyperlinkedIdentityField to use standard NetBox view naming + instead of passing in the view_name. Initialize with a blank view_name + and it will get replaced in the get_url call. Derived classes must + define a get_view_name. + """ + def get_url(self, obj, view_name, request, format): + """ + Given an object, return the URL that hyperlinks to the object. + + May raise a `NoReverseMatch` if the `view_name` and `lookup_field` + attributes are not configured to correctly match the URL conf. + """ + # Unsaved objects will not yet have a valid URL. + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + + model_name = self.parent.Meta.model._meta.model_name + app_name = self.parent.Meta.model._meta.app_label + view_name = self.get_view_name(app_name, model_name) + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + +class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}-api:{model_name}-detail' + + +class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}:{model_name}'