Coverage for netbox/api/serializers/fields.py: 88%
22 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.utils.translation import gettext_lazy as _
2from rest_framework import serializers
4from utilities.views import get_viewname
6__all__ = (
7 'NetBoxAPIHyperlinkedIdentityField',
8 'NetBoxURLHyperlinkedIdentityField',
9)
12class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField):
13 """
14 Overrides HyperlinkedIdentityField to use standard NetBox view naming
15 instead of passing in the view_name. Initialize with a blank view_name
16 and it will get replaced in the get_url call. Derived classes must
17 define a get_view_name.
18 """
19 def __init__(self, *args, **kwargs):
20 super().__init__(view_name="", *args, **kwargs)
22 def get_url(self, obj, view_name, request, format):
23 """
24 Given an object, return the URL that hyperlinks to the object.
26 May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
27 attributes are not configured to correctly match the URL conf.
28 """
29 # Unsaved objects will not yet have a valid URL.
30 if hasattr(obj, 'pk') and obj.pk in (None, ''): 30 ↛ 31line 30 didn't jump to line 31 because the condition on line 30 was never true
31 return None
33 lookup_value = getattr(obj, self.lookup_field)
34 kwargs = {self.lookup_url_kwarg: lookup_value}
36 view_name = self.get_view_name(obj)
37 return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
39 def get_view_name(self, model):
40 raise NotImplementedError(_('{class_name} must implement get_view_name()').format(
41 class_name=self.__class__.__name__
42 ))
45class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
47 def get_view_name(self, model):
48 return get_viewname(model=model, action='detail', rest_api=True)
51class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
53 def get_view_name(self, model):
54 return get_viewname(model=model)