taskview.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import datetime
  2. import json
  3. import os
  4. import zipfile
  5. from django.http import HttpResponse
  6. from rest_framework.response import Response
  7. from rest_framework.views import APIView
  8. from django.forms.models import model_to_dict
  9. from apps.task.annote.annotate import annotate
  10. from apps.task.models import RetrievalTask, DataType, Purpose
  11. import logging
  12. logger = logging.getLogger('django')
  13. class TaskView(APIView):
  14. # execute task
  15. @staticmethod
  16. def post(request, task_id, *args, **kwargs):
  17. task = RetrievalTask.objects.filter(id=task_id, delete=False)
  18. if not task:
  19. logger.error('任务已删除或不存在')
  20. return HttpResponse(status=500, content='任务已删除或不存在')
  21. task = task[0]
  22. project = task.project
  23. if project.delete:
  24. logger.error('项目已删除或不存在')
  25. return HttpResponse(status=500, content='项目已删除或不存在')
  26. if task.state == 2:
  27. logger.error('任务已执行完成,不能重复执行')
  28. return HttpResponse(status=500, content='任务已执行完成,不能重复执行')
  29. file_zip = zipfile.ZipFile(project.project_file, 'r', zipfile.ZIP_DEFLATED)
  30. py_files = [py_file for py_file in file_zip.namelist() if py_file.endswith('.py')]
  31. file_zip.extractall(path=os.path.dirname(project.project_file), members=py_files)
  32. source = project.project_file[:project.project_file.rfind('.')]
  33. with open("apps/task/annote/datatype_dictionary.json") as file:
  34. content = file.read()
  35. lattice = json.loads(content)
  36. task.state = 1
  37. task.save()
  38. data_type_list, purpose_list = annotate(source, lattice)
  39. task.state = 2
  40. task.save()
  41. for data_type in data_type_list:
  42. datatype = DataType.objects.create(**data_type, task=task)
  43. data_type['id'] = datatype.id
  44. for purpose in purpose_list:
  45. purpose_obj = Purpose.objects.create(**purpose, task=task)
  46. purpose['id'] = purpose_obj.id
  47. return Response({
  48. 'data_type_list': data_type_list,
  49. 'purpose_list': purpose_list
  50. })
  51. # get detail of task
  52. @staticmethod
  53. def get(request, task_id, *args, **kwargs):
  54. task = RetrievalTask.objects.filter(id=task_id, delete=False)
  55. if not task:
  56. logger.error('任务已删除或不存在')
  57. return HttpResponse(status=500, content='任务已删除或不存在')
  58. task = task[0]
  59. data_type_info = []
  60. purpose_info = []
  61. if task.state == 2:
  62. data_type_list = task.datatype_set.filter(delete=False)
  63. for data_type in data_type_list:
  64. data_type_info.append(model_to_dict(data_type))
  65. purpose_list = task.purpose_set.filter(delete=False)
  66. for purpose in purpose_list:
  67. purpose_info.append(model_to_dict(purpose))
  68. return Response({
  69. 'id': task.id,
  70. 'title': task.title,
  71. 'description': task.description,
  72. 'state': task.state,
  73. 'type': task.type,
  74. 'data_type_list': data_type_info,
  75. 'purpose_list': purpose_info
  76. })
  77. # edit task
  78. @staticmethod
  79. def put(request, task_id, *args, **kwargs):
  80. title = request.POST.get('title')
  81. task_type = request.POST.get('type')
  82. description = request.POST.get('description')
  83. task = RetrievalTask.objects.filter(id=task_id, delete=False)
  84. if not task:
  85. logger.error('任务已删除或不存在')
  86. return HttpResponse(status=500, content='任务已删除或不存在')
  87. task = task[0]
  88. if not title:
  89. logger.error("任务名称不能为空")
  90. return HttpResponse(status=500, content='任务名称不能为空')
  91. if not task_type:
  92. logger.error("任务类型不能为空")
  93. return HttpResponse(status=500, content='任务类型不能为空')
  94. update_time = datetime.datetime.now()
  95. task.title = title
  96. task.type = task_type
  97. task.description = description
  98. task.update_time = update_time
  99. task.save()
  100. return HttpResponse(status=200, content='编辑已保存')
  101. # delete task
  102. @staticmethod
  103. def delete(request, task_id, *args, **kwargs):
  104. task = RetrievalTask.objects.filter(id=task_id, delete=False)
  105. if not task:
  106. logger.error('任务已删除或不存在')
  107. return HttpResponse(status=500, content='任务已删除或不存在')
  108. task = task[0]
  109. task.delete = True
  110. task.save()
  111. return HttpResponse(status=200, content='任务已删除')