62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Tasks API"""
 | 
						|
from importlib import import_module
 | 
						|
 | 
						|
from django.contrib import messages
 | 
						|
from django.http.response import Http404
 | 
						|
from django.utils.translation import gettext_lazy as _
 | 
						|
from drf_yasg.utils import swagger_auto_schema
 | 
						|
from rest_framework.decorators import action
 | 
						|
from rest_framework.fields import CharField, DateTimeField, IntegerField, ListField
 | 
						|
from rest_framework.permissions import IsAdminUser
 | 
						|
from rest_framework.request import Request
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.serializers import Serializer
 | 
						|
from rest_framework.viewsets import ViewSet
 | 
						|
 | 
						|
from passbook.lib.tasks import TaskInfo
 | 
						|
 | 
						|
 | 
						|
class TaskSerializer(Serializer):
 | 
						|
    """Serialize TaskInfo and TaskResult"""
 | 
						|
 | 
						|
    task_name = CharField()
 | 
						|
    task_description = CharField()
 | 
						|
    task_finish_timestamp = DateTimeField(source="finish_timestamp")
 | 
						|
 | 
						|
    status = IntegerField(source="result.status.value")
 | 
						|
    messages = ListField(source="result.messages")
 | 
						|
 | 
						|
    def create(self, request: Request) -> Response:
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    def update(self, request: Request) -> Response:
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
 | 
						|
class TaskViewSet(ViewSet):
 | 
						|
    """Read-only view set that returns all background tasks"""
 | 
						|
 | 
						|
    permission_classes = [IsAdminUser]
 | 
						|
 | 
						|
    @swagger_auto_schema(responses={200: TaskSerializer(many=True)})
 | 
						|
    def list(self, request: Request) -> Response:
 | 
						|
        """List current messages and pass into Serializer"""
 | 
						|
        return Response(TaskSerializer(TaskInfo.all().values(), many=True).data)
 | 
						|
 | 
						|
    @action(detail=True, methods=["post"])
 | 
						|
    # pylint: disable=invalid-name
 | 
						|
    def retry(self, request: Request, pk=None) -> Response:
 | 
						|
        """Retry task"""
 | 
						|
        task = TaskInfo.by_name(pk)
 | 
						|
        if not task:
 | 
						|
            raise Http404
 | 
						|
        task_module = import_module(task.task_call_module)
 | 
						|
        task_func = getattr(task_module, task.task_call_func)
 | 
						|
        task_func.delay(*task.task_call_args, **task.task_call_kwargs)
 | 
						|
        messages.success(self.request, _("Successfully re-scheduled Task!"))
 | 
						|
        return Response(
 | 
						|
            {
 | 
						|
                "successful": True,
 | 
						|
            }
 | 
						|
        )
 |