api_prepare.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. from django.contrib import auth
  2. from rest_framework.views import APIView
  3. from rest_framework.response import Response
  4. from rest_framework import status
  5. from rest_framework.authtoken.models import Token
  6. from rest_framework.authentication import BasicAuthentication, TokenAuthentication
  7. from .serializers import UserRegisterSerializer
  8. from django.middleware.csrf import get_token
  9. from django.contrib.auth import login
  10. from api.utils import *
  11. from api.models import File, Mission, Plan, Algorithm
  12. import json
  13. class UploadFileAPI(APIView):
  14. def get(self, request):
  15. user = request.user
  16. history = File.objects.getHistory(user=user)
  17. if history == FAILED:
  18. return failed(message="获取文件上传历史失败")
  19. else:
  20. return success(data=history)
  21. def post(self, request):
  22. user = request.user
  23. # 获取上传的文件对象
  24. nodeFileName = request.data.get('nodeFileName')
  25. edgeFileName = request.data.get('edgeFileName')
  26. nodeFile = request.data.get('nodes')
  27. edgeFile = request.data.get('edges')
  28. # 检查文件用途并进行响应处理
  29. file_usage = request.data.get('usage')
  30. if file_usage == 'input':
  31. pass
  32. else:
  33. return failed(message=filename + "上传失败 暂时只支持上传图处理原料文件")
  34. # 检查文件类型并进行相应处理
  35. file_type = request.data.get('type')
  36. for filename in [nodeFileName, edgeFileName]:
  37. if file_type == 'csv':
  38. if filename.split('.')[-1] != 'csv':
  39. return failed(message=filename + "上传失败 文件类型和文件后缀名不匹配")
  40. else:
  41. return failed(message=filename + "上传失败 暂不支持CSV之外文件")
  42. successUploadedFiles = []
  43. pre_file = None
  44. for filename, fileData in [[edgeFileName, edgeFile], [nodeFileName, nodeFile]]:
  45. # 处理数据库中记录
  46. file = File()
  47. file.name = filename
  48. file.user = request.user
  49. file.type = file_type
  50. file.usage = file_usage
  51. # 一定先edge再node
  52. if pre_file == None:
  53. file.content = 'edge'
  54. else:
  55. file.content = 'node'
  56. file.save()
  57. # 尝试保存文件
  58. result = file.storage(fileData)
  59. if result != OK:
  60. file.delete()
  61. # 第二个文件错误,同样删除第一个文件
  62. if pre_file:
  63. pre_file.delete()
  64. if result == FILE_ALREADY_EXIST:
  65. return failed(message=filename + "上传失败 已存在同名文件", data="已存在同名文件", code=400)
  66. elif result == FILE_FAILED_CREATE_DIR:
  67. return failed(message=filename + "上传失败 文件目录创建失败", data="文件目录创建失败", code=400)
  68. else:
  69. return failed(message=filename + "上传失败 因未知原因文件上传失败", data="因未知原因文件上传失败", code=400)
  70. # 第二个文件也成功时,将两个文件互相关联
  71. if pre_file:
  72. file.associate = pre_file
  73. pre_file.associate = file
  74. file.saveWithInfo()
  75. pre_file.saveWithInfo()
  76. else:
  77. pre_file = file
  78. # 两个文件均上传成功后,检测文件内容是否符合规范
  79. if file.checkIllegal() and pre_file.checkIllegal():
  80. # 确保正确后创建mission,并将信息返回
  81. mission = Mission()
  82. mission.nodeFile = file
  83. mission.edgeFile = pre_file
  84. mission.user = user
  85. mission.save()
  86. successUploadedFiles.append({
  87. "id": mission.id,
  88. "name": mission.name,
  89. "content": "mission",
  90. })
  91. # 初步对文件内容进行分析,获取节点和边的基本数据
  92. for file in [file, pre_file]:
  93. successUploadedFiles.append({
  94. "id": file.id,
  95. "name": file.name,
  96. "content": file.content,
  97. "nodes": file.own_file_info.nodes,
  98. "sNodes": file.own_file_info.sNodes,
  99. "dNodes": file.own_file_info.dNodes,
  100. "iNodes": file.own_file_info.iNodes,
  101. "edges": file.own_file_info.edges,
  102. })
  103. return success(message="文件上传成功", data=successUploadedFiles, code=200)
  104. else:
  105. return failed(message="文件合法性检查失败")
  106. def delete(self, request):
  107. user = request.user
  108. file = File.objects.get(id=request.data.get('id'))
  109. result = file.deleteStorage()
  110. if result == OK:
  111. return success(message="删除文件成功")
  112. elif result == False:
  113. return failed(messgae="删除文件失败")
  114. class PlanAPI(APIView):
  115. def post(self, request):
  116. user = request.user
  117. plans = request.data.get('plans')
  118. overWritePlans = False
  119. try:
  120. mission = Mission.objects.get(id=request.data.get('mission'))
  121. except Mission.DoesNotExist:
  122. print("处理规划所属任务不存在")
  123. return failed(message="未找到规划任务所属任务")
  124. # 重复提交同一Mission的规划将覆盖
  125. if mission.own_plans.exists():
  126. overWritePlans = True
  127. for plan in mission.own_plans.all():
  128. plan.delete()
  129. # 全部放入矩阵
  130. planMat = [[{}, {}, {}] for i in range(10)]
  131. # 找出所有并行的源头
  132. origins = []
  133. for plan in plans:
  134. if plan['row'] == 0:
  135. origins.append(plan)
  136. planMat[plan['row']][plan['col']] = plan
  137. rootPlan = Plan(mission=mission, parent=None, algorithm=None, user=user)
  138. rootPlan.save()
  139. originPlans = []
  140. # 添加第一代规划
  141. for pJson in origins:
  142. # p.algorithm应该用来新建plan,先占位
  143. # childPlan = Plan(mission=mission, parent=rootPlan, algorithm=p['algorithm'], user=user)
  144. try:
  145. algorithm = Algorithm.objects.get(name=pJson['algorithm'])
  146. except Algorithm.DoesNotExist:
  147. print("Not Exist Algorithm")
  148. return failed(message=str(pJson['id']) + "规划选定算法不存在")
  149. pModel = Plan(mission=mission, parent=rootPlan, algorithm=algorithm, user=user)
  150. pModel.save()
  151. # p是json数据,headPlan是保存的PlanModel
  152. originPlans.append([pJson, pModel])
  153. # 添加后续规划
  154. while originPlans:
  155. pJson, pModel = originPlans.pop()
  156. for childPos in pJson['children']:
  157. childJson = planMat[childPos['row']][childPos['col']]
  158. try:
  159. algorithm = Algorithm.objects.get(name=pJson['algorithm'])
  160. except Algorithm.DoesNotExist:
  161. print("Not Exist Algorithm")
  162. return failed(message=str(pJson['id']) + "规划选定算法不存在")
  163. childModel = Plan(mission=mission, parent=pModel, algorithm=algorithm, user=user)
  164. childModel.save()
  165. originPlans.append([childJson, childModel])
  166. if overWritePlans:
  167. return success(message="规划已覆盖")
  168. else:
  169. return success(message="规划已提交")