planlistview.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import datetime
  2. import json
  3. import os
  4. from rest_framework.response import Response
  5. from rest_framework.views import APIView
  6. from django.http import HttpResponse
  7. from apps.file.models import FileManager
  8. from apps.log.models import get_log, gen_log
  9. from apps.plan.models import TestPlan
  10. from apps.software.models import Software
  11. from apps.user.middleware.rolecontrol import RoleControl
  12. from apps.user.models import User
  13. from utils.util_add_id import gen_next_id, get_id
  14. from TestLaboratory.settings import PLAN_ROOT
  15. import logging
  16. logger = logging.getLogger('django')
  17. class PlanListView(APIView):
  18. # 登录权限验证
  19. authentication_classes = []
  20. # create plan
  21. @staticmethod
  22. @RoleControl
  23. def post(request, *args, **kwargs):
  24. software_id = request.POST.get('software_id')
  25. version_number = request.POST.get('version_number')
  26. title = request.POST.get('title')
  27. description = request.POST.get('description')
  28. files = request.FILES.getlist('files')
  29. creator_id = request.POST.get('creator')
  30. type = request.POST.get('type')
  31. company_id = request.POST.get('company_id')
  32. # step1:判断所属软件及版本是否存在
  33. software = Software.objects.filter(id=software_id, delete=False)
  34. if not software:
  35. logger.error("软件已删除或不存在")
  36. return HttpResponse(status=404, content='软件已删除或不存在')
  37. software = software[0]
  38. # 判断版本是否存在
  39. software_version = software.version_set.filter(number=version_number, delete=False)
  40. if not software_version:
  41. logger.error("软件版本不存在或已删除,请重新选择")
  42. return HttpResponse(status=404, content='软件版本不存在或已删除,请重新选择')
  43. software_version = software_version[0]
  44. # 判断用户是否存在
  45. creator = User.objects.filter(id=creator_id, delete=False)
  46. if not creator:
  47. logger.error("用户不存在,创建失败")
  48. return HttpResponse(status=404, content='用户不存在,创建失败')
  49. creator = creator[0]
  50. # step5:设置创建时间和修改时间
  51. create_time = update_time = datetime.datetime.now()
  52. # step6:创建测试计划的数据库记录
  53. id_plan = get_id(TestPlan, "TestLaboratory_V1_Plan_1")
  54. # step7:创建文件的数据库字段
  55. fids = ''
  56. file_paths = []
  57. file_ids = []
  58. for file in files:
  59. try:
  60. file_dir = PLAN_ROOT + "/" + id_plan + "/" + str(create_time)
  61. if not os.path.exists(file_dir):
  62. os.makedirs(file_dir)
  63. file_path = file_dir + "/" + file.name
  64. with open(file_path, 'wb') as f:
  65. f.write(file.read())
  66. f.close()
  67. except:
  68. logger.error("文件上传失败")
  69. return HttpResponse(status=500, content="文件上传失败")
  70. if not FileManager.objects.last():
  71. id_file = "TestLaboratory_V1_File_1"
  72. else:
  73. id_file = gen_next_id(FileManager.objects.order_by('create_time').last().id)
  74. try:
  75. file_new = FileManager.objects.create(id=id_file, category="plan_statement",
  76. path=id_plan + "/" + str(create_time) + "/" + file.name,
  77. create_time=create_time,
  78. update_time=update_time)
  79. except:
  80. logger.error("文件路径写入数据库失败")
  81. return HttpResponse(status=500, content="文件路径写入数据库失败")
  82. file_ids.append(id_file)
  83. file_paths.append(PLAN_ROOT + file_new.path)
  84. fids += id_file + "&&"
  85. fids = fids[:-2]
  86. try:
  87. plan = TestPlan.objects.create(id=id_plan, title=title, description=description, state='0',
  88. creator=creator, software=software, version=software_version.number,
  89. statement_file=fids, type=type, company_id=company_id,
  90. create_time=create_time, update_time=update_time)
  91. except:
  92. logger.error("测试计划写入数据库失败")
  93. return HttpResponse(status=500, content='测试计划写入数据库失败')
  94. executor, action, method = get_log(request)
  95. gen_log(action, "测试计划", plan.title, method, executor)
  96. return Response({
  97. 'software_id': software.id,
  98. 'software_name': software.name,
  99. 'version': version_number,
  100. 'creator_id': creator.id,
  101. 'creator': creator.username,
  102. 'type': type,
  103. 'id': plan.id,
  104. 'title': title,
  105. 'description': description,
  106. 'state': '执行中',
  107. 'files': [{'file_id': file_id, 'file_name': file.name, 'file_url': file_path} for (file_id, file, file_path)
  108. in zip(file_ids, files, file_paths)]
  109. })
  110. # view plan_list
  111. @staticmethod
  112. @RoleControl
  113. def get(request, *args, **kwargs):
  114. title = request.GET.get('title')
  115. software_id = request.GET.get('software_id')
  116. state = request.GET.get('state')
  117. creator_id = request.GET.get('creator_id')
  118. company_id = request.GET.get('company_id')
  119. sort = request.GET.get('sort')
  120. plan_all = TestPlan.objects.order_by('-create_time')
  121. if title:
  122. plan_all = plan_all.filter(title__contains=title)
  123. if software_id:
  124. plan_all = plan_all.filter(software__id__contains=software_id)
  125. if state:
  126. plan_all = plan_all.filter(state=state)
  127. if creator_id:
  128. plan_all = plan_all.filter(creator__id__contains=creator_id)
  129. if company_id:
  130. plan_all = plan_all.filter(company__id__contains=company_id)
  131. """
  132. sort=update_time, -update_time, create_time, -create_time, title, -title, state
  133. """
  134. if sort:
  135. plan_all = plan_all.order_by(sort)
  136. plan_all = plan_all.filter(delete=False)
  137. if not plan_all:
  138. return Response([])
  139. info = []
  140. for plan in plan_all.all():
  141. info.append({
  142. 'software_id': plan.software.id,
  143. 'software_name': plan.software.name,
  144. 'version': plan.version,
  145. 'type': plan.type,
  146. 'creator_id': plan.creator.id,
  147. 'creator': plan.creator.username,
  148. 'id': plan.id,
  149. 'title': plan.title,
  150. 'description': plan.description,
  151. 'state': plan.state,
  152. 'create_time': plan.create_time,
  153. 'update_time': plan.update_time,
  154. })
  155. return Response(info)