report.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import datetime
  2. import os
  3. from django.http import HttpResponse
  4. from rest_framework.views import APIView
  5. import util_doc
  6. from TestLaboratory.settings import SOFTWARE_ROOT
  7. from apps.software.models import Software
  8. import logging
  9. from apps.task.models import BeidouCase
  10. from apps.user.models import User
  11. from util_xlsx import write_to_xlsx
  12. logger = logging.getLogger('django')
  13. class Report(APIView):
  14. authentication_classes = []
  15. @staticmethod
  16. def convert_to_string(word_list):
  17. for i in range(len(word_list)):
  18. if word_list[i] is None:
  19. word_list[i] = ''
  20. elif not isinstance(word_list[i], str):
  21. word_list[i] = str(word_list[i])
  22. return word_list
  23. @staticmethod
  24. # @RoleControl
  25. def get(request, software_id, *args, **kwargs):
  26. software = Software.objects.filter(id=software_id, delete=False)
  27. if not software:
  28. logger.error("软件已删除或不存在")
  29. return HttpResponse(status=404, content='软件已删除或不存在')
  30. software = software[0]
  31. beidou_cases = BeidouCase.objects.order_by('-create_time')
  32. beidou_cases = beidou_cases.filter(software_id=software_id)
  33. version = request.GET.get('version')
  34. if version:
  35. beidou_cases = beidou_cases.filter(version=version)
  36. export_type = request.GET.get('export_type')
  37. file_name = software.name + '-全部测试用例.xls'
  38. if export_type:
  39. if export_type == '2':
  40. file_name = software.name + '-不合格测试用例.xls'
  41. beidou_cases = beidou_cases.filter(state=2)
  42. if not beidou_cases:
  43. logger.error("无符合要求的测试用例")
  44. return HttpResponse(status=404, content='无符合要求的测试用例')
  45. update_time = datetime.datetime.now()
  46. file_dir = SOFTWARE_ROOT + "/" + str(update_time)
  47. if not os.path.exists(file_dir):
  48. os.makedirs(file_dir)
  49. file_path = file_dir + "/" + file_name
  50. cases_info = [
  51. ['测试项目', '版本', '测试内容', '定位精度', '定时精度', '伪距测量精度', '载波测量精度', '测速精度',
  52. '捕获灵敏度', '接收灵敏度', '跟踪灵敏度', '功率范围', '自主完好性', '系统完好性', '首次捕获时间',
  53. '失锁重捕时间', '定位测速更新率', '跟踪通道数', '最大速度', '最大加速度', '执行结果', '测试人员', '备注']]
  54. for case in beidou_cases:
  55. power = ''
  56. if case.power_range_low and case.power_range_high:
  57. power = str(case.power_range_low) + '-' + str(case.power_range_high)
  58. state = '成功'
  59. if case.state == 2:
  60. state = '失败'
  61. executor_name = User.objects.filter(id=case.executor_id)[0].username
  62. cases_info.append(Report.convert_to_string(
  63. [software.name, case.version, case.title, case.positioning_accuracy, case.timing_accuracy,
  64. case.pseudo_range_measurement_accuracy, case.carrier_measurement_accuracy,
  65. case.speed_measurement_accuracy, case.sensitivity_capture, case.receiving_sensitivity,
  66. case.sensitivity_track, power, case.self_integrity, case.system_integrity, case.capture_time,
  67. case.recapture_time, case.update_rate, case.trace_channels, case.max_velocity, case.max_acceleration,
  68. state, executor_name, case.remark]
  69. ))
  70. sio = write_to_xlsx(file_path, cases_info)
  71. sio.seek(0)
  72. response = HttpResponse(sio.getvalue(), content_type='application/vnd.ms-excel')
  73. # response['Content-Disposition'] = 'attachment; filename*=UTF-8''{}'.format(escape_uri_path(file_name))
  74. response['Content-Disposition'] = 'attachment; filename="{0}"'.format(file_name).encode('utf-8',
  75. 'ISO-8859-1')
  76. response.write(sio.getvalue())
  77. # executor, action, method = get_log(request)
  78. # gen_log(action, "测试任务", task.title, method, executor)
  79. return response