Commit 972e987f by Kálmán Viktor

dashboard: search and filter for storage disk list

parent 1a0c4303
...@@ -1269,3 +1269,9 @@ textarea[name="new_members"] { ...@@ -1269,3 +1269,9 @@ textarea[name="new_members"] {
background: #f9f9f9; background: #f9f9f9;
margin-top: 20px; margin-top: 20px;
} }
#disk-list-table {
td:last-child {
text-align: center;
}
}
...@@ -350,4 +350,5 @@ class DiskListTable(Table): ...@@ -350,4 +350,5 @@ class DiskListTable(Table):
fields = ("pk", "appliance", "filename", "size", "is_ready") fields = ("pk", "appliance", "filename", "size", "is_ready")
prefix = "disk-" prefix = "disk-"
order_by = ("-pk", ) order_by = ("-pk", )
per_page = 65536 per_page = 15
empty_text = _("No disk found.")
...@@ -70,6 +70,33 @@ ...@@ -70,6 +70,33 @@
<h3 class="no-margin"><i class="fa fa-file"></i> {% trans "Disks" %}</h3> <h3 class="no-margin"><i class="fa fa-file"></i> {% trans "Disks" %}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="row">
<div class="col-md-9">
<ul class="nav nav-pills" style="margin: 5px 0 20px 0;">
<li class="disabled"><a href="#">{% trans "Filter by type" %}</a></li>
<li {% if not request.GET.filter %} class="active"{% endif %}>
<a href="{{ request.path }}?s={{ request.GET.s }}">{% trans "ALL" %}</a>
</li>
{% for f in filter_names %}
<li{% if request.GET.filter == f.0 %} class="active"{% endif %}>
<a href="?filter={{ f.0 }}&s={{ request.GET.s }}">{{ f.1|capfirst }}</a>
</li>
{% endfor %}
</ul>
</div>
<div class="col-md-3">
<form action="" method="GET" id="network-host-list-form">
<div class="input-group">
<input type="text" id="network-host-list-input" name="s" class="form-control"
value="{{ request.GET.s }}" placeholder="{% trans "Search..." %}"/>
<span class="input-group-btn">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</span>
<input type="hidden" name="filter" value="{{ request.GET.filter }}"/>
</div>
</form>
</div>
</div><!-- .row -->
<div class="table-responsive"> <div class="table-responsive">
{% render_table disk_table %} {% render_table disk_table %}
</div> </div>
......
...@@ -16,9 +16,10 @@ ...@@ -16,9 +16,10 @@
# with CIRCLE. If not, see <http://www.gnu.org/licenses/>. # with CIRCLE. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals, absolute_import from __future__ import unicode_literals, absolute_import
from django.db.models import Q
from django.views.generic import UpdateView from django.views.generic import UpdateView
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from sizefield.utils import filesizeformat from sizefield.utils import filesizeformat
from braces.views import SuperuserRequiredMixin from braces.views import SuperuserRequiredMixin
...@@ -43,12 +44,46 @@ class StorageDetail(SuperuserRequiredMixin, UpdateView): ...@@ -43,12 +44,46 @@ class StorageDetail(SuperuserRequiredMixin, UpdateView):
context['stats'] = self._get_stats() context['stats'] = self._get_stats()
context['missing_disks'] = ds.get_missing_disks() context['missing_disks'] = ds.get_missing_disks()
context['orphan_disks'] = ds.get_orphan_disks() context['orphan_disks'] = ds.get_orphan_disks()
qs = Disk.objects.filter(datastore=ds, destroyed=None)
context['disk_table'] = DiskListTable( context['disk_table'] = DiskListTable(
qs, request=self.request, self.get_table_data(), request=self.request,
template="django_tables2/table_no_page.html") template="django_tables2/with_pagination.html")
context['filter_names'] = (
('vm', _("virtual machine")),
('template', _("template")),
('none', _("none")),
)
return context return context
def get_table_data(self):
ds = self.get_object()
qs = Disk.objects.filter(datastore=ds, destroyed=None)
filter_name = self.request.GET.get("filter")
search = self.request.GET.get("s")
filter_queries = {
'vm': {
'instance_set__isnull': False,
},
'template': {
'template_set__isnull': False,
},
'none': {
'template_set__isnull': True,
'instance_set__isnull': True,
}
}
if filter_name:
qs = qs.filter(**filter_queries.get(filter_name, {}))
if search:
search = search.strip()
qs = qs.filter(Q(name__icontains=search) |
Q(filename__icontains=search))
return qs
def _get_stats(self): def _get_stats(self):
stats = self.object.get_statistics() stats = self.object.get_statistics()
free_space = int(stats['free_space']) free_space = int(stats['free_space'])
......
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