Skip to content

Commit

Permalink
Merge pull request #2135 from mkurek/cloud
Browse files Browse the repository at this point in the history
Cloud admin improvements
  • Loading branch information
mkurek committed Dec 29, 2015
2 parents ea2e770 + 44a1b56 commit d92c4e8
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 16 deletions.
15 changes: 14 additions & 1 deletion src/ralph/admin/filters.py
Expand Up @@ -16,6 +16,7 @@
from django.utils.translation import ugettext_lazy as _
from mptt.fields import TreeForeignKey
from mptt.settings import DEFAULT_LEVEL_INDICATOR
from taggit.managers import TaggableManager

from ralph.admin.autocomplete import DETAIL_PARAM, QUERY_PARAM
from ralph.admin.helpers import get_field_by_relation_path
Expand Down Expand Up @@ -254,6 +255,17 @@ def choices(self, cl):
},)


class TagsListFilter(TextListFilter):

"""Filter by taggit tags."""

def queryset(self, request, queryset):
if self.value():
return queryset.filter(tags__name__in=SEARCH_SEPARATORS_REGEX.split(
self.value()
))


class RelatedFieldListFilter(ChoicesListFilter):
"""
Filter for related fields (ForeignKeys) which is displayed as regular HTML
Expand Down Expand Up @@ -425,7 +437,7 @@ def register_custom_filters():
),
(
lambda f: (
isinstance(f, TreeForeignKey) and
isinstance(f, models.ForeignKey) and
not getattr(f, '_autocomplete', True)
),
RelatedFieldListFilter
Expand All @@ -434,6 +446,7 @@ def register_custom_filters():
lambda f: isinstance(f, models.ForeignKey),
RelatedAutocompleteFieldListFilter
),
(lambda f: isinstance(f, TaggableManager), TagsListFilter),
]

for func, filter_class in field_filter_mapper:
Expand Down
18 changes: 18 additions & 0 deletions src/ralph/admin/tests/tests_filters.py
Expand Up @@ -11,6 +11,7 @@
LiquidatedStatusFilter,
NumberListFilter,
RelatedFieldListFilter,
TagsListFilter,
TextListFilter
)
from ralph.data_center.admin import DataCenterAssetAdmin
Expand Down Expand Up @@ -39,16 +40,19 @@ def setUpClass(cls):
barcode='barcode_one',
status=DataCenterAssetStatus.new,
)
cls.dca_1.tags.add('tag_1')
cls.dca_2 = DataCenterAssetFactory(
invoice_date=datetime.date(2015, 2, 1),
barcode='barcode_two',
status=DataCenterAssetStatus.liquidated,
)
cls.dca_2.tags.add('tag_1')
cls.dca_3 = DataCenterAssetFactory(
invoice_date=datetime.date(2015, 3, 1),
force_depreciation=True,
status=DataCenterAssetStatus.used,
)
cls.dca_3.tags.add('tag_2')
cls.dca_4 = DataCenterAssetFactory(
rack=RackFactory()
)
Expand Down Expand Up @@ -282,3 +286,17 @@ def test_liquidated_status_filter(self):
None, DataCenterAsset.objects.all()
)
self.assertEqual(3, queryset.count())

def test_tags_filter(self):
tags_filter = TagsListFilter(
field=Support._meta.get_field('tags'),
request=None,
params={'tags': 'tag_1'},
model=DataCenterAsset,
model_admin=DataCenterAssetAdmin,
field_path='tags',
)
queryset = tags_filter.queryset(None, DataCenterAsset.objects.all())
self.assertEqual(queryset.count(), 2)
self.assertIn(self.dca_1, queryset)
self.assertIn(self.dca_2, queryset)
35 changes: 21 additions & 14 deletions src/ralph/virtual/admin.py
Expand Up @@ -4,7 +4,6 @@

from ralph.admin import RalphAdmin, RalphTabularInline, register
from ralph.data_center.models.networks import IPAddress
from ralph.data_center.models.physical import DataCenterAsset
from ralph.virtual.models import (
CloudFlavor,
CloudHost,
Expand All @@ -25,8 +24,7 @@ class CloudHostTabularInline(RalphTabularInline):
fk_name = 'parent'
fields = ['get_hostname', 'get_hypervisor', 'get_ipaddresses', 'created',
'tags', 'remarks']
readonly_fields = ['created', 'get_hostname', 'get_hypervisor',
'get_ipaddresses', 'host_id']
readonly_fields = fields

def get_hostname(self, obj):
return '<a href="{}">{}</a>'.format(
Expand All @@ -40,9 +38,11 @@ def get_hypervisor(self, obj):
if obj.hypervisor is None:
return _('Not set')
return '<a href="{}">{}</a>'.format(
reverse("admin:data_center_datacenterasset_change",
args=(obj.hypervisor.id,)),
DataCenterAsset.objects.get(pk=obj.hypervisor).hostname
reverse(
"admin:data_center_datacenterasset_change",
args=(obj.hypervisor.id,)
),
obj.hypervisor.hostname
)
get_hypervisor.short_description = _('Hypervisor')
get_hypervisor.allow_tags = True
Expand All @@ -54,6 +54,13 @@ def get_ipaddresses(self, obj):
def has_add_permission(self, request, obj=None):
return False

def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).select_related(
'hypervisor',
).prefetch_related(
'ipaddress_set', 'tags'
)


class CloudNetworkInline(RalphTabularInline):
can_delete = False
Expand All @@ -66,13 +73,13 @@ def has_add_permission(self, request, obj=None):

@register(CloudHost)
class CloudHostAdmin(RalphAdmin):
list_display = ['hostname', 'get_ip_addresses', 'get_hypervisor',
'get_cloudproject', 'get_cloudprovider',
'cloudflavor_name', 'host_id', 'created', 'image_name',
'get_tags']
list_filter = ['service_env', 'cloudflavor']
list_display = ['hostname', 'get_ip_addresses', 'service_env',
'get_cloudproject', 'cloudflavor_name', 'host_id',
'created', 'image_name', 'get_tags']
list_filter = ['cloudprovider', 'service_env', 'cloudflavor', 'tags']
list_select_related = [
'cloudflavor', 'cloudprovider', 'hypervisor', 'parent__cloudproject'
'cloudflavor', 'cloudprovider', 'parent__cloudproject',
'service_env__service', 'service_env__environment'
]
readonly_fields = ['cloudflavor_name', 'created', 'hostname', 'host_id',
'get_cloudproject', 'get_cloudprovider',
Expand Down Expand Up @@ -105,7 +112,7 @@ def has_delete_permission(self, request, obj=None):
return False

def get_tags(self, obj):
return ','.join(obj.tags.names())
return ','.join([tag.name for tag in obj.tags.all()])
get_tags.short_description = _('Tags')

def get_cloudprovider(self, obj):
Expand Down Expand Up @@ -144,7 +151,7 @@ def cloudflavor_name(self, obj):
cloudflavor_name.allow_tags = True

def get_ip_addresses(self, obj):
return ', '.join([ip.address for ip in obj.ipaddress_set.all()])
return '\n'.join(obj.ip_addresses)
get_ip_addresses.short_description = _('IP Addresses')

def get_cloudproject(self, obj):
Expand Down
4 changes: 3 additions & 1 deletion src/ralph/virtual/models.py
Expand Up @@ -128,6 +128,8 @@ def save(self, *args, **kwargs):

cloudflavor = models.ForeignKey(CloudFlavor, verbose_name='Instance Type')
cloudprovider = models.ForeignKey(CloudProvider)
cloudprovider._autocomplete = False

host_id = models.CharField(unique=True, max_length=100)
hostname = models.CharField(max_length=100)
hypervisor = models.ForeignKey(DataCenterAsset, blank=True, null=True)
Expand All @@ -142,7 +144,7 @@ def __str__(self):

@property
def ip_addresses(self):
return self.ipaddress_set.values_list('address', flat=True)
return [ip.address for ip in self.ipaddress_set.all()]

@ip_addresses.setter
def ip_addresses(self, value):
Expand Down

0 comments on commit d92c4e8

Please sign in to comment.