import datetime import json import os import zipfile from django.http import HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from django.forms.models import model_to_dict from apps.task.annote.annotate import annotate from apps.task.models import RetrievalTask, DataType, Purpose import logging logger = logging.getLogger('django') class TaskView(APIView): # execute task @staticmethod def post(request, task_id, *args, **kwargs): task = RetrievalTask.objects.filter(id=task_id, delete=False) if not task: logger.error('任务已删除或不存在') return HttpResponse(status=500, content='任务已删除或不存在') task = task[0] project = task.project if project.delete: logger.error('项目已删除或不存在') return HttpResponse(status=500, content='项目已删除或不存在') if task.state == 2: logger.error('任务已执行完成,不能重复执行') return HttpResponse(status=500, content='任务已执行完成,不能重复执行') file_zip = zipfile.ZipFile(project.project_file, 'r', zipfile.ZIP_DEFLATED) py_files = [py_file for py_file in file_zip.namelist() if py_file.endswith('.py')] file_zip.extractall(path=os.path.dirname(project.project_file), members=py_files) source = project.project_file[:project.project_file.rfind('.')] with open("apps/task/annote/datatype_dictionary.json") as file: content = file.read() lattice = json.loads(content) task.state = 1 task.save() data_type_list, purpose_list = annotate(source, lattice) task.state = 2 task.save() for data_type in data_type_list: datatype = DataType.objects.create(**data_type, task=task) data_type['id'] = datatype.id for purpose in purpose_list: purpose_obj = Purpose.objects.create(**purpose, task=task) purpose['id'] = purpose_obj.id return Response({ 'data_type_list': data_type_list, 'purpose_list': purpose_list }) # get detail of task @staticmethod def get(request, task_id, *args, **kwargs): task = RetrievalTask.objects.filter(id=task_id, delete=False) if not task: logger.error('任务已删除或不存在') return HttpResponse(status=500, content='任务已删除或不存在') task = task[0] data_type_info = [] purpose_info = [] if task.state == 2: data_type_list = task.datatype_set.filter(delete=False) for data_type in data_type_list: data_type_info.append(model_to_dict(data_type)) purpose_list = task.purpose_set.filter(delete=False) for purpose in purpose_list: purpose_info.append(model_to_dict(purpose)) return Response({ 'id': task.id, 'title': task.title, 'description': task.description, 'state': task.state, 'type': task.type, 'data_type_list': data_type_info, 'purpose_list': purpose_info }) # edit task @staticmethod def put(request, task_id, *args, **kwargs): title = request.POST.get('title') task_type = request.POST.get('type') description = request.POST.get('description') task = RetrievalTask.objects.filter(id=task_id, delete=False) if not task: logger.error('任务已删除或不存在') return HttpResponse(status=500, content='任务已删除或不存在') task = task[0] if not title: logger.error("任务名称不能为空") return HttpResponse(status=500, content='任务名称不能为空') if not task_type: logger.error("任务类型不能为空") return HttpResponse(status=500, content='任务类型不能为空') update_time = datetime.datetime.now() task.title = title task.type = task_type task.description = description task.update_time = update_time task.save() return HttpResponse(status=200, content='编辑已保存') # delete task @staticmethod def delete(request, task_id, *args, **kwargs): task = RetrievalTask.objects.filter(id=task_id, delete=False) if not task: logger.error('任务已删除或不存在') return HttpResponse(status=500, content='任务已删除或不存在') task = task[0] task.delete = True task.save() return HttpResponse(status=200, content='任务已删除')