From 7c5eae8897f7cf75720a4b3aba9e88f9281bb59f Mon Sep 17 00:00:00 2001
From: Kálmán Viktor <kviktor@cloud.bme.hu>
Date: Tue, 13 Jan 2015 15:13:26 +0100
Subject: [PATCH] dashboard: node/trait fix

- use node_exact on vmlist (mega1 vs mega10)
- remove trait object if there is no more reference to it
---
 circle/dashboard/templates/dashboard/_vm-migrate.html |  2 +-
 circle/dashboard/templates/dashboard/node-detail.html |  2 +-
 circle/dashboard/views/node.py                        | 11 ++++++++---
 circle/vm/models/common.py                            |  7 +++++++
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/circle/dashboard/templates/dashboard/_vm-migrate.html b/circle/dashboard/templates/dashboard/_vm-migrate.html
index 89d3ba7..718d0a3 100644
--- a/circle/dashboard/templates/dashboard/_vm-migrate.html
+++ b/circle/dashboard/templates/dashboard/_vm-migrate.html
@@ -31,7 +31,7 @@ Choose a compute node to migrate {{obj}} to.
         </label>
         <input id="migrate-to-{{n.pk}}" type="radio" name="to_node" value="{{ n.pk }}" style="float: right;"
           {% if current == n.pk %}disabled="disabled"{% endif %}
-          {% if recommended == n.pk %}checked="checked"{% endif %}
+          {% if recommended == n.pk and n.pk != current %}checked="checked"{% endif %}
         />
         {% if n.pk not in nodes_w_traits %}
           <span class="vm-migrate-node-property">
diff --git a/circle/dashboard/templates/dashboard/node-detail.html b/circle/dashboard/templates/dashboard/node-detail.html
index 586cd74..c4d04ef 100644
--- a/circle/dashboard/templates/dashboard/node-detail.html
+++ b/circle/dashboard/templates/dashboard/node-detail.html
@@ -73,7 +73,7 @@
             </a>
           </li>
           <li>
-            <a href="{% url "dashboard.views.vm-list" %}?s=node:{{ node.name }}" 
+            <a href="{% url "dashboard.views.vm-list" %}?s=node_exact:{{ node.name }}"
               target="blank" class="text-center">
               <i class="fa fa-desktop fa-2x"></i><br>
               {% trans "Virtual Machines" %}
diff --git a/circle/dashboard/views/node.py b/circle/dashboard/views/node.py
index 269eb96..19bcbe4 100644
--- a/circle/dashboard/views/node.py
+++ b/circle/dashboard/views/node.py
@@ -143,8 +143,13 @@ class NodeDetailView(LoginRequiredMixin,
     def __remove_trait(self, request):
         try:
             to_remove = request.POST.get('to_remove')
-            self.object = self.get_object()
-            self.object.traits.remove(to_remove)
+            trait = Trait.objects.get(pk=to_remove)
+            node = self.get_object()
+            node.traits.remove(to_remove)
+
+            if not trait.in_use:
+                trait.delete()
+
             message = u"Success"
         except:  # note this won't really happen
             message = u"Not success"
@@ -155,7 +160,7 @@ class NodeDetailView(LoginRequiredMixin,
                 content_type="application/json"
             )
         else:
-            return redirect(self.object.get_absolute_url())
+            return redirect(node.get_absolute_url())
 
 
 class NodeList(LoginRequiredMixin, GraphMixin, SingleTableView):
diff --git a/circle/vm/models/common.py b/circle/vm/models/common.py
index c86c0b1..fd3efa2 100644
--- a/circle/vm/models/common.py
+++ b/circle/vm/models/common.py
@@ -170,3 +170,10 @@ class Trait(Model):
 
     def __unicode__(self):
         return self.name
+
+    @property
+    def in_use(self):
+        return (
+            self.instance_set.exists() or self.node_set.exists()
+            or self.instancetemplate_set.exists()
+        )
--
libgit2 0.26.0