from django.contrib import auth from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.authentication import BasicAuthentication, TokenAuthentication from .serializers import UserRegisterSerializer from django.middleware.csrf import get_token from django.contrib.auth import login from api.utils import * from api.models import File, Mission, Plan, Algorithm import json class UploadFileAPI(APIView): def get(self, request): user = request.user history = File.objects.getHistory(user=user) if history == FAILED: return failed(message="获取文件上传历史失败") else: return success(data=history) def post(self, request): user = request.user # 获取上传的文件对象 nodeFileName = request.data.get('nodeFileName') edgeFileName = request.data.get('edgeFileName') nodeFile = request.data.get('nodes') edgeFile = request.data.get('edges') # 检查文件用途并进行响应处理 file_usage = request.data.get('usage') if file_usage == 'input': pass else: return failed(message=filename + "上传失败 暂时只支持上传图处理原料文件") # 检查文件类型并进行相应处理 file_type = request.data.get('type') for filename in [nodeFileName, edgeFileName]: if file_type == 'csv': if filename.split('.')[-1] != 'csv': return failed(message=filename + "上传失败 文件类型和文件后缀名不匹配") else: return failed(message=filename + "上传失败 暂不支持CSV之外文件") successUploadedFiles = [] pre_file = None for filename, fileData in [[edgeFileName, edgeFile], [nodeFileName, nodeFile]]: # 处理数据库中记录 file = File() file.name = filename file.user = request.user file.type = file_type file.usage = file_usage # 一定先edge再node if pre_file == None: file.content = 'edge' else: file.content = 'node' file.save() # 尝试保存文件 result = file.storage(fileData) if result != OK: file.delete() # 第二个文件错误,同样删除第一个文件 if pre_file: pre_file.delete() if result == FILE_ALREADY_EXIST: return failed(message=filename + "上传失败 已存在同名文件", data="已存在同名文件", code=400) elif result == FILE_FAILED_CREATE_DIR: return failed(message=filename + "上传失败 文件目录创建失败", data="文件目录创建失败", code=400) else: return failed(message=filename + "上传失败 因未知原因文件上传失败", data="因未知原因文件上传失败", code=400) # 第二个文件也成功时,将两个文件互相关联 if pre_file: file.associate = pre_file pre_file.associate = file file.saveWithInfo() pre_file.saveWithInfo() else: pre_file = file # 两个文件均上传成功后,检测文件内容是否符合规范 if file.checkIllegal() and pre_file.checkIllegal(): # 确保正确后创建mission,并将信息返回 mission = Mission() mission.nodeFile = file mission.edgeFile = pre_file mission.user = user mission.save() successUploadedFiles.append({ "id": mission.id, "name": mission.name, "content": "mission", }) # 初步对文件内容进行分析,获取节点和边的基本数据 for file in [file, pre_file]: 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: return failed(message="文件合法性检查失败") def delete(self, request): user = request.user file = File.objects.get(id=request.data.get('id')) result = file.deleteStorage() if result == OK: return success(message="删除文件成功") elif result == False: return failed(messgae="删除文件失败") class PlanAPI(APIView): def post(self, request): user = request.user plans = request.data.get('plans') overWritePlans = False try: mission = Mission.objects.get(id=request.data.get('mission')) except Mission.DoesNotExist: print("处理规划所属任务不存在") return failed(message="未找到规划任务所属任务") # 重复提交同一Mission的规划将覆盖 if mission.own_plans.exists(): overWritePlans = True for plan in mission.own_plans.all(): plan.delete() # 全部放入矩阵 planMat = [[{}, {}, {}] for i in range(10)] # 找出所有并行的源头 origins = [] for plan in plans: if plan['row'] == 0: origins.append(plan) planMat[plan['row']][plan['col']] = plan rootPlan = Plan(mission=mission, parent=None, algorithm=None, user=user) rootPlan.save() originPlans = [] # 添加第一代规划 for pJson in origins: # p.algorithm应该用来新建plan,先占位 # childPlan = Plan(mission=mission, parent=rootPlan, algorithm=p['algorithm'], user=user) try: algorithm = Algorithm.objects.get(name=pJson['algorithm']) except Algorithm.DoesNotExist: print("Not Exist Algorithm") return failed(message=str(pJson['id']) + "规划选定算法不存在") pModel = Plan(mission=mission, parent=rootPlan, algorithm=algorithm, user=user) pModel.save() # p是json数据,headPlan是保存的PlanModel originPlans.append([pJson, pModel]) # 添加后续规划 while originPlans: pJson, pModel = originPlans.pop() for childPos in pJson['children']: childJson = planMat[childPos['row']][childPos['col']] try: algorithm = Algorithm.objects.get(name=pJson['algorithm']) except Algorithm.DoesNotExist: print("Not Exist Algorithm") return failed(message=str(pJson['id']) + "规划选定算法不存在") childModel = Plan(mission=mission, parent=pModel, algorithm=algorithm, user=user) childModel.save() originPlans.append([childJson, childModel]) if overWritePlans: return success(message="规划已覆盖") else: return success(message="规划已提交")