views.py 1.9 KB

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