Fixed Misc Bugs
authorParker Berberian <pberberian@iol.unh.edu>
Tue, 20 Nov 2018 16:19:55 +0000 (11:19 -0500)
committerParker Berberian <pberberian@iol.unh.edu>
Mon, 26 Nov 2018 19:14:10 +0000 (14:14 -0500)
Some corner cases that cause issues recently came to our attention.
Fixes issues in the booking workflow and the Notification system.

Change-Id: Ie16118ba1bdbeff86bb41a16dc783337b921d527
Signed-off-by: Parker Berberian <pberberian@iol.unh.edu>
src/notifier/manager.py
src/notifier/views.py
src/resource_inventory/resource_manager.py
src/templates/notifier/end_booking.html
src/templates/notifier/inbox.html
src/templates/notifier/new_booking.html
src/templates/notifier/notification.html
src/workflow/resource_bundle_workflow.py
src/workflow/sw_bundle_workflow.py

index a754241..3361074 100644 (file)
@@ -45,7 +45,7 @@ class NotificationHandler(object):
                 }
             )
         )
-        owner_notif.recipients.add(booking.owner)
+        owner_notif.recipients.add(booking.owner.userprofile)
         if not booking.collaborators.all().exists():
             return  # no collaborators - were done
 
@@ -60,7 +60,7 @@ class NotificationHandler(object):
             )
         )
         for c in booking.collaborators.all():
-            collab_notif.recipients.add(c)
+            collab_notif.recipients.add(c.userprofile)
 
     @classmethod
     def email_job_fulfilled(cls, job):
index c1a2f7e..4ee757f 100644 (file)
@@ -17,7 +17,7 @@ def InboxView(request):
     else:
         return render(request, "dashboard/login.html", {'title': 'Authentication Required'})
 
-    return render(request, "notifier/inbox.html", {'notifications': Notification.objects.filter(recipient=user.userprofile)})
+    return render(request, "notifier/inbox.html", {'notifications': Notification.objects.filter(recipients=user.userprofile)})
 
 
 def NotificationView(request, notification_id):
@@ -27,7 +27,7 @@ def NotificationView(request, notification_id):
         return render(request, "dashboard/login.html", {'title': 'Authentication Required'})
 
     notification = Notification.objects.get(id=notification_id)
-    if user not in notification.recipients:
+    if user.userprofile not in notification.recipients.all():
         return render(request, "dashboard/login.html", {'title': 'Access Denied'})
 
     return render(request, "notifier/notification.html", {'notification': notification})
index 3380990..9282580 100644 (file)
@@ -15,7 +15,7 @@ from dashboard.exceptions import (
     ResourceExistenceException,
     ResourceAvailabilityException,
     ResourceProvisioningException,
-    ModelValidationException
+    ModelValidationException,
 )
 from resource_inventory.models import Host, HostConfiguration, ResourceBundle
 
index 22014fb..a2981c1 100644 (file)
@@ -30,7 +30,7 @@
                 </li>
             </ul>
 
-            <p>You can find more detailed information <a href=/booking/detail/{{booking.id/>Here</a></p>
+            <p>You can find more detailed information <a href=/booking/detail/{{booking.id}}/>Here</a></p>
         </div>
     </body>
 </html>
index c0ee1ba..471eae4 100644 (file)
@@ -56,7 +56,7 @@
 <div class="inbox-panel">
   <div class="section-panel">
     <div class="card-container">
-      {% for notification in notifier_messages  %}
+      {% for notification in notifications  %}
         <div class="inbox-entry card" onclick="showmessage({{notification.id}}); setactive(this);">
           {{ notification }}
         </div>
index 4b53875..d23b12e 100644 (file)
@@ -28,7 +28,7 @@
                 </li>
             </ul>
 
-            <p>You can find more detailed information <a href=/booking/detail/{{booking.id/>Here</a></p>
+            <p>You can find more detailed information <a href=/booking/detail/{{booking.id}}/>Here</a></p>
         </div>
     </body>
 </html>
index 1258fe0..65d26c9 100644 (file)
@@ -1,4 +1,8 @@
-{% load staticfiles %}
+{% extends "layout.html" %}
+{% block extrahead %}
+<base target="_parent">
+{% endblock %}
+{% block basecontent %}
 <div class="card-container">
 <h3 class="msg_header">{{notification.title}}</h3>
 <p class="content"></p>
@@ -6,7 +10,6 @@
 {{notification.content|safe}}
 </pre>
 
-<p class="sender">Message from {{notification.sender}}</p>
 </div>
 
 <style media="screen">
@@ -32,3 +35,4 @@
 
 
 </style>
+{% endblock %}
index 9fb4ae1..712c92b 100644 (file)
@@ -35,7 +35,8 @@ from dashboard.exceptions import (
     InvalidVlanConfigurationException,
     NetworkExistsException,
     InvalidHostnameException,
-    NonUniqueHostnameException
+    NonUniqueHostnameException,
+    ResourceAvailabilityException
 )
 
 import logging
@@ -233,6 +234,8 @@ class Define_Nets(WorkflowStep):
             self.updateModels(xmlData)
             # update model with xml
             self.metastep.set_valid("Networks applied successfully")
+        except ResourceAvailabilityException:
+            self.metastep.set_invalid("Public network not availble")
         except Exception:
             self.metastep.set_invalid("An error occurred when applying networks")
         return self.render(request)
@@ -261,6 +264,9 @@ class Define_Nets(WorkflowStep):
                     vlan_id = network['network']['vlan']
                     is_public = network['network']['public']
                     if is_public:
+                        public_net = vlan_manager.get_public_vlan()
+                        if public_net is None:
+                            raise ResourceAvailabilityException("No public networks available")
                         vlan_id = vlan_manager.get_public_vlan().vlan
                     vlan = Vlan(vlan_id=vlan_id, tagged=network['tagged'], public=is_public)
                     models['vlans'][existing_host.resource.name][iface['profile_name']].append(vlan)
index 56d0a5d..26ade22 100644 (file)
@@ -69,7 +69,15 @@ class Define_Software(WorkflowStep):
         user = self.repo_get(self.repo.SESSION_USER)
         i = 0
         for host_data in hosts_initial:
-            host = GenericHost.objects.get(pk=host_data['host_id'])
+            host_profile = None
+            try:
+                host = GenericHost.objects.get(pk=host_data['host_id'])
+                host_profile = host.profile
+            except Exception:
+                for host in hostlist:
+                    if host.resource.name == host_data['host_name']:
+                        host_profile = host.profile
+                        break
             excluded_images = Image.objects.exclude(owner=user).exclude(public=True)
             excluded_images = excluded_images | Image.objects.exclude(host_type=host.profile)
             lab = self.repo_get(self.repo.SWCONF_SELECTED_GRB).lab