Skip to content

Commit

Permalink
Better performance on data center asset view. (#2640)
Browse files Browse the repository at this point in the history
* Better performance on data center asset view.
* add migration
* fix tooltip
  • Loading branch information
ar4s authored and szok committed Aug 1, 2016
1 parent ec47394 commit 3851f60
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 39 deletions.
25 changes: 20 additions & 5 deletions src/ralph/admin/filters.py
Expand Up @@ -274,10 +274,25 @@ def choices(self, cl):
},)


class TagsListFilter(TextListFilter):
"""Filter by taggit tags."""
separators = " and ".join(list(SEARCH_AND_SEPARATORS_REGEX.pattern[1:-1]))
multiple = False
class TagsListFilter(SimpleListFilter):

title = _('Tags')
parameter_name = 'tags'
separators = ' or '.join(list(SEARCH_AND_SEPARATORS_REGEX.pattern[1:-1]))
template = 'admin/filters/text_filter.html'

def lookups(self, request, model_admin):
return (
(1, _('Tags')),
)

def choices(self, cl):
yield {
'current_value': self.value() or '',
'parameter_name': self.parameter_name,
'separators': self.separators,
'multiple': True,
}

def queryset(self, request, queryset):
if self.value():
Expand Down Expand Up @@ -471,7 +486,7 @@ def lookups(self, request, model_admin):

def choices(self, cl):
yield {
'selected': self.value() or False,
'current_value': self.value() or '',
'parameter_name': self.parameter_name,
}

Expand Down
13 changes: 0 additions & 13 deletions src/ralph/admin/templates/admin/filter.html

This file was deleted.

4 changes: 3 additions & 1 deletion src/ralph/admin/templates/admin/filters/text_filter.html
@@ -1,7 +1,9 @@
{% extends "admin/filters/_filter_base.html" %}

{% block filter_after_header %}
<i data-tooltip class="has-tip fa fa-info-circle" title='Use {{ i.separators }} separators to search{% if i.multiple %} for multiple values{% endif %}'></i>
{% if i.separators %}
<i data-tooltip class="has-tip fa fa-info-circle" title='Use {{ i.separators }} separator{{ i.separators|length|pluralize }} to search{% if i.multiple %} for multiple values{% endif %}'></i>
{% endif %}
{% endblock %}

{% block filter_choices %}
Expand Down
6 changes: 5 additions & 1 deletion src/ralph/admin/templates/admin/includes/javascripts.html
Expand Up @@ -42,7 +42,11 @@
$clone.find('select').each(function(index, item) {
$(item).val($original_selects.eq(index).val());
});
$clone.appendTo($form);
$('input, select', $clone).each(function(i, item) {
var $item = $(item);
if($item.val())
$item.appendTo($form);
});
$form[0].submit();
});

Expand Down
4 changes: 0 additions & 4 deletions src/ralph/admin/tests/tests_filters.py
Expand Up @@ -182,24 +182,20 @@ def test_text_filter_contains(self):

def test_tags_filter(self):
tags_filter = TagsListFilter(
field=DataCenterAsset._meta.get_field('tags'),
request=None,
params={'tags': 'tag1 & tag2'},
model=DataCenterAsset,
model_admin=DataCenterAssetAdmin,
field_path='tags'
)
queryset = tags_filter.queryset(None, DataCenterAsset.objects.all())

self.assertEqual(len(queryset), 1)

tags_filter = TagsListFilter(
field=DataCenterAsset._meta.get_field('tags'),
request=None,
params={'tags': 'tag1'},
model=DataCenterAsset,
model_admin=DataCenterAssetAdmin,
field_path='tags'
)
queryset = tags_filter.queryset(None, DataCenterAsset.objects.all())

Expand Down
2 changes: 1 addition & 1 deletion src/ralph/back_office/admin.py
Expand Up @@ -108,7 +108,7 @@ class BackOfficeAssetAdmin(
'user__company', 'user__department', 'user__employee_id',
'property_of', 'invoice_no', 'invoice_date', 'order_no', 'provider',
'budget_info', 'depreciation_rate', 'depreciation_end_date',
'force_depreciation', LiquidatedStatusFilter, ('tags', TagsListFilter)
'force_depreciation', LiquidatedStatusFilter, TagsListFilter
]
date_hierarchy = 'created'
list_select_related = [
Expand Down
29 changes: 21 additions & 8 deletions src/ralph/data_center/admin.py
Expand Up @@ -233,8 +233,16 @@ class DataCenterAssetAdmin(
show_transition_history = True
resource_class = resources.DataCenterAssetResource
list_display = [
'hostname', 'status', 'barcode', 'model', 'sn', 'invoice_date',
'invoice_no', 'show_location', 'service_env',
'hostname',
'status',
'barcode',
'model',
'sn',
'invoice_date',
'invoice_no',
'show_location',
'service_env',
'configuration_path',
]
multiadd_summary_fields = list_display + ['rack']
one_of_mulitvalue_required = ['sn', 'barcode']
Expand All @@ -253,15 +261,20 @@ class DataCenterAssetAdmin(
'depreciation_end_date', 'force_depreciation', 'remarks',
'budget_info', 'rack', 'rack__server_room',
'rack__server_room__data_center', 'position', 'property_of',
LiquidatedStatusFilter, IPFilter,
('tags', TagsListFilter)
LiquidatedStatusFilter, IPFilter, TagsListFilter
]
date_hierarchy = 'created'
list_select_related = [
'model', 'model__manufacturer', 'model__category', 'rack',
'rack__server_room', 'rack__server_room__data_center', 'service_env',
'service_env__service', 'service_env__environment',
'configuration_path__module',
'model',
'model__manufacturer',
'model__category',
'rack',
'rack__server_room',
'rack__server_room__data_center',
'service_env',
'service_env__service',
'service_env__environment',
'configuration_path',
]
raw_id_fields = [
'model', 'rack', 'service_env', 'parent', 'budget_info',
Expand Down
3 changes: 2 additions & 1 deletion src/ralph/data_center/api/views.py
Expand Up @@ -48,7 +48,8 @@ class DataCenterAssetViewSet(BaseObjectViewSetMixin, RalphAPIViewSet):
select_related = DataCenterAssetAdmin.list_select_related + [
'service_env', 'service_env__service', 'service_env__environment',
'rack', 'rack__server_room', 'rack__server_room__data_center',
'property_of', 'budget_info', 'content_type'
'property_of', 'budget_info', 'content_type',
'configuration_path__module'
]
prefetch_related = base_object_descendant_prefetch_related + [
'connections',
Expand Down
19 changes: 19 additions & 0 deletions src/ralph/data_center/migrations/0018_auto_20160729_1401.py
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('data_center', '0017_auto_20160719_1530'),
]

operations = [
migrations.AlterField(
model_name='rack',
name='server_room',
field=models.ForeignKey(verbose_name='server room', null=True, to='data_center.ServerRoom'),
),
]
8 changes: 7 additions & 1 deletion src/ralph/data_center/models/physical.py
Expand Up @@ -112,6 +112,11 @@ def __str__(self):
return self.name


class ServerRoomManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('data_center')


class ServerRoom(NamedMixin.NonUnique, models.Model):
_allow_in_dashboard = True

Expand All @@ -126,6 +131,7 @@ class ServerRoom(NamedMixin.NonUnique, models.Model):
verbose_name=_('visualization grid rows number'),
default=20,
)
objects = ServerRoomManager()

def __str__(self):
return '{} ({})'.format(self.name, self.data_center.name)
Expand Down Expand Up @@ -172,7 +178,7 @@ class Rack(AdminAbsoluteUrlMixin, NamedMixin.NonUnique, models.Model):
server_room = models.ForeignKey(
ServerRoom, verbose_name=_('server room'),
null=True,
blank=True,
blank=False,
)
server_room._autocomplete = False
server_room._filter_title = _('server room')
Expand Down
16 changes: 16 additions & 0 deletions src/ralph/data_center/tests/test_view.py
@@ -0,0 +1,16 @@
from django.core.urlresolvers import reverse
from django.test import RequestFactory, TestCase

from ralph.data_center.tests.factories import DataCenterAssetFullFactory
from ralph.tests.mixins import ClientMixin, ReloadUrlsMixin


class DataCentrAssetViewTest(ClientMixin, TestCase):
def test_changelist_view(self):
self.login_as_user()
DataCenterAssetFullFactory.create_batch(10)
with self.assertNumQueries(16):
self.client.get(
reverse('admin:data_center_datacenterasset_changelist'),
)

6 changes: 5 additions & 1 deletion src/ralph/lib/mixins/models.py
Expand Up @@ -66,9 +66,13 @@ def save(self, update_last_seen=False, *args, **kwargs):

class AdminAbsoluteUrlMixin(object):
def get_absolute_url(self):
opts = self._meta
# support for proxy
if opts.proxy:
opts = opts.concrete_model._meta
return reverse(
'admin:{}_{}_change'.format(
self._meta.app_label, self._meta.model_name
opts.app_label, opts.model_name
), args=(self.pk,)
)

Expand Down
2 changes: 2 additions & 0 deletions src/ralph/lib/polymorphic/models.py
Expand Up @@ -149,6 +149,8 @@ def __new__(cls, name, bases, attrs):
for polymorphic_class in base_polymorphic:
# Set is_polymorphic flag for classes that use polymorphic
polymorphic_class.is_polymorphic = True
if new_class._meta.proxy:
continue
try:
polymorphic_class._polymorphic_descendants.append(new_class)
except AttributeError:
Expand Down
2 changes: 1 addition & 1 deletion src/ralph/licences/admin.py
Expand Up @@ -69,7 +69,7 @@ class LicenceAdmin(
'niw', 'sn', 'remarks', 'software', 'property_of',
'licence_type', 'valid_thru', 'order_no', 'invoice_no', 'invoice_date',
'budget_info', 'manufacturer', 'region', 'office_infrastructure',
('tags', TagsListFilter)
TagsListFilter
]
date_hierarchy = 'created'
list_display = [
Expand Down
2 changes: 1 addition & 1 deletion src/ralph/supports/admin.py
Expand Up @@ -44,7 +44,7 @@ class SupportAdmin(
list_filter = [
'contract_id', 'name', 'serial_no', 'price', 'remarks', 'description',
'support_type', 'budget_info', 'date_from', 'date_to', 'property_of',
('tags', TagsListFilter)
TagsListFilter
]
date_hierarchy = 'created'
list_display = [
Expand Down
2 changes: 1 addition & 1 deletion src/ralph/virtual/admin.py
Expand Up @@ -70,7 +70,7 @@ class VirtualServerAdmin(
search_fields = ['hostname', 'sn']
list_filter = [
'sn', 'hostname', 'service_env', IPFilter,
'parent', ('tags', TagsListFilter),
'parent', TagsListFilter,
('configuration_path__module', TreeRelatedAutocompleteFilterWithDescendants) # noqa
]
list_display = [
Expand Down

0 comments on commit 3851f60

Please sign in to comment.