fileview.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import datetime
  2. import os
  3. from django.http import HttpResponse
  4. from rest_framework.views import APIView
  5. from TestLaboratory.settings import PLAN_ROOT, TASK_ROOT
  6. from apps.file.models import FileManager
  7. from apps.log.models import get_log, gen_log
  8. from apps.plan.models import TestPlan
  9. from apps.task.models import TestTask
  10. from apps.user.middleware.rolecontrol import RoleControl
  11. from utils.util_add_id import gen_next_id
  12. class FileView(APIView):
  13. # create file
  14. @staticmethod
  15. @RoleControl
  16. def post(request, *args, **kwargs):
  17. file_type = request.POST.get('type')
  18. plan_id = request.POST.get('plan_id')
  19. task_id = request.POST.get('task_id')
  20. files = request.FILES.getlist('files')
  21. model_object = None
  22. path_head = None
  23. if file_type == 'plan_statement':
  24. model_object = TestPlan.objects.filter(id=plan_id, delete=False)
  25. if not model_object:
  26. return HttpResponse(status=404, content='测试计划已删除或不存在')
  27. model_object = model_object[0]
  28. path_head = PLAN_ROOT
  29. elif file_type == 'task_statement':
  30. model_object = TestTask.objects.filter(id=task_id, delete=False)
  31. if not model_object:
  32. return HttpResponse(status=404, content='测试任务已删除或不存在')
  33. model_object = model_object[0]
  34. path_head = TASK_ROOT
  35. # step7:创建文件的数据库字段
  36. fids = ''
  37. file_paths = []
  38. for file in files:
  39. try:
  40. create_time = update_time = datetime.datetime.now()
  41. file_dir = path_head + "/" + model_object.id + "/" + str(create_time)
  42. if not os.path.exists(file_dir):
  43. os.makedirs(file_dir)
  44. file_path = file_dir + "/" + file.name
  45. with open(file_path, 'wb') as f:
  46. f.write(file.read())
  47. f.close()
  48. except:
  49. return HttpResponse(status=500, content="文件上传失败")
  50. if not FileManager.objects.last():
  51. id_file = "TestLaboratory_V1_File_1"
  52. else:
  53. id_file = gen_next_id(FileManager.objects.order_by('create_time').last().id)
  54. try:
  55. file_new = FileManager.objects.create(id=id_file, category=file_type,
  56. path=model_object.id+ "/" + str(create_time) + "/" + file.name,
  57. create_time=create_time,
  58. update_time=update_time)
  59. except:
  60. return HttpResponse(status=500, content="文件路径写入数据库失败")
  61. file_paths.append(PLAN_ROOT + file_new.path)
  62. fids += id_file + "&&"
  63. fids = fids[:-2]
  64. model_object.statement_file += ("&&" + fids)
  65. model_object.save()
  66. executor, action, method = get_log(request)
  67. gen_log(action, "说明文档", model_object.title, method, executor)
  68. return HttpResponse(status=200, content='新建文件成功')
  69. # create file
  70. @staticmethod
  71. @RoleControl
  72. def delete(request, *args, **kwargs):
  73. file_id = request.GET.get('file_id')
  74. file_type = request.GET.get('type')
  75. plan_id = request.GET.get('plan_id')
  76. task_id = request.GET.get('task_id')
  77. model_object = None
  78. if file_type == 'plan_statement':
  79. model_object = TestPlan.objects.filter(id=plan_id, delete=False)
  80. if not model_object:
  81. return HttpResponse(status=404, content='测试计划已删除或不存在')
  82. model_object = model_object[0]
  83. elif file_type == 'task_statement':
  84. model_object = TestTask.objects.filter(id=task_id, delete=False)
  85. if not model_object:
  86. return HttpResponse(status=404, content='测试任务已删除或不存在')
  87. model_object = model_object[0]
  88. file = FileManager.objects.filter(id=file_id, delete=False)
  89. if not file:
  90. return HttpResponse(status=404, content='文件已删除不存在')
  91. file = file[0]
  92. file_list = model_object.statement_file.split('&&')
  93. if file.id not in file_list:
  94. return HttpResponse(status=404, content='该文件不存在于测试计划或测试任务中,数据库错误')
  95. file_list.remove(file.id)
  96. file_str = ''
  97. for file_name in file_list:
  98. file_str += file_name + "&&"
  99. file_str = file_str[:-2]
  100. model_object.statement_file = file_str
  101. model_object.save()
  102. executor, action, method = get_log(request)
  103. gen_log(action, "说明文档", file.path.split('/')[-1], method, executor)
  104. return HttpResponse(status=200, content='删除成功')