Merge "Requires a Jumphost per POD"
[pharos-tools.git] / dashboard / 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, HttpResponseGone
12 from django.shortcuts import render
13
14 import uuid
15
16 from workflow.workflow_manager import ManagerTracker, SessionManager
17
18 import logging
19 logger = logging.getLogger(__name__)
20
21
22 def attempt_auth(request):
23     try:
24         manager = ManagerTracker.managers[request.session['manager_session']]
25
26         return manager
27
28     except KeyError:
29         return None
30
31
32 def delete_session(request):
33     manager = attempt_auth(request)
34
35     if not manager:
36         return HttpResponseGone("No session found that relates to current request")
37
38     if manager.pop_workflow():
39         return HttpResponse('')
40     else:
41         del ManagerTracker.managers[request.session['manager_session']]
42         return render(request, 'workflow/exit_redirect.html')
43
44     try:
45         del ManagerTracker.managers[request.session['manager_session']]
46         return HttpResponse('')
47     except Exception:
48         return None
49
50
51 def step_view(request):
52     manager = attempt_auth(request)
53     if not manager:
54         # no manager found, redirect to "lost" page
55         return no_workflow(request)
56     if request.GET.get('step') is not None:
57         manager.goto(int(request.GET.get('step')))
58     return manager.render(request)
59
60
61 def manager_view(request):
62     manager = attempt_auth(request)
63
64     if not manager:
65         return HttpResponseGone("No session found that relates to current request")
66
67     if request.method == 'GET':
68         # no need for this statement if only intercepting post requests
69
70         # return general context for viewport page
71         return manager.status(request)
72
73     if request.method == 'POST':
74         if request.POST.get('add') is not None:
75             logger.debug("add found")
76             target_id = None
77             if 'target' in request.POST:
78                 target_id = int(request.POST.get('target'))
79             manager.add_workflow(workflow_type=int(request.POST.get('add')), target_id=target_id)
80         elif request.POST.get('edit') is not None and request.POST.get('edit_id') is not None:
81             logger.debug("edit found")
82             manager.add_workflow(workflow_type=request.POST.get('edit'), edit_object=int(request.POST.get('edit_id')))
83         elif request.POST.get('cancel') is not None:
84             if not manager.pop_workflow():
85                 del ManagerTracker.managers[request.session['manager_session']]
86
87     return manager.status(request)
88
89
90 def viewport_view(request):
91     if not request.user.is_authenticated:
92         return login(request)
93
94     manager = attempt_auth(request)
95     if manager is None:
96         return no_workflow(request)
97
98     if request.method == 'GET':
99         return render(request, 'workflow/viewport-base.html')
100     else:
101         pass
102
103
104 def create_session(wf_type, request):
105     wf = int(wf_type)
106     smgr = SessionManager(request=request)
107     smgr.add_workflow(workflow_type=wf, target_id=request.POST.get("target"))
108     manager_uuid = uuid.uuid4().hex
109     ManagerTracker.getInstance().managers[manager_uuid] = smgr
110
111     return manager_uuid
112
113
114 def no_workflow(request):
115
116     logger.debug("There is no active workflow")
117
118     return render(request, 'workflow/no_workflow.html', {'title': "Not Found"})
119
120
121 def login(request):
122     return render(request, "dashboard/login.html", {'title': 'Authentication Required'})