views.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. (serializers.CircuitSerializer, ['status']),
  18. (serializers.CircuitTerminationSerializer, ['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.ProviderFilterSet
  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.CircuitTypeFilterSet
  47. #
  48. # Circuits
  49. #
  50. class CircuitViewSet(CustomFieldModelViewSet):
  51. queryset = Circuit.objects.prefetch_related(
  52. 'type', 'tenant', 'provider', 'terminations__site', 'terminations__connected_endpoint__device'
  53. ).prefetch_related('tags')
  54. serializer_class = serializers.CircuitSerializer
  55. filterset_class = filters.CircuitFilterSet
  56. #
  57. # Circuit Terminations
  58. #
  59. class CircuitTerminationViewSet(ModelViewSet):
  60. queryset = CircuitTermination.objects.prefetch_related(
  61. 'circuit', 'site', 'connected_endpoint__device', 'cable'
  62. )
  63. serializer_class = serializers.CircuitTerminationSerializer
  64. filterset_class = filters.CircuitTerminationFilterSet