api_calculate.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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
  12. import requests
  13. import json
  14. class CalculateAPI(APIView):
  15. def post(self, request):
  16. user = request.user
  17. try:
  18. mission = Mission.objects.get(id=request.data.get('mission'))
  19. except Mission.DoesNotExist:
  20. return failed(message="处理任务控制失败,未找到处理任务")
  21. except Exception as error:
  22. print("处理任务控制失败", error)
  23. return failed(message="处理任务控制失败,未找到处理任务")
  24. command = request.data.get('command')
  25. try:
  26. assert command in ['start', 'pause', 'stop']
  27. except Exception as error:
  28. print("处理任务控制代码错误")
  29. return failed(message="处理任务控制失败,控制代码错误")
  30. # 向调度程序提交计算任务
  31. # mission = request.json['mission']
  32. # plans = request.json['plans']
  33. calculateData = {
  34. 'mission': {
  35. 'id': mission.id,
  36. },
  37. 'plans': []
  38. }
  39. rootPlan = mission.own_plans.get(parent=None)
  40. calculateData['plans'].append({
  41. 'id': rootPlan.id,
  42. 'nodes': mission.nodeFile.toJson(),
  43. 'edges': mission.edgeFile.toJson(),
  44. 'children': list(mission.own_plans.filter(parent=rootPlan).values_list('id', flat=True)),
  45. })
  46. rootPlans = [ child for child in mission.own_plans.filter(parent=rootPlan)]
  47. while rootPlans:
  48. tempPlans = rootPlans.copy()
  49. rootPlans = []
  50. for p in tempPlans:
  51. children = [ child for child in mission.own_plans.filter(parent=p)]
  52. # 判断是否父节点存在计算结果,有则作为子节点输入
  53. if hasattr(p.parent, 'own_result'):
  54. calculateData['plans'].append({
  55. 'id': p.id,
  56. 'algorithm': p.algorithm.name,
  57. 'nodes': p.parent.own_result.nodeFile.toJson(),
  58. 'edges': p.parent.own_result.edgeFile.toJson(),
  59. 'children': [child.id for child in children],
  60. })
  61. else:
  62. calculateData['plans'].append({
  63. 'id': p.id,
  64. 'algorithm': p.algorithm.name,
  65. 'nodes': None,
  66. 'edges': None,
  67. 'children': [child.id for child in children],
  68. })
  69. rootPlans.extend(children)
  70. requests.post(SCHEDULER_BASE_URL + '/addMission', json=calculateData)
  71. return success(message="成功启动计算")