views.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from django.shortcuts import get_object_or_404
  2. from rest_framework.decorators import action
  3. from rest_framework.exceptions import PermissionDenied
  4. from rest_framework.response import Response
  5. from rest_framework.routers import APIRootView
  6. from rest_framework.viewsets import ReadOnlyModelViewSet
  7. from core import filtersets
  8. from core.models import *
  9. from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet
  10. from utilities.utils import count_related
  11. from . import serializers
  12. class CoreRootView(APIRootView):
  13. """
  14. Core API root view
  15. """
  16. def get_view_name(self):
  17. return 'Core'
  18. class DataSourceViewSet(NetBoxModelViewSet):
  19. queryset = DataSource.objects.annotate(
  20. file_count=count_related(DataFile, 'source')
  21. )
  22. serializer_class = serializers.DataSourceSerializer
  23. filterset_class = filtersets.DataSourceFilterSet
  24. @action(detail=True, methods=['post'])
  25. def sync(self, request, pk):
  26. """
  27. Enqueue a job to synchronize the DataSource.
  28. """
  29. if not request.user.has_perm('core.sync_datasource'):
  30. raise PermissionDenied("Syncing data sources requires the core.sync_datasource permission.")
  31. datasource = get_object_or_404(DataSource, pk=pk)
  32. datasource.enqueue_sync_job(request)
  33. serializer = serializers.DataSourceSerializer(datasource, context={'request': request})
  34. return Response(serializer.data)
  35. class DataFileViewSet(NetBoxReadOnlyModelViewSet):
  36. queryset = DataFile.objects.defer('data').prefetch_related('source')
  37. serializer_class = serializers.DataFileSerializer
  38. filterset_class = filtersets.DataFileFilterSet
  39. class JobViewSet(ReadOnlyModelViewSet):
  40. """
  41. Retrieve a list of job results
  42. """
  43. queryset = Job.objects.prefetch_related('user')
  44. serializer_class = serializers.JobSerializer
  45. filterset_class = filtersets.JobFilterSet