taskview.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import datetime
  2. from rest_framework.response import Response
  3. from rest_framework.views import APIView
  4. from django.http import HttpResponse
  5. from TestLaboratory.settings import PLAN_ROOT, SOFTWARE_ROOT, HTTP_HEAD, TASK_ROOT, CASE_TEMPLATE_ROOT, CASE_FILE_ROOT
  6. from apps.file.models import FileManager
  7. from apps.log.models import get_log, gen_log
  8. from apps.task.models import TestTask
  9. from apps.user.middleware.rolecontrol import RoleControl
  10. from apps.user.models import User
  11. from utils.util_add_id import get_id
  12. from utils.util_file.util_fileio import write_file
  13. class TaskView(APIView):
  14. # 登录权限验证
  15. authentication_classes = []
  16. # edit task
  17. @staticmethod
  18. @RoleControl
  19. def put(request, task_id, *args, **kwargs):
  20. title = request.POST.get('title')
  21. state = request.POST.get('state')
  22. description = request.POST.get('description')
  23. files = request.FILES.getlist('files')
  24. executors = request.POST.get('executors')
  25. edit_state_only = request.POST.get('edit_state_only')
  26. if executors:
  27. executors = executors.split('&&')
  28. task = TestTask.objects.filter(id=task_id, delete=False)
  29. if not task:
  30. return HttpResponse(status=404, content='测试任务已删除或不存在')
  31. task = task[0]
  32. if edit_state_only == '1':
  33. task.state = int(state)
  34. task.save()
  35. return HttpResponse(status=200, content='编辑已保存')
  36. if title:
  37. task.title = title
  38. if state:
  39. task.state = int(state)
  40. if description:
  41. task.description = description
  42. task.executor.clear()
  43. for executor_id in executors:
  44. executor = User.objects.filter(id=executor_id, delete=False)
  45. if not executor:
  46. return HttpResponse(status=404, content='执行者用户不存在')
  47. task.executor.add(executor[0])
  48. fids = ''
  49. for file in files:
  50. create_time = update_time = datetime.datetime.now()
  51. try:
  52. write_file(file, PLAN_ROOT + "/" + task_id + "/" + str(create_time))
  53. except:
  54. return HttpResponse(status=500, content="文件上传失败")
  55. id_file = get_id(FileManager, "TestLaboratory_V1_File_1")
  56. try:
  57. file_new = FileManager.objects.create(id=id_file, category="plan_statement",
  58. path=task_id + "/" + str(create_time) + "/" + file.name,
  59. create_time=create_time,
  60. update_time=update_time)
  61. except:
  62. return HttpResponse(status=500, content="文件路径写入数据库失败")
  63. fids += id_file + '&&'
  64. fids = fids[:-2]
  65. task_sids = task.statement_file.split('&&')
  66. if task_sids:
  67. for statement_id in task_sids:
  68. statement = FileManager.objects.get(id=statement_id)
  69. statement.delete = True
  70. statement.save()
  71. task.statement_file = fids
  72. task.save()
  73. executor, action, method = get_log(request)
  74. gen_log(action, "测试任务", task.title, method, executor)
  75. return HttpResponse("编辑已保存")
  76. # delete task
  77. @staticmethod
  78. @RoleControl
  79. def delete(request, task_id, *args, **kwargs):
  80. task = TestTask.objects.filter(id=task_id, delete=False)
  81. if not task:
  82. return HttpResponse(status=404, content='测试任务已删除或不存在')
  83. task = task[0]
  84. task_sids = task.statement_file.split('&&')
  85. if task_sids[0]:
  86. for statement_id in task_sids:
  87. statement = FileManager.objects.get(id=statement_id)
  88. statement.delete = True
  89. statement.save()
  90. task.delete = True
  91. task.save()
  92. executor, action, method = get_log(request)
  93. gen_log(action, "测试任务", task.title, method, executor)
  94. return HttpResponse("删除完成")
  95. # view task
  96. @staticmethod
  97. @RoleControl
  98. def get(request, task_id, *args, **kwargs):
  99. task = TestTask.objects.filter(id=task_id, delete=False)
  100. if not task:
  101. return HttpResponse(status=404, content='测试计划已删除或不存在')
  102. task = task[0]
  103. version = task.plan.software.version_set.filter(number=task.plan.version, delete=False)
  104. if not version:
  105. return HttpResponse(status=404, content='测试任务对应软件版本不存在或已删除')
  106. version = version[0]
  107. version_fid = version.version_file
  108. version_file = FileManager.objects.filter(id=version_fid)
  109. if not version_file:
  110. return HttpResponse(status=404, content='无法定位测试任务对应的软件实体')
  111. version_file = version_file[0]
  112. plan_sids = task.plan.statement_file.split('&&')
  113. plan_file_names = []
  114. plan_file_urls = []
  115. if plan_sids[0]:
  116. for plan_statement_id in plan_sids:
  117. plan_statement = FileManager.objects.get(id=plan_statement_id)
  118. plan_file_urls.append(PLAN_ROOT + plan_statement.path)
  119. plan_file_names.append(plan_statement.path.split('/')[-1])
  120. task_sids = task.statement_file.split('&&')
  121. task_file_names = []
  122. task_file_urls = []
  123. if task_sids[0]:
  124. for task_statement_id in task_sids:
  125. task_statement = FileManager.objects.get(id=task_statement_id)
  126. task_file_urls.append(TASK_ROOT + task_statement.path)
  127. task_file_names.append(task_statement.path.split('/')[-1])
  128. case_file_info = {}
  129. if task.case_file:
  130. case_file = FileManager.objects.get(id=task.case_file)
  131. case_file_info = {'file_name': case_file.path.split('/')[-1], 'file_url': HTTP_HEAD + CASE_FILE_ROOT + case_file.path}
  132. executor, action, method = get_log(request)
  133. gen_log(action, "测试任务", task.title, method, executor)
  134. return Response({
  135. 'software_id': task.plan.software.id,
  136. 'software_name': task.plan.software.name,
  137. 'version': task.plan.version,
  138. 'version_file': {'file_name': version_file.path.split('/')[-1], 'file_url': HTTP_HEAD + SOFTWARE_ROOT
  139. + version_file.path},
  140. 'plan': {
  141. 'id': task.plan.id,
  142. 'title': task.plan.title,
  143. 'description': task.plan.description,
  144. 'state': task.plan.state,
  145. 'statements': [{'file_id': file_sid, 'file_name': file_name, 'file_url': HTTP_HEAD + file_url} for
  146. file_sid, file_name, file_url in zip(plan_sids, plan_file_names, plan_file_urls)],
  147. 'creator': {'executor_id': task.plan.creator.id, 'executor_name': task.plan.creator.username},
  148. },
  149. 'task': {
  150. 'id': task.id,
  151. 'title': task.title,
  152. 'description': task.description,
  153. 'state': task.state,
  154. 'statements': [{'file_id': file_sid, 'file_name': file_name, 'file_url': HTTP_HEAD + file_url} for
  155. file_sid, file_name, file_url in zip(task_sids, task_file_names, task_file_urls)],
  156. 'case_template': HTTP_HEAD + CASE_TEMPLATE_ROOT,
  157. 'case_file': case_file_info,
  158. 'executors': [{'id': executor.id, 'name': executor.username} for executor in
  159. task.executor.all()],
  160. 'case_all': task.case_all,
  161. 'case_not_execute': task.case_not_execute,
  162. 'case_success': task.case_success,
  163. 'case_fail': task.case_fail,
  164. },
  165. 'create_time': task.create_time,
  166. 'update_time': task.update_time,
  167. })