54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
|
|
"""Task API views"""
|
||
|
|
|
||
|
|
from celery.result import AsyncResult
|
||
|
|
from rest_framework import status
|
||
|
|
from rest_framework.response import Response
|
||
|
|
from task.serializers import TaskSerializer, TaskCreateSerializer
|
||
|
|
from common.views import ApiBaseView, AdminOnly
|
||
|
|
|
||
|
|
|
||
|
|
class TaskListView(ApiBaseView):
|
||
|
|
"""Task list endpoint"""
|
||
|
|
permission_classes = [AdminOnly]
|
||
|
|
|
||
|
|
def get(self, request):
|
||
|
|
"""Get list of tasks"""
|
||
|
|
# TODO: Implement task listing from Celery
|
||
|
|
return Response({'data': []})
|
||
|
|
|
||
|
|
|
||
|
|
class TaskCreateView(ApiBaseView):
|
||
|
|
"""Task creation endpoint"""
|
||
|
|
permission_classes = [AdminOnly]
|
||
|
|
|
||
|
|
def post(self, request):
|
||
|
|
"""Create and run a task"""
|
||
|
|
serializer = TaskCreateSerializer(data=request.data)
|
||
|
|
serializer.is_valid(raise_exception=True)
|
||
|
|
|
||
|
|
task_name = serializer.validated_data['task_name']
|
||
|
|
params = serializer.validated_data.get('params', {})
|
||
|
|
|
||
|
|
# Map task names to Celery tasks
|
||
|
|
# TODO: Implement task dispatch
|
||
|
|
|
||
|
|
return Response({
|
||
|
|
'message': 'Task created',
|
||
|
|
'task_name': task_name
|
||
|
|
}, status=status.HTTP_202_ACCEPTED)
|
||
|
|
|
||
|
|
|
||
|
|
class TaskDetailView(ApiBaseView):
|
||
|
|
"""Task detail endpoint"""
|
||
|
|
permission_classes = [AdminOnly]
|
||
|
|
|
||
|
|
def get(self, request, task_id):
|
||
|
|
"""Get task status"""
|
||
|
|
result = AsyncResult(task_id)
|
||
|
|
|
||
|
|
return Response({
|
||
|
|
'task_id': task_id,
|
||
|
|
'status': result.status,
|
||
|
|
'result': result.result if result.ready() else None
|
||
|
|
})
|