Commit f8bac858 by Kálmán Viktor

dashboard: add filter for template list

parent 15d3d135
...@@ -1201,5 +1201,5 @@ class TemplateListSearchForm(forms.Form): ...@@ -1201,5 +1201,5 @@ class TemplateListSearchForm(forms.Form):
# set initial value, otherwise it would be overwritten by request.GET # set initial value, otherwise it would be overwritten by request.GET
if not self.data.get("stype"): if not self.data.get("stype"):
data = self.data.copy() data = self.data.copy()
data['stype'] = "all" data['stype'] = "owned"
self.data = data self.data = data
...@@ -16,6 +16,23 @@ ...@@ -16,6 +16,23 @@
<h3 class="no-margin"><i class="fa fa-puzzle-piece"></i> {% trans "Templates" %}</h3> <h3 class="no-margin"><i class="fa fa-puzzle-piece"></i> {% trans "Templates" %}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="row">
<div class="col-md-offset-8 col-md-4" id="template-list-search">
<form action="" method="GET">
<div class="input-group">
{{ search_form.s }}
<div class="input-group-btn">
{{ search_form.stype }}
<button type="submit" class="btn btn-primary input-tags">
<i class="fa fa-search"></i>
</button>
</div>
</div><!-- .input-group -->
</form>
</div><!-- .col-md-4 #template-list-search -->
</div>
</div>
<div class="panel-body">
{% render_table table %} {% render_table table %}
</div> </div>
</div> </div>
......
<a href="{% url "dashboard.views.vm-list" %}?s=template:{{ record.pk }}%20status:running"> <a href="{% url "dashboard.views.vm-list" %}?s=template:{{ record.pk }}%20status:running">
{{ record.get_running_instances.count }} {{ record.running }}
</a> </a>
...@@ -1687,6 +1687,18 @@ class TemplateList(LoginRequiredMixin, FilterMixin, SingleTableView): ...@@ -1687,6 +1687,18 @@ class TemplateList(LoginRequiredMixin, FilterMixin, SingleTableView):
table_class = TemplateListTable table_class = TemplateListTable
table_pagination = False table_pagination = False
allowed_filters = {
'name': "name__icontains",
'tags[]': "tags__name__in",
'tags': "tags__name__in", # for search string
'owner': "owner__username",
'ram': "ram_size",
'ram_size': "ram_size",
'cores': "num_cores",
'num_cores': "num_cores",
'access_method': "access_method__iexact",
}
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
context = super(TemplateList, self).get_context_data(*args, **kwargs) context = super(TemplateList, self).get_context_data(*args, **kwargs)
context['lease_table'] = LeaseListTable( context['lease_table'] = LeaseListTable(
...@@ -1702,11 +1714,26 @@ class TemplateList(LoginRequiredMixin, FilterMixin, SingleTableView): ...@@ -1702,11 +1714,26 @@ class TemplateList(LoginRequiredMixin, FilterMixin, SingleTableView):
self.search_form.full_clean() self.search_form.full_clean()
return super(TemplateList, self).get(*args, **kwargs) return super(TemplateList, self).get(*args, **kwargs)
def create_acl_queryset(self, model):
queryset = super(TemplateList, self).create_acl_queryset(model)
sql = ("SELECT count(*) FROM vm_instance WHERE "
"vm_instance.template_id = vm_instancetemplate.id and "
"vm_instance.destroyed_at is null and "
"vm_instance.status = 'RUNNING'")
queryset = queryset.extra(select={'running': sql})
return queryset
def get_queryset(self): def get_queryset(self):
logger.debug('TemplateList.get_queryset() called. User: %s', logger.debug('TemplateList.get_queryset() called. User: %s',
unicode(self.request.user)) unicode(self.request.user))
queryset = self.create_acl_queryset(InstanceTemplate) queryset = self.create_acl_queryset(InstanceTemplate)
return queryset.annotate(running=Count('instance_set')) self.create_fake_get()
try:
return queryset.filter(**self.get_queryset_filters()).distinct()
except ValueError:
messages.error(self.request, _("Error during filtering."))
return queryset
class TemplateDelete(LoginRequiredMixin, DeleteView): class TemplateDelete(LoginRequiredMixin, DeleteView):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment