Merge "Requires a Jumphost per POD"
[pharos-tools.git] / dashboard / src / workflow / booking_workflow.py
index 213b9e6..76950b8 100644 (file)
@@ -15,12 +15,12 @@ from django.utils import timezone
 import json
 from datetime import timedelta
 
-from account.models import UserProfile
 from booking.models import Booking
 from workflow.models import WorkflowStep
-from workflow.forms import ResourceSelectorForm, SWConfigSelectorForm, BookingMetaForm, ConfirmationForm
+from workflow.forms import ResourceSelectorForm, SWConfigSelectorForm, BookingMetaForm
 from resource_inventory.models import GenericResourceBundle, ResourceBundle, ConfigBundle
 
+
 class Resource_Select(WorkflowStep):
     template = 'booking/steps/resource_select.html'
     title = "Select Resource"
@@ -33,43 +33,26 @@ class Resource_Select(WorkflowStep):
         self.repo_check_key = False
         self.confirm_key = "booking"
 
-    def get_default_entry(self):
-        return None
-
     def get_context(self):
         context = super(Resource_Select, self).get_context()
         default = []
-        chosen_bundle = None
-        default_bundle = self.get_default_entry()
-        if default_bundle:
-            context['disabled'] = True
-            chosen_bundle = default_bundle
-            if chosen_bundle.id:
-                default.append(chosen_bundle.id)
-            else:
-                default.append("repo bundle")
-        else:
-            chosen_bundle = self.repo_get(self.repo_key, False)
-            if chosen_bundle:
-                if chosen_bundle.id:
-                    default.append(chosen_bundle.id)
-                else:
-                    default.append("repo bundle")
-
-        bundle = default_bundle
-        if not bundle:
-            bundle = chosen_bundle
+
+        chosen_bundle = self.repo_get(self.repo_key, False)
+        if chosen_bundle:
+            default.append(chosen_bundle.id)
+
+        bundle = chosen_bundle
         edit = self.repo_get(self.repo.EDIT, False)
         user = self.repo_get(self.repo.SESSION_USER)
         context['form'] = ResourceSelectorForm(
-                data={"user": user},
-                chosen_resource=default,
-                bundle=bundle,
-                edit=edit
-                )
+            data={"user": user},
+            chosen_resource=default,
+            bundle=bundle,
+            edit=edit
+        )
         return context
 
-    def  post_render(self, request):
+    def post_render(self, request):
         form = ResourceSelectorForm(request.POST)
         context = self.get_context()
         if form.is_valid():
@@ -79,6 +62,9 @@ class Resource_Select(WorkflowStep):
                 self.metastep.set_invalid("Please select a valid bundle")
                 return render(request, self.template, context)
             selected_bundle = json.loads(data)
+            if len(selected_bundle) < 1:
+                self.metastep.set_invalid("Please select a valid bundle")
+                return render(request, self.template, context)
             selected_id = selected_bundle[0]['id']
             gresource_bundle = None
             try:
@@ -86,11 +72,14 @@ class Resource_Select(WorkflowStep):
                 gresource_bundle = GenericResourceBundle.objects.get(id=selected_id)
             except ValueError:
                 # we want the bundle in the repo
-                gresource_bundle = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS,{}).get("bundle", GenericResourceBundle())
+                gresource_bundle = self.repo_get(
+                    self.repo.GRESOURCE_BUNDLE_MODELS,
+                    {}
+                ).get("bundle", GenericResourceBundle())
             self.repo_put(
-                    self.repo_key,
-                    gresource_bundle
-                    )
+                self.repo_key,
+                gresource_bundle
+            )
             confirm = self.repo_get(self.repo.CONFIRMATION)
             if self.confirm_key not in confirm:
                 confirm[self.confirm_key] = {}
@@ -104,27 +93,14 @@ class Resource_Select(WorkflowStep):
             self.metastep.set_invalid("Please complete the fields highlighted in red to continue")
             return render(request, self.template, context)
 
+
 class Booking_Resource_Select(Resource_Select):
 
     def __init__(self, *args, **kwargs):
         super(Booking_Resource_Select, self).__init__(*args, **kwargs)
