Coverage for backend/core/auxiliary/viewsets/TaskViewSet.py: 66%
43 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from django.views.decorators.csrf import csrf_exempt
2from drf_spectacular.types import OpenApiTypes
3from drf_spectacular.utils import extend_schema, OpenApiParameter
4from rest_framework import status
5from rest_framework.decorators import action, authentication_classes
6from rest_framework.response import Response
8from authentication.custom_drf_authentication import DaprApiTokenAuthentication
9from common.models.general import TaskRunningEvent
10from core.auxiliary.managers import TaskManager
11from core.pagination import ViewSetPagination
12from core.auxiliary.models.Task import Task
13from core.auxiliary.serializers import TaskSerializer
14from core.validation import api_view_ignore_access_control
15from core.viewset import ReadOnlyModelViewSet
18class TaskViewSet(ReadOnlyModelViewSet):
19 serializer_class = TaskSerializer
20 pagination_class = ViewSetPagination
22 # Filter to only show tasks for a specific flowsheet
23 def get_queryset(self):
24 queryset = Task.objects.all().select_related("metadata")
26 if self.action == 'list':
27 non_child_tasks = queryset.filter(parent__isnull=True)
28 return non_child_tasks
30 return queryset
32 @extend_schema(
33 parameters=[
34 OpenApiParameter(name="flowsheet", required=True, type=OpenApiTypes.INT),
35 ]
36 )
37 def list(self, request):
38 return super().list(request)
40 @extend_schema(responses=TaskSerializer(many=True))
41 @action(detail=True, methods=['get'], url_path='children')
42 def get_task_children(self, request, pk):
43 children = Task.objects.filter(parent_id=pk)
45 page = self.paginate_queryset(children)
46 if page is not None:
47 serializer = self.get_serializer(page, many=True)
48 return self.get_paginated_response(serializer.data)
50 return Response(status=status.HTTP_400_BAD_REQUEST)
52 @action(detail=False, methods=['post'], url_path='running', authentication_classes=[DaprApiTokenAuthentication])
53 @extend_schema(exclude=True)
54 @csrf_exempt
55 @api_view_ignore_access_control
56 def handle_task_running_event(self, request):
57 task_running_event = TaskRunningEvent.model_validate(request.data)
58 TaskManager.handle_task_running_event(task_running_event.data.task_id)
60 return Response(status=status.HTTP_200_OK)