versionview.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. import datetime
  2. from django.db.models import Q
  3. from rest_framework.response import Response
  4. from rest_framework.views import APIView
  5. from django.http import HttpResponse
  6. from TestLaboratory.settings import SOFTWARE_ROOT, CASE_FILE_EXPORT
  7. from apps.file.models import FileManager
  8. from apps.log.models import get_log, gen_log
  9. from apps.software.models import Software, Version
  10. from apps.task.models import TestCase, BeidouCase
  11. from apps.user.middleware.rolecontrol import RoleControl
  12. from apps.user.models import User
  13. from util_xlsx import write_to_xlsx
  14. from utils.util_add_id import gen_next_id
  15. import os
  16. from utils.util_file.util_fileio import write_file
  17. import logging
  18. logger = logging.getLogger('django')
  19. class VersionView(APIView):
  20. authentication_classes = []
  21. @staticmethod
  22. def convert_to_string(word_list):
  23. for i in range(len(word_list)):
  24. if word_list[i] is None:
  25. word_list[i] = ''
  26. elif not isinstance(word_list[i], str):
  27. word_list[i] = str(word_list[i])
  28. return word_list
  29. # create version
  30. @staticmethod
  31. @RoleControl
  32. def post(request, software_id, *args, **kwargs):
  33. version_num = request.POST.get('version')
  34. file = request.FILES.get('file')
  35. # step1:判断版本所属软件是否存在
  36. software = Software.objects.filter(id=software_id, delete=False)
  37. if not software:
  38. logger.error("软件已删除或不存在")
  39. return HttpResponse(status=404, content='软件已删除或不存在')
  40. software = software[0]
  41. # step2:判断版本是否存在
  42. software_version = software.version_set.filter(number=version_num, delete=False)
  43. if software_version:
  44. logger.error("软件版本已存在,请修改版本号后重新上传")
  45. return HttpResponse(status=404, content='软件版本已存在,请修改版本号后重新上传')
  46. # step3:判断文件是否上传
  47. if not file:
  48. logger.error("软件上传失败")
  49. return HttpResponse(status=404, content='软件上传失败')
  50. # step4:创建版本id
  51. id_version = None
  52. if not Version.objects.order_by('create_time').last():
  53. id_version = "TestLaboratory_V1_Version_1"
  54. else:
  55. id_version = gen_next_id(Version.objects.order_by('create_time').last().id)
  56. # step5:设置创建时间和修改时间
  57. create_time = update_time = datetime.datetime.now()
  58. # step6:上传文件:
  59. file_dir = SOFTWARE_ROOT + software.id + "/" + id_version + "/" + str(create_time)
  60. if not os.path.exists(file_dir):
  61. os.makedirs(file_dir)
  62. file_path = file_dir + "/" + file.name
  63. with open(file_path, 'wb') as f:
  64. f.write(file.read())
  65. f.close()
  66. # step7:创建文件对象
  67. id_file = None
  68. if not FileManager.objects.last():
  69. id_file = "TestLaboratory_V1_File_1"
  70. else:
  71. id_file = gen_next_id(FileManager.objects.order_by('create_time').last().id)
  72. try:
  73. # step5:创建版本
  74. version = Version.objects.create(id=id_version, number=version_num, software=software,
  75. version_file=id_file,
  76. create_time=create_time,
  77. update_time=update_time)
  78. except:
  79. logger.error("软件版本创建失败")
  80. return HttpResponse(content='软件版本创建失败', status=500)
  81. try:
  82. file_new = FileManager.objects.create(id=id_file, category="software",
  83. path=software.id + "/" + version.id + "/" +
  84. str(create_time) + "/" + file.name,
  85. create_time=create_time, update_time=update_time)
  86. except:
  87. logger.error("文件数据创建失败")
  88. return HttpResponse(content='文件数据创建失败', status=500)
  89. executor, action, method = get_log(request)
  90. gen_log(action, "目标版本", software.name+"-"+version.number, method, executor)
  91. return Response({
  92. 'software_name': software.name,
  93. 'software_id': software.id,
  94. 'id': version.id,
  95. 'number': version.number,
  96. 'file_id': file_new.id,
  97. 'file_name': file_new.path.split('/')[-1],
  98. 'create_time': version.create_time,
  99. 'update_time': version.update_time,
  100. })
  101. # delete version
  102. @staticmethod
  103. @RoleControl
  104. def delete(request, software_id, *args, **kwargs):
  105. version_number = request.GET.get('version_number')
  106. software = Software.objects.filter(id=software_id, delete=False)
  107. if not software:
  108. logger.error("软件已删除或不存在")
  109. return HttpResponse(content='软件已删除或不存在', status=500)
  110. software = software[0]
  111. versions = len(list(software.version_set.filter(delete=False)))
  112. if versions == 0:
  113. logger.error("被测软件无版本信息,请检查错误")
  114. return HttpResponse(content='被测软件无版本信息,请检查错误', status=500)
  115. elif versions == 1:
  116. version = software.version_set.filter(number=version_number, delete=False)[0]
  117. version_fid = version.version_file
  118. version_file = FileManager.objects.filter(id=version_fid)[0]
  119. software.delete = True
  120. version.delete = True
  121. version_file.delete = True
  122. # 删除测试计划
  123. plan_set = software.testplan_set.filter(delete=False)
  124. if plan_set:
  125. for plan in plan_set:
  126. task_set = plan.testtask_set.filter(delete=False)
  127. if task_set:
  128. for task in task_set:
  129. task.delete = True
  130. task.save()
  131. plan.delete = True
  132. plan.save()
  133. software.save()
  134. version.save()
  135. version_file.save()
  136. return HttpResponse(status=200, content='软件及版本信息删除完成')
  137. else:
  138. version = software.version_set.filter(number=version_number, delete=False)[0]
  139. version_fid = version.version_file
  140. version_file = FileManager.objects.filter(id=version_fid)[0]
  141. version.delete = True
  142. version_file.delete = True
  143. # 删除测试计划
  144. plan_set = software.testplan_set.filter(delete=False)
  145. if plan_set:
  146. for plan in plan_set:
  147. task_set = plan.testtask_set.filter(delete=False)
  148. if task_set:
  149. for task in task_set:
  150. task.delete = True
  151. task.save()
  152. plan.delete = True
  153. plan.save()
  154. version.save()
  155. version_file.save()
  156. executor, action, method = get_log(request)
  157. gen_log(action, "目标版本", software.name + "-" + version.number, method, executor)
  158. return HttpResponse(status=200, content='删除完成')
  159. @staticmethod
  160. # @RoleControl
  161. def get(request, software_id, *args, **kwargs):
  162. export_type = request.GET.get('type')
  163. version_number = request.GET.get('version_number')
  164. software = Software.objects.filter(id=software_id, delete=False)
  165. if not software:
  166. logger.error("软件已删除或不存在")
  167. return HttpResponse(content='软件已删除或不存在', status=500)
  168. software = software[0]
  169. version = software.version_set.filter(number=version_number, delete=False)
  170. if not version:
  171. logger.error("软件版本已删除或不存在")
  172. return HttpResponse(status=404, content='软件版本已删除或不存在')
  173. version = version[0]
  174. cases = None
  175. file_name = None
  176. if export_type == '0':
  177. cases = BeidouCase.objects.filter(software=software, version=version_number, delete=False)
  178. file_name = '全部测试用例.xls'
  179. elif export_type == '1':
  180. cases = BeidouCase.objects.filter(~Q(state=0), software=software, version=version_number, delete=False)
  181. file_name = '已执行测试用例.xls'
  182. else:
  183. cases = BeidouCase.objects.filter(software=software, version=version_number, state=2, delete=False)
  184. file_name = '不合格测试用例.xls'
  185. if not cases:
  186. logger.error("无符合要求的测试用例")
  187. return HttpResponse(status=404, content='无符合要求的测试用例')
  188. update_time = datetime.datetime.now()
  189. file_dir = CASE_FILE_EXPORT + software_id + "/" + str(update_time)
  190. if not os.path.exists(file_dir):
  191. os.makedirs(file_dir)
  192. file_path = file_dir + "/" + file_name
  193. cases_info = [
  194. ['测试项目', '版本', '测试内容', '定位精度', '定时精度', '伪距测量精度', '载波测量精度', '测速精度',
  195. '捕获灵敏度', '接收灵敏度', '跟踪灵敏度', '功率范围', '自主完好性', '系统完好性', '首次捕获时间',
  196. '失锁重捕时间', '定位测速更新率', '跟踪通道数', '最大速度', '最大加速度', '执行结果', '测试人员', '备注']]
  197. for case in cases:
  198. power = ''
  199. if case.power_range_low and case.power_range_high:
  200. power = str(case.power_range_low) + '-' + str(case.power_range_high)
  201. state = '成功'
  202. if case.state == 2:
  203. state = '失败'
  204. executor_name = User.objects.filter(id=case.executor_id)[0].username
  205. cases_info.append(VersionView.convert_to_string(
  206. [software.name, case.version, case.title, case.positioning_accuracy, case.timing_accuracy,
  207. case.pseudo_range_measurement_accuracy, case.carrier_measurement_accuracy,
  208. case.speed_measurement_accuracy, case.sensitivity_capture, case.receiving_sensitivity,
  209. case.sensitivity_track, power, case.self_integrity, case.system_integrity, case.capture_time,
  210. case.recapture_time, case.update_rate, case.trace_channels, case.max_velocity, case.max_acceleration,
  211. state, executor_name, case.remark]
  212. ))
  213. sio = write_to_xlsx(file_path, cases_info)
  214. sio.seek(0)
  215. response = HttpResponse(sio.getvalue(), content_type='application/vnd.ms-excel')
  216. response['Content-Disposition'] = 'attachment; filename="{0}"'.format(file_name).encode('utf-8',
  217. 'ISO-8859-1')
  218. # response = HttpResponse(sio.getvalue(), content_type='multipart/form-data')
  219. # response['Content-Disposition'] = 'attachment; filename="{0}"'.format(file_name).encode('utf-8')
  220. # response.write(sio.getvalue())
  221. # executor, action, method = get_log(request)
  222. # gen_log(action, "目标版本", software.name + "-" + version.number, method, executor)
  223. return response
  224. class VersionEdit(APIView):
  225. authentication_classes = []
  226. # edit version
  227. # 版本号不能修改,本质上只能修改上传的文件
  228. @staticmethod
  229. @RoleControl
  230. def post(request, software_id, *args, **kwargs):
  231. file = request.FILES.get('file')
  232. version_number = request.POST.get('version_number')
  233. # 判断软件是否存在
  234. software = Software.objects.filter(id=software_id, delete=False)
  235. if not software:
  236. return HttpResponse(status=404, content='软件已删除或不存在')
  237. software = software[0]
  238. # 判断版本是否存在
  239. software_version = software.version_set.filter(number=version_number,
  240. delete=False)
  241. if not software_version:
  242. return HttpResponse(status=404,
  243. content='软件版本不存在或已删除,请重新选择需要编辑的软件版本')
  244. software_version = software_version[0]
  245. # 删除原版本文件
  246. version_fid = software_version.version_file
  247. version_file = FileManager.objects.filter(id=version_fid)
  248. if not version_file:
  249. logger.error("软件不存在,无法编辑")
  250. return HttpResponse(status=500, content='软件不存在,无法编辑')
  251. version_file = version_file[0]
  252. version_file.delete = True
  253. version_file.save()
  254. # step5:设置创建时间和修改时间
  255. create_time = update_time = datetime.datetime.now()
  256. # step6:上传文件:
  257. write_file(file,
  258. SOFTWARE_ROOT + software.id + "/" + software_version.id + "/" + str(
  259. create_time))
  260. # step7:创建文件对象
  261. id_file = None
  262. if not FileManager.objects.last():
  263. id_file = "TestLaboratory_V1_File_1"
  264. else:
  265. id_file = gen_next_id(
  266. FileManager.objects.order_by('create_time').last().id)
  267. software_version.version_file = id_file
  268. software_version.save()
  269. try:
  270. file_new = FileManager.objects.create(id=id_file,
  271. category="software",
  272. path=software.id + "/" + software_version.id + "/" +
  273. str(create_time) + "/" + file.name,
  274. create_time=create_time,
  275. update_time=update_time)
  276. except:
  277. logger.error("软件版本编辑失败,请重试")
  278. return HttpResponse(content='软件版本编辑失败,请重试', status=500)
  279. executor, action, method = get_log(request)
  280. gen_log(action, "目标版本", software.name + "-" + software_version.number,
  281. method, executor)
  282. return HttpResponse(status=200, content='修改已保存')