api.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from django.urls import reverse
  2. from rest_framework.utils import formatting
  3. from netbox.api.exceptions import SerializerNotFound
  4. from .utils import dynamic_import
  5. def get_serializer_for_model(model, prefix=''):
  6. """
  7. Dynamically resolve and return the appropriate serializer for a model.
  8. """
  9. app_name, model_name = model._meta.label.split('.')
  10. # Serializers for Django's auth models are in the users app
  11. if app_name == 'auth':
  12. app_name = 'users'
  13. serializer_name = f'{app_name}.api.serializers.{prefix}{model_name}Serializer'
  14. try:
  15. return dynamic_import(serializer_name)
  16. except AttributeError:
  17. raise SerializerNotFound(
  18. "Could not determine serializer for {}.{} with prefix '{}'".format(app_name, model_name, prefix)
  19. )
  20. def is_api_request(request):
  21. """
  22. Return True of the request is being made via the REST API.
  23. """
  24. api_path = reverse('api-root')
  25. return request.path_info.startswith(api_path)
  26. def get_view_name(view, suffix=None):
  27. """
  28. Derive the view name from its associated model, if it has one. Fall back to DRF's built-in `get_view_name`.
  29. """
  30. if hasattr(view, 'queryset'):
  31. # Determine the model name from the queryset.
  32. name = view.queryset.model._meta.verbose_name
  33. name = ' '.join([w[0].upper() + w[1:] for w in name.split()]) # Capitalize each word
  34. else:
  35. # Replicate DRF's built-in behavior.
  36. name = view.__class__.__name__
  37. name = formatting.remove_trailing_string(name, 'View')
  38. name = formatting.remove_trailing_string(name, 'ViewSet')
  39. name = formatting.camelcase_to_spaces(name)
  40. if suffix:
  41. name += ' ' + suffix
  42. return name