from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response from infrasynth.security.permissions import IsAuthenticatedAndPermitted from .filters import ScheduledTaskFilter, TaskExecutionFilter from .models import ScheduledTask, TaskExecution from .serializers import ScheduledTaskSerializer, TaskExecutionSerializer from .services import TaskService class ScheduledTaskViewSet(viewsets.ModelViewSet): queryset = ScheduledTask.objects.all() serializer_class = ScheduledTaskSerializer permission_classes = [IsAuthenticatedAndPermitted] filterset_class = ScheduledTaskFilter def initial(self, request, *args, **kwargs): from infrasynth.features.services import FeatureService if not FeatureService().is_enabled("scheduler", user=request.user): from django.http import Http404 raise Http404() super().initial(request, *args, **kwargs) def get_queryset(self): return ScheduledTask.objects.all() @action(detail=True, methods=["post"]) def run(self, request, pk=None): task = self.get_object() svc = TaskService() svc.run_now(task.pk) return Response({"status": "triggered"}) @action(detail=True, methods=["post"]) def toggle(self, request, pk=None): task = self.get_object() svc = TaskService() svc.toggle(task.pk) task.refresh_from_db() return Response({"is_active": task.is_active}) class TaskExecutionViewSet(viewsets.ReadOnlyModelViewSet): queryset = TaskExecution.objects.all() serializer_class = TaskExecutionSerializer permission_classes = [IsAuthenticatedAndPermitted] filterset_class = TaskExecutionFilter def initial(self, request, *args, **kwargs): from infrasynth.features.services import FeatureService if not FeatureService().is_enabled("scheduler", user=request.user): from django.http import Http404 raise Http404() super().initial(request, *args, **kwargs) def get_queryset(self): return TaskExecution.objects.select_related("task").all() class SchedulerStatusViewSet(viewsets.GenericViewSet): permission_classes = [IsAuthenticatedAndPermitted] def initial(self, request, *args, **kwargs): from infrasynth.features.services import FeatureService if not FeatureService().is_enabled("scheduler", user=request.user): from django.http import Http404 raise Http404() super().initial(request, *args, **kwargs) @action(detail=False, methods=["get"]) def queue_status(self, request): svc = TaskService() data = svc.get_queue_status() return Response(data) @action(detail=False, methods=["get"]) def workers(self, request): svc = TaskService() data = svc.get_workers() return Response(data)