urlpatterns = [
- url(r'^wf/', include('workflow.urls', namespace='workflow')),
+ url(r'^workflow/', include('workflow.urls', namespace='workflow')),
url(r'^', include('dashboard.urls', namespace='dashboard')),
url(r'^booking/', include('booking.urls', namespace='booking')),
url(r'^accounts/', include('account.urls', namespace='account')),
from django.forms.widgets import NumberInput
import json
+import urllib
from account.models import Lab
from account.models import UserProfile
)
+def validate_step(value):
+ if value not in ["prev", "next", "current"]:
+ raise ValidationError(str(value) + " is not allowed")
+
+
+def validate_step_form(value):
+ try:
+ urllib.parse.unquote_plus(value)
+ except Exception:
+ raise ValidationError("Value is not url encoded data")
+
+
+class ManagerForm(forms.Form):
+ step = forms.CharField(widget=forms.widgets.HiddenInput, validators=[validate_step])
+ step_form = forms.CharField(widget=forms.widgets.HiddenInput, validators=[validate_step_form])
+ # other fields?
+
+
class OPNFVSelectionForm(forms.Form):
installer = forms.ModelChoiceField(queryset=Installer.objects.all(), required=True)
scenario = forms.ModelChoiceField(queryset=Scenario.objects.all(), required=True)
from django.conf.urls import url
from django.conf import settings
-from workflow.views import step_view, delete_session, manager_view, viewport_view
+from workflow.views import delete_session, manager_view, viewport_view, add_workflow, cancel_workflow
from workflow.models import Repository
from workflow.resource_bundle_workflow import Define_Hardware, Define_Nets, Resource_Meta_Info
from workflow.booking_workflow import SWConfig_Select, Booking_Resource_Select, Booking_Meta
app_name = 'workflow'
urlpatterns = [
- url(r'^workflow/$', step_view, name='workflow'),
- url(r'^workflow/finish/$', delete_session, name='delete_session'),
+ url(r'^finish/$', delete_session, name='delete_session'),
url(r'^manager/$', manager_view, name='manager'),
+ url(r'^add/$', add_workflow, name='add_workflow'),
+ url(r'^cancel/$', cancel_workflow, name='cancel_workflow'),
url(r'^$', viewport_view, name='viewport')
]
##############################################################################
-from django.http import HttpResponseGone, JsonResponse
+from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.urls import reverse
manager = attempt_auth(request)
if not manager:
- return HttpResponseGone("No session found that relates to current request")
+ return no_workflow(request)
not_last_workflow, result = manager.pop_workflow()
return JsonResponse(get_redirect_response(result))
-def step_view(request):
+def add_workflow(request):
manager = attempt_auth(request)
if not manager:
- # no manager found, redirect to "lost" page
return no_workflow(request)
- if request.GET.get('step') is not None:
- if request.GET.get('step') == 'next':
- manager.go_next()
- elif request.GET.get('step') == 'prev':
- manager.go_prev()
- else:
- raise Exception("requested action for new step had malformed contents: " + request.GET.get('step'))
- return manager.render(request)
+ try:
+ workflow_type = int(request.POST.get('workflow_type'))
+ except ValueError:
+ return HttpResponse(status=400)
+ manager.add_workflow(workflow_type=workflow_type)
+ return manager.render(request) # do we want this?
-def manager_view(request):
- manager = attempt_auth(request)
+def cancel_workflow(request):
+ manager = attempt_auth(request)
if not manager:
- return HttpResponseGone("No session found that relates to current request")
+ return no_workflow(request)
- if request.method == 'GET':
- # no need for this statement if only intercepting post requests
+ if not manager.pop_workflow():
+ del ManagerTracker.managers[request.session['manager_session']]
- # return general context for viewport page
- return manager.status(request)
- if request.method == 'POST':
- if request.POST.get('add') is not None:
- logger.debug("add found")
- target_id = None
- if 'target' in request.POST:
- target_id = int(request.POST.get('target'))
- manager.add_workflow(workflow_type=int(request.POST.get('add')), target_id=target_id)
- elif request.POST.get('edit') is not None and request.POST.get('edit_id') is not None:
- logger.debug("edit found")
- manager.add_workflow(workflow_type=request.POST.get('edit'), edit_object=int(request.POST.get('edit_id')))
- elif request.POST.get('cancel') is not None:
- if not manager.pop_workflow():
- del ManagerTracker.managers[request.session['manager_session']]
+def manager_view(request):
+ manager = attempt_auth(request)
+ if not manager:
+ return no_workflow(request)
- return manager.status(request)
+ return manager.handle_request(request)
def viewport_view(request):
def no_workflow(request):
-
- logger.debug("There is no active workflow")
-
- return render(request, 'workflow/no_workflow.html', {'title': "Not Found"})
+ return render(request, 'workflow/no_workflow.html', {'title': "Not Found"}, status=404)
def login(request):
from django.http import JsonResponse
+from django.http.request import QueryDict
from booking.models import Booking
from workflow.workflow_factory import WorkflowFactory
HostConfiguration,
OPNFVConfig
)
+from workflow.forms import ManagerForm
import logging
logger = logging.getLogger(__name__)
else:
step.disable()
- def add_workflow(self, workflow_type=None, target_id=None, **kwargs):
- if target_id is not None:
- self.prefill_repo(target_id, workflow_type)
-
+ def add_workflow(self, workflow_type=None, **kwargs):
repo = Repository()
if(len(self.workflows) >= 1):
defaults = self.workflows[-1].repository.get_child_defaults()
return (multiple_wfs, current_repo.el[current_repo.RESULT])
def status(self, request):
- try:
- meta_json = []
- for step in self.active_workflow().steps:
- meta_json.append(step.to_json())
- responsejson = {}
- responsejson["steps"] = meta_json
- responsejson["active"] = self.active_workflow().repository.el['active_step']
- responsejson["workflow_count"] = len(self.workflows)
- return JsonResponse(responsejson, safe=False)
- except Exception:
- pass
+ return {
+ "steps": [step.to_json() for step in self.active_workflow().steps],
+ "active": self.active_workflow().repository.el['active_step'],
+ "workflow_count": len(self.workflows)
+ }
+
+ def handle_post(self, request):
+ form = ManagerForm(request.POST)
+ if form.is_valid:
+ self.get_active_step().post(
+ QueryDict(form.cleaned_data['step_form']),
+ user=request.user
+ )
+ # change step
+ if form.cleaned_data['step'] == 'prev':
+ self.go_prev()
+ if form.cleaned_data['step'] == 'next':
+ self.go_next()
+ else:
+ pass # Exception?
+
+ def handle_request(self, request):
+ if request.method == 'POST':
+ self.handle_post(request)
+ return self.render()
def render(self, request, **kwargs):
- # filter out when a step needs to handle post/form data
- # if 'workflow' in post data, this post request was meant for me, not step
- if request.method == 'POST' and request.POST.get('workflow', None) is None:
- return self.active_workflow().steps[self.active_workflow().active_index].post_render(request)
- return self.active_workflow().steps[self.active_workflow().active_index].render(request)
+ return JsonResponse({
+ "meta": self.status(),
+ "content": self.get_active_step().render_to_string(request)
+ })
def post_render(self, request):
return self.active_workflow().steps[self.active_workflow().active_index].post_render(request)