mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-09 00:58:16 -06:00
15156 review changes
This commit is contained in:
parent
1ff4e165e3
commit
0447572d5b
@ -6,6 +6,7 @@ from drf_spectacular.utils import extend_schema_field
|
|||||||
from drf_spectacular.types import OpenApiTypes
|
from drf_spectacular.types import OpenApiTypes
|
||||||
|
|
||||||
from utilities.api import get_related_object_by_attrs
|
from utilities.api import get_related_object_by_attrs
|
||||||
|
from .fields import NetBoxAPIHyperlinkedIdentityField, NetBoxURLHyperlinkedIdentityField
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'BaseModelSerializer',
|
'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):
|
class BaseModelSerializer(serializers.ModelSerializer):
|
||||||
url = NetBoxAPIHyperlinkedIdentityField(view_name="")
|
url = NetBoxAPIHyperlinkedIdentityField(view_name="")
|
||||||
display_url = NetBoxURLHyperlinkedIdentityField(view_name="")
|
display_url = NetBoxURLHyperlinkedIdentityField(view_name="")
|
||||||
|
45
netbox/netbox/api/serializers/fields.py
Normal file
45
netbox/netbox/api/serializers/fields.py
Normal file
@ -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}'
|
Loading…
Reference in New Issue
Block a user