Fixed the quick booking form resource template filtering. Added some more models... 00/69800/3
authorAdam Hassick <ahassick@iol.unh.edu>
Tue, 17 Mar 2020 15:35:40 +0000 (11:35 -0400)
committerAdam Hassick <ahassick@iol.unh.edu>
Wed, 18 Mar 2020 15:43:08 +0000 (11:43 -0400)
Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
Change-Id: I2d2e7aeb96b10c231804a62f37a476039c954b7b

src/booking/forms.py
src/booking/views.py
src/resource_inventory/admin.py
src/resource_inventory/models.py
src/resource_inventory/resource_manager.py
src/workflow/forms.py

index b9c9231..2d3ef0f 100644 (file)
@@ -27,7 +27,7 @@ class QuickBookingForm(forms.Form):
     installer = forms.ModelChoiceField(queryset=Installer.objects.all(), required=False)
     scenario = forms.ModelChoiceField(queryset=Scenario.objects.all(), required=False)
 
-    def __init__(self, data=None, user=None, *args, **kwargs):
+    def __init__(self, data=None, user=None, lab_data=None, *args, **kwargs):
         if "default_user" in kwargs:
             default_user = kwargs.pop("default_user")
         else:
@@ -47,8 +47,6 @@ class QuickBookingForm(forms.Form):
             **get_user_field_opts()
         )
 
-        attrs = FormUtils.getLabData()
-        self.fields['filter_field'] = MultipleSelectFilterField(widget=MultipleSelectFilterWidget(**attrs))
         self.fields['length'] = forms.IntegerField(
             widget=NumberInput(
                 attrs={
@@ -60,6 +58,8 @@ class QuickBookingForm(forms.Form):
             )
         )
 
+        self.fields['filter_field'] = MultipleSelectFilterField(widget=MultipleSelectFilterWidget(**lab_data))
+
     def build_user_list(self):
         """
         Build list of UserProfiles.
index daaf026..e767be1 100644 (file)
@@ -24,11 +24,13 @@ from account.models import Lab, Downtime
 from booking.models import Booking
 from booking.stats import StatisticsManager
 from booking.forms import HostReImageForm
+from booking.forms import FormUtils
 from api.models import JobFactory
 from workflow.views import login
 from booking.forms import QuickBookingForm
 from booking.quick_deployer import create_from_form, drop_filter
-
+from workflow.forms import (MultipleSelectFilterField,
+        MultipleSelectFilterWidget)
 
 def quick_create_clear_fields(request):
     request.session['quick_create_forminfo'] = None
@@ -40,21 +42,16 @@ def quick_create(request):
 
     if request.method == 'GET':
         context = {}
-
-        r_manager = ResourceManager.getInstance()
-        templates = {}
-        for lab in Lab.objects.all():
-            templates[str(lab)] = r_manager.getAvailableResourceTemplates(lab, request.user)
-
-        context['lab_profile_map'] = templates
-
-        context['form'] = QuickBookingForm(default_user=request.user.username, user=request.user)
-
+        attrs = FormUtils.getLabData(user=request.user)
+        context['form'] = QuickBookingForm(lab_data=attrs, default_user=request.user.username, user=request.user)
+        context['lab_profile_map'] = {}
         context.update(drop_filter(request.user))
-
         return render(request, 'booking/quick_deploy.html', context)
+
     if request.method == 'POST':
-        form = QuickBookingForm(request.POST, user=request.user)
+        attrs = FormUtils.getLabData(user=request.user)
+        form = QuickBookingForm(request.POST, lab_data=attrs, user=request.user)
+
         context = {}
         context['lab_profile_map'] = {}
         context['form'] = form
index 13afd99..439dad3 100644 (file)
@@ -30,7 +30,9 @@ from resource_inventory.models import (
     OPNFVConfig,
     OPNFVRole,
     Image,
-    RemoteInfo
+    RemoteInfo,
+    PhysicalNetwork,
+    NetworkConnection
 )
 
 admin.site.register([
@@ -53,4 +55,6 @@ admin.site.register([
     OPNFVConfig,
     OPNFVRole,
     Image,
+    PhysicalNetwork,
+    NetworkConnection,
     RemoteInfo])
index 7115ece..2c2dd5c 100644 (file)
@@ -164,6 +164,7 @@ class ResourceTemplate(models.Model):
     temporary = models.BooleanField(default=False)
 
     def getConfigs(self):
+        configs = self.resourceConfigurations.all()
         return list(self.resourceConfigurations.all())
 
     def __str__(self):
@@ -428,7 +429,7 @@ class InterfaceConfiguration(models.Model):
     connections = models.ManyToManyField(NetworkConnection)
 
     def __str__(self):
-        return "type " + str(self.profile) + " on host " + str(self.host)
+        return "type " + str(self.profile.name) + " on host " + str(self.profile.host.name)
 
 
 """
index 4310f8c..fa8acfb 100644 (file)
@@ -19,7 +19,6 @@ from resource_inventory.models import (
     PhysicalNetwork,
 )
 
-
 class ResourceManager:
 
     instance = None
@@ -33,10 +32,12 @@ class ResourceManager:
             ResourceManager.instance = ResourceManager()
         return ResourceManager.instance
 
-    def getAvailableResourceTemplates(self, lab, user):
-        templates = ResourceTemplate.objects.filter(lab=lab)
-        templates = templates.filter(Q(owner=user) | Q(public=True)).filter(temporary=False)
-        return templates
+    def getAvailableResourceTemplates(self, lab, user=None):
+        filter = Q(public=True)
+        if user:
+            filter = filter | Q(owner=user)
+        filter = filter & Q(temporary=False) & Q(lab=lab)
+        return ResourceTemplate.objects.filter(filter)
 
     def templateIsReservable(self, resource_template):
         """
index a8d3413..c86f9da 100644 (file)
@@ -24,6 +24,7 @@ from resource_inventory.models import (
     Installer,
     Scenario,
 )
+from resource_inventory.resource_manager import ResourceManager
 from booking.lib import get_user_items, get_user_field_opts
 
 
@@ -286,7 +287,7 @@ class MultipleSelectFilterField(forms.Field):
 
 class FormUtils:
     @staticmethod
-    def getLabData(multiple_hosts=False):
+    def getLabData(multiple_hosts=False, user=None):
         """
         Get all labs and thier host profiles, returns a serialized version the form can understand.
 
@@ -319,7 +320,8 @@ class FormUtils:
             neighbors[lab_node['id']] = []
             labs[lab_node['id']] = lab_node
 
-            for template in lab.resourcetemplates.all():
+            for template in ResourceManager.getInstance().getAvailableResourceTemplates(lab, user):
+
                 resource_node = {
                     'form': {"name": "host_name", "type": "text", "placeholder": "hostname"},
                     'id': "resource_" + str(template.id),