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

1from django.utils.translation import gettext_lazy as _ 

2from rest_framework import serializers 

3 

4from utilities.views import get_viewname 

5 

6__all__ = ( 

7 'NetBoxAPIHyperlinkedIdentityField', 

8 'NetBoxURLHyperlinkedIdentityField', 

9) 

10 

11 

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) 

21 

22 def get_url(self, obj, view_name, request, format): 

23 """ 

24 Given an object, return the URL that hyperlinks to the object. 

25 

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 

32 

33 lookup_value = getattr(obj, self.lookup_field) 

34 kwargs = {self.lookup_url_kwarg: lookup_value} 

35 

36 view_name = self.get_view_name(obj) 

37 return self.reverse(view_name, kwargs=kwargs, request=request, format=format) 

38 

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 )) 

43 

44 

45class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): 

46 

47 def get_view_name(self, model): 

48 return get_viewname(model=model, action='detail', rest_api=True) 

49 

50 

51class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): 

52 

53 def get_view_name(self, model): 

54 return get_viewname(model=model)