views.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django.db.models import Count
  2. from django.shortcuts import get_object_or_404
  3. from rest_framework.decorators import action
  4. from rest_framework.response import Response
  5. from circuits import filters
  6. from circuits.models import Provider, CircuitTermination, CircuitType, Circuit
  7. from extras.api.serializers import RenderedGraphSerializer
  8. from extras.api.views import CustomFieldModelViewSet
  9. from extras.models import Graph
  10. from utilities.api import FieldChoicesViewSet, ModelViewSet
  11. from . import serializers
  12. #
  13. # Field choices
  14. #
  15. class CircuitsFieldChoicesViewSet(FieldChoicesViewSet):
  16. fields = (
  17. (Circuit, ['status']),
  18. (CircuitTermination, ['term_side']),
  19. )
  20. #
  21. # Providers
  22. #
  23. class ProviderViewSet(CustomFieldModelViewSet):
  24. queryset = Provider.objects.prefetch_related('tags').annotate(
  25. circuit_count=Count('circuits')
  26. )
  27. serializer_class = serializers.ProviderSerializer
  28. filterset_class = filters.ProviderFilter
  29. @action(detail=True)
  30. def graphs(self, request, pk):
  31. """
  32. A convenience method for rendering graphs for a particular provider.
  33. """
  34. provider = get_object_or_404(Provider, pk=pk)
  35. queryset = Graph.objects.filter(type__model='provider')
  36. serializer = RenderedGraphSerializer(queryset, many=True, context={'graphed_object': provider})
  37. return Response(serializer.data)
  38. #
  39. # Circuit Types
  40. #
  41. class CircuitTypeViewSet(ModelViewSet):
  42. queryset = CircuitType.objects.annotate(
  43. circuit_count=Count('circuits')
  44. )
  45. serializer_class = serializers.CircuitTypeSerializer
  46. filterset_class = filters.CircuitTypeFilter
  47. #
  48. # Circuits
  49. #
  50. class CircuitViewSet(CustomFieldModelViewSet):
  51. queryset = Circuit.objects.prefetch_related('type', 'tenant', 'provider').prefetch_related('tags')
  52. serializer_class = serializers.CircuitSerializer
  53. filterset_class = filters.CircuitFilter
  54. #
  55. # Circuit Terminations
  56. #
  57. class CircuitTerminationViewSet(ModelViewSet):
  58. queryset = CircuitTermination.objects.prefetch_related(
  59. 'circuit', 'site', 'connected_endpoint__device', 'cable'
  60. )
  61. serializer_class = serializers.CircuitTerminationSerializer
  62. filterset_class = filters.CircuitTerminationFilter