From a3138b0289732ebf31ee24a51643c49de1058e27 Mon Sep 17 00:00:00 2001
From: Kálmán Viktor <kviktor@cloud.bme.hu>
Date: Wed, 6 Aug 2014 18:14:09 +0200
Subject: [PATCH] dashboard: enhance template list table

Closes #239
---
 circle/dashboard/tables.py                                                      | 27 +++++++++++++++++----------
 circle/dashboard/templates/dashboard/template-list/column-template-name.html    |  3 +++
 circle/dashboard/templates/dashboard/template-list/column-template-owner.html   |  1 +
 circle/dashboard/templates/dashboard/template-list/column-template-running.html |  3 +++
 circle/dashboard/views.py                                                       |  1 +
 circle/vm/models/instance.py                                                    |  3 +++
 6 files changed, 28 insertions(+), 10 deletions(-)
 create mode 100644 circle/dashboard/templates/dashboard/template-list/column-template-name.html
 create mode 100644 circle/dashboard/templates/dashboard/template-list/column-template-owner.html
 create mode 100644 circle/dashboard/templates/dashboard/template-list/column-template-running.html

diff --git a/circle/dashboard/tables.py b/circle/dashboard/tables.py
index e8188c9..0fb6c31 100644
--- a/circle/dashboard/tables.py
+++ b/circle/dashboard/tables.py
@@ -184,9 +184,8 @@ class UserListTablex(Table):
 
 
 class TemplateListTable(Table):
-    name = LinkColumn(
-        'dashboard.views.template-detail',
-        args=[A('pk')],
+    name = TemplateColumn(
+        template_name="dashboard/template-list/column-template-name.html",
         attrs={'th': {'data-sort': "string"}}
     )
     num_cores = Column(
@@ -194,23 +193,31 @@ class TemplateListTable(Table):
         attrs={'th': {'data-sort': "int"}}
     )
     ram_size = TemplateColumn(
-        "{{ record.ram_size }} Mb",
-        attrs={'th': {'data-sort': "string"}}
+        "{{ record.ram_size }} MiB",
+        attrs={'th': {'data-sort': "int"}},
     )
     lease = TemplateColumn(
         "{{ record.lease.name }}",
         verbose_name=_("Lease"),
         attrs={'th': {'data-sort': "string"}}
     )
-    arch = Column(
-        attrs={'th': {'data-sort': "string"}}
-    )
     system = Column(
         attrs={'th': {'data-sort': "string"}}
     )
     access_method = Column(
         attrs={'th': {'data-sort': "string"}}
     )
+    owner = TemplateColumn(
+        template_name="dashboard/template-list/column-template-owner.html",
+        verbose_name=_("Owner"),
+        attrs={'th': {'data-sort': "string"}}
+    )
+    running = TemplateColumn(
+        template_name="dashboard/template-list/column-template-running.html",
+        verbose_name=_("Running"),
+        attrs={'th': {'data-sort': "int"}},
+        orderable=False,
+    )
     actions = TemplateColumn(
         verbose_name=_("Actions"),
         template_name="dashboard/template-list/column-template-actions.html",
@@ -222,8 +229,8 @@ class TemplateListTable(Table):
         model = InstanceTemplate
         attrs = {'class': ('table table-bordered table-striped table-hover'
                            ' template-list-table')}
-        fields = ('name', 'num_cores', 'ram_size', 'arch',
-                  'system', 'access_method', 'lease', 'actions', )
+        fields = ('name', 'num_cores', 'ram_size', 'system',
+                  'access_method', 'lease', 'owner', 'running', 'actions', )
 
         prefix = "template-"
 
diff --git a/circle/dashboard/templates/dashboard/template-list/column-template-name.html b/circle/dashboard/templates/dashboard/template-list/column-template-name.html
new file mode 100644
index 0000000..aea76d3
--- /dev/null
+++ b/circle/dashboard/templates/dashboard/template-list/column-template-name.html
@@ -0,0 +1,3 @@
+<a href="{% url "dashboard.views.template-detail" pk=record.pk %}" title="{{ record.description }}">
+  {{ record.name }}
+</a>
diff --git a/circle/dashboard/templates/dashboard/template-list/column-template-owner.html b/circle/dashboard/templates/dashboard/template-list/column-template-owner.html
new file mode 100644
index 0000000..8709876
--- /dev/null
+++ b/circle/dashboard/templates/dashboard/template-list/column-template-owner.html
@@ -0,0 +1 @@
+{% include "dashboard/_display-name.html" with user=record.owner show_org=True %}
diff --git a/circle/dashboard/templates/dashboard/template-list/column-template-running.html b/circle/dashboard/templates/dashboard/template-list/column-template-running.html
new file mode 100644
index 0000000..fa73dc4
--- /dev/null
+++ b/circle/dashboard/templates/dashboard/template-list/column-template-running.html
@@ -0,0 +1,3 @@
+<a href="{% url "dashboard.views.vm-list" %}?s=template:{{ record.pk }} status:running">
+  {{ record.get_running_instances.count }}
+</a>
diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py
index 4c9d0c0..9d21d59 100644
--- a/circle/dashboard/views.py
+++ b/circle/dashboard/views.py
@@ -1555,6 +1555,7 @@ class VmList(LoginRequiredMixin, FilterMixin, ListView):
         'tags[]': "tags__name__in",
         'tags': "tags__name__in",  # for search string
         'owner': "owner__username",
+        'template': "template__pk",
     }
 
     def get(self, *args, **kwargs):
diff --git a/circle/vm/models/instance.py b/circle/vm/models/instance.py
index a90c910..236a8d0 100644
--- a/circle/vm/models/instance.py
+++ b/circle/vm/models/instance.py
@@ -203,6 +203,9 @@ class InstanceTemplate(AclBase, VirtualMachineDescModel, TimeStampedModel):
         for disk in self.disks.all():
             disk.destroy()
 
+    def get_running_instances(self):
+        return Instance.active.filter(template=self, status="RUNNING")
+
 
 class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
                TimeStampedModel):
--
libgit2 0.26.0