|
@@ -13,7 +13,10 @@ from api.utils import *
|
|
|
from api.models import File, Mission, Plan, Algorithm
|
|
|
|
|
|
import json
|
|
|
-
|
|
|
+import logging
|
|
|
+
|
|
|
+logger = logging.getLogger('prepare')
|
|
|
+
|
|
|
class UploadFileAPI(APIView):
|
|
|
def get(self, request):
|
|
|
user = request.user
|
|
@@ -125,6 +128,88 @@ class UploadFileAPI(APIView):
|
|
|
return failed(messgae="删除文件失败")
|
|
|
|
|
|
|
|
|
+class InputFileAPI(APIView):
|
|
|
+ def post(self, request):
|
|
|
+ user = request.user
|
|
|
+ nodes = request.data.get('nodes')
|
|
|
+ edges = request.data.get('edges')
|
|
|
+ logger.info(nodes)
|
|
|
+ logger.info(edges)
|
|
|
+ # 保存节点文件
|
|
|
+ # 当前设置输入的节点信息仅包含一个名称
|
|
|
+ nodesFile = File.objects.create(type='csv', usage='input', user=user, content='node')
|
|
|
+ try:
|
|
|
+ nodesCsvList = []
|
|
|
+ for node in nodes:
|
|
|
+ nodeList = [int(node['id']), str(node['type'])]
|
|
|
+ for key in [k for k in node if k not in ['id', 'type']]:
|
|
|
+ nodeList.append(str(key) + ':' +str(node[key]))
|
|
|
+ nodesCsvList.append(nodeList)
|
|
|
+ logger.info(nodesCsvList)
|
|
|
+ nodesFile.generate(nodesCsvList)
|
|
|
+ except Exception:
|
|
|
+ # 回退操作
|
|
|
+ logger.error(f"从输入信息创建节点文件失败 Error:{Exception}")
|
|
|
+ nodesFile.delete()
|
|
|
+ # 保存边文件
|
|
|
+ edgesFile = File.objects.create(type='csv', usage='input', user=user, content='edge')
|
|
|
+ try:
|
|
|
+ edgesCsvList = []
|
|
|
+ for edge in edges:
|
|
|
+ # 边中应至少有source和target两个参数
|
|
|
+ edgeList = [int(edge['source']), int(edge['target'])]
|
|
|
+ for key in [k for k in edge if k not in ['source', 'target']]:
|
|
|
+ edgeList.append(str(key) + ':' + str(edge[key]))
|
|
|
+ edgesCsvList.append(edgeList)
|
|
|
+ logger.info(edgesCsvList)
|
|
|
+ edgesFile.generate(edgesCsvList)
|
|
|
+ except Exception:
|
|
|
+ # 回退操作
|
|
|
+ logger.error(f"从输入信息创建边文件失败 Error:{Exception}")
|
|
|
+ nodesFile.delete()
|
|
|
+ edgesFile.delete()
|
|
|
+
|
|
|
+ # 节点和边均保存成功,可以互相关联并创建mission
|
|
|
+ nodesFile.associate = edgesFile
|
|
|
+ edgesFile.associate = nodesFile
|
|
|
+ # 计算节点和边的信息,生成fileInfo
|
|
|
+ nodesFile.saveWithInfo()
|
|
|
+ edgesFile.saveWithInfo()
|
|
|
+ # 构造mission并返回完整信息
|
|
|
+ successUploadedFiles = []
|
|
|
+ if nodesFile.checkIllegal() and edgesFile.checkIllegal():
|
|
|
+ # 确保正确后创建mission,并将信息返回
|
|
|
+ mission = Mission()
|
|
|
+ mission.nodeFile = nodesFile
|
|
|
+ mission.edgeFile = edgesFile
|
|
|
+ mission.user = user
|
|
|
+ mission.save()
|
|
|
+ successUploadedFiles.append({
|
|
|
+ "id": mission.id,
|
|
|
+ "name": mission.name,
|
|
|
+ "content": "mission",
|
|
|
+ })
|
|
|
+
|
|
|
+ # 初步对文件内容进行分析,获取节点和边的基本数据
|
|
|
+ for file in [nodesFile, edgesFile]:
|
|
|
+ successUploadedFiles.append({
|
|
|
+ "id": file.id,
|
|
|
+ "name": file.name,
|
|
|
+ "content": file.content,
|
|
|
+ "nodes": file.own_file_info.nodes,
|
|
|
+ "sNodes": file.own_file_info.sNodes,
|
|
|
+ "dNodes": file.own_file_info.dNodes,
|
|
|
+ "iNodes": file.own_file_info.iNodes,
|
|
|
+ "edges": file.own_file_info.edges,
|
|
|
+ })
|
|
|
+ return success(message="文件上传成功", data=successUploadedFiles, code=200)
|
|
|
+ else:
|
|
|
+ logger.error("节点和边文件的合法性检测未通过")
|
|
|
+ nodesFile.delete()
|
|
|
+ edgesFile.delete()
|
|
|
+ return failed(message="节点和边信息输入失败,节点或边信息未通过合法性检测")
|
|
|
+
|
|
|
+
|
|
|
class PlanAPI(APIView):
|
|
|
def post(self, request):
|
|
|
user = request.user
|