-        self.repo_key = self.repo.BOOKING_SELECTED_GRB
+        self.repo_key = self.repo.SELECTED_GRESOURCE_BUNDLE
         self.confirm_key = "booking"
 
-    def get_default_entry(self):
-        default = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {}).get("bundle")
-        mine = self.repo_get(self.repo_key)
-        if mine:
-            return None
-        try:
-            config_bundle = self.repo_get(self.repo.BOOKING_MODELS)['booking'].config_bundle
-            if default:
-                return default # select created grb, even if preselected config bundle
-            return config_bundle.bundle
-        except:
-            pass
-        return default
-
     def get_context(self):
         context = super(Booking_Resource_Select, self).get_context()
         return context
@@ -145,6 +121,7 @@ class Booking_Resource_Select(Resource_Select):
         self.repo_put(self.repo.BOOKING_MODELS, models)
         return response
 
+
 class SWConfig_Select(WorkflowStep):
     template = 'booking/steps/swconfig_select.html'
     title = "Select Software Configuration"
@@ -161,12 +138,20 @@ class SWConfig_Select(WorkflowStep):
                 self.metastep.set_invalid("Please select a valid config")
                 return self.render(request)
             bundle_json = json.loads(bundle_json)
+            if len(bundle_json) < 1:
+                self.metastep.set_invalid("Please select a valid config")
+                return self.render(request)
             bundle = None
-            try:
-                id = int(bundle_json[0]['id'])
-                bundle = ConfigBundle.objects.get(id=id)
-            except ValueError:
-                bundle = self.repo_get(self.repo.CONFIG_MODELS).get("bundle")
+            id = int(bundle_json[0]['id'])
+            bundle = ConfigBundle.objects.get(id=id)
+
+            grb = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE)
+
+            if grb and bundle.bundle != grb:
+                self.metastep.set_invalid("Incompatible config selected for resource bundle")
+                return self.render(request)
+            if not grb:
+                self.repo_set(self.repo.SELECTED_GRESOURCE_BUNDLE, bundle.bundle)
 
             models = self.repo_get(self.repo.BOOKING_MODELS, {})
             if "booking" not in models:
@@ -186,28 +171,27 @@ class SWConfig_Select(WorkflowStep):
 
         return self.render(request)
 
-
     def get_context(self):
         context = super(SWConfig_Select, self).get_context()
         default = []
         bundle = None
         chosen_bundle = None
-        created_bundle = self.repo_get(self.repo.CONFIG_MODELS, {}).get("bundle", False)
+        created_bundle = self.repo_get(self.repo.SELECTED_CONFIG_BUNDLE)
         booking = self.repo_get(self.repo.BOOKING_MODELS, {}).get("booking", False)
         try:
             chosen_bundle = booking.config_bundle
             default.append(chosen_bundle.id)
-            bundle=chosen_bundle
+            bundle = chosen_bundle
         except:
             if created_bundle:
-                default.append("repo bundle")
+                default.append(created_bundle.id)
                 bundle = created_bundle
-                context['disabled'] = True
         edit = self.repo_get(self.repo.EDIT, False)
-        grb = self.repo_get(self.repo.BOOKING_SELECTED_GRB)
+        grb = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE)
         context['form'] = SWConfigSelectorForm(chosen_software=default, bundle=bundle, edit=edit, resource=grb)
         return context
 
+
 class Booking_Meta(WorkflowStep):
     template = 'booking/steps/booking_meta.html'
     title = "Extra Info"
@@ -231,7 +215,7 @@ class Booking_Meta(WorkflowStep):
             users = models.get("collaborators", [])
             for user in users:
                 default.append(user.id)
-        except Exception as e:
+        except Exception:
             pass
 
         default_user = self.repo_get(self.repo.SESSION_USER)
@@ -271,7 +255,7 @@ class Booking_Meta(WorkflowStep):
 
             user_data = form.cleaned_data['users']
             confirm['booking']['collaborators'] = []
-            user_data = user_data[2:-2] #fixes malformed string from querydict
+            user_data = user_data[2:-2]  # fixes malformed string from querydict
             if user_data:
                 form_users = json.loads(user_data)
                 for user_json in form_users: