fb311b7a5171bfa98a87f26b48c513859d58ccbc
[laas.git] / src / workflow / views.py
1 ##############################################################################
2 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10
11 from django.http import HttpResponse
12 from django.shortcuts import render
13 from account.models import Lab
14
15 import uuid
16
17 from workflow.workflow_manager import ManagerTracker, SessionManager
18
19 import logging
20 logger = logging.getLogger(__name__)
21
22
23 def attempt_auth(request):
24     try:
25         manager = ManagerTracker.managers[request.session['manager_session']]
26
27         return manager
28
29     except KeyError:
30         return None
31
32
33 def remove_workflow(request):
34     manager = attempt_auth(request)
35
36     if not manager:
37         return no_workflow(request)
38
39     has_more_workflows, result = manager.pop_workflow(discard=True)
40
41     if not has_more_workflows:  # this was the last workflow, so delete the reference to it in the tracker
42         del ManagerTracker.managers[request.session['manager_session']]
43     return manager.render(request)
44
45
46 def add_workflow(request):
47     manager = attempt_auth(request)
48     if not manager:
49         return no_workflow(request)
50     try:
51         workflow_type = int(request.POST.get('workflow_type'))
52     except ValueError:
53         return HttpResponse(status=400)
54
55     manager.add_workflow(workflow_type=workflow_type)
56     return manager.render(request)  # do we want this?
57
58
59 def manager_view(request):
60     manager = attempt_auth(request)
61     if not manager:
62         return no_workflow(request)
63
64     return manager.handle_request(request)
65
66
67 def viewport_view(request):
68     if not request.user.is_authenticated:
69         return login(request)
70
71     manager = attempt_auth(request)
72     if manager is None:
73         return no_workflow(request)
74
75     if request.method != 'GET':
76         return HttpResponse(status=405)
77
78     context = {
79         'contact_email': Lab.objects.get(name="UNH_IOL").contact_email
80     }
81
82     return render(request, 'workflow/viewport-base.html', context)
83
84
85 def create_workflow(request):
86     if request.method != 'POST':
87         return HttpResponse(status=405)
88     workflow_type = request.POST.get('workflow_type')
89     try:
90         workflow_type = int(workflow_type)
91     except Exception:
92         return HttpResponse(status=400)
93     mgr_uuid = create_session(workflow_type, request=request,)
94     request.session['manager_session'] = mgr_uuid
95     return HttpResponse()
96
97
98 def create_session(wf_type, request):
99     smgr = SessionManager(request=request)
100     smgr.add_workflow(workflow_type=wf_type, target_id=request.POST.get("target"))
101     manager_uuid = uuid.uuid4().hex
102     ManagerTracker.getInstance().managers[manager_uuid] = smgr
103
104     return manager_uuid
105
106
107 def no_workflow(request):
108     return render(request, 'workflow/no_workflow.html', {'title': "Not Found"}, status=404)
109
110
111 def login(request):
112     return render(request, "dashboard/login.html", {'title': 'Authentication Required'})