User experience improvement on hashmap's forms
Change the input when creating services and fields in hashmap. Now, there is a select input with services or fields obtained from the api. Change-Id: Ibba803b84c525c4471ac60ca2b9cabce3ebbb05c
This commit is contained in:
parent
f8291137d5
commit
7bbf02e8d7
|
@ -17,6 +17,7 @@ import logging
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from horizon import forms
|
from horizon import forms
|
||||||
|
|
||||||
|
from cloudkittyclient.apiclient import exceptions
|
||||||
from cloudkittydashboard.api import cloudkitty as api
|
from cloudkittydashboard.api import cloudkitty as api
|
||||||
from cloudkittydashboard.dashboards import common
|
from cloudkittydashboard.dashboards import common
|
||||||
|
|
||||||
|
@ -26,26 +27,88 @@ LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class CreateServiceForm(forms.SelfHandlingForm):
|
class CreateServiceForm(forms.SelfHandlingForm):
|
||||||
name = forms.CharField(label=_("Name"))
|
services_choices = [("service", _("Service")),
|
||||||
|
("custom_service", _("Custom service"))]
|
||||||
|
service_type = forms.ChoiceField(
|
||||||
|
label=_("Service type"),
|
||||||
|
choices=services_choices,
|
||||||
|
widget=forms.Select(attrs={
|
||||||
|
'class': 'switchable',
|
||||||
|
'data-slug': 'servicetype'}),
|
||||||
|
required=True)
|
||||||
|
service = forms.DynamicChoiceField(
|
||||||
|
label=_("Service"),
|
||||||
|
help_text=_("Services are provided by main collector."),
|
||||||
|
widget=forms.Select(attrs={
|
||||||
|
'class': 'switched',
|
||||||
|
'data-switch-on': 'servicetype',
|
||||||
|
'data-servicetype-service': _('Service')}),
|
||||||
|
required=False)
|
||||||
|
custom_service = forms.CharField(
|
||||||
|
label=_("Custom service"),
|
||||||
|
help_text=_("Custom services can be defined for any "
|
||||||
|
"additional collector."),
|
||||||
|
widget=forms.widgets.TextInput(attrs={
|
||||||
|
'class': 'switched',
|
||||||
|
'data-switch-on': 'servicetype',
|
||||||
|
'data-servicetype-custom_service': _('Custom service')}),
|
||||||
|
required=False)
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
name = data['name']
|
if data['service_type'] == 'service':
|
||||||
LOG.info('Creating service with name %s' % (name))
|
service = data['service']
|
||||||
return api.cloudkittyclient(request).hashmap.services.create(name=name)
|
else:
|
||||||
|
service = data['custom_service']
|
||||||
|
services_mgr = api.cloudkittyclient(request).hashmap.services
|
||||||
|
LOG.info('Creating service with name %s' % (service))
|
||||||
|
return services_mgr.create(name=service)
|
||||||
|
|
||||||
|
def __init__(self, request, *args, **kwargs):
|
||||||
|
super(CreateServiceForm, self).__init__(request, *args, **kwargs)
|
||||||
|
services = api.cloudkittyclient(request).service_info.list()
|
||||||
|
services = api.identify(services)
|
||||||
|
choices = sorted([(s.service_id, s.service_id) for s in services])
|
||||||
|
self.fields['service'].choices = choices
|
||||||
|
|
||||||
|
|
||||||
class CreateFieldForm(forms.SelfHandlingForm, common.OrderFieldsMixin):
|
class CreateFieldForm(forms.SelfHandlingForm, common.OrderFieldsMixin):
|
||||||
service_id = forms.CharField(label=_("Service ID"),
|
service_id = forms.CharField(label=_("Service ID"),
|
||||||
widget=forms.TextInput(
|
widget=forms.TextInput(
|
||||||
attrs={'readonly': 'readonly'}))
|
attrs={'readonly': 'readonly'}))
|
||||||
name = forms.CharField(label=_("Name"))
|
service_name = forms.CharField(label=_("Service Name"),
|
||||||
|
widget=forms.TextInput(
|
||||||
|
attrs={'readonly': 'readonly'}))
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
name = data['name']
|
|
||||||
service_id = data['service_id']
|
service_id = data['service_id']
|
||||||
LOG.info('Creating field with name %s' % (name))
|
field = data['field']
|
||||||
|
LOG.info('Creating field with name %s' % (field))
|
||||||
fields_mgr = api.cloudkittyclient(request).hashmap.fields
|
fields_mgr = api.cloudkittyclient(request).hashmap.fields
|
||||||
return fields_mgr.create(name=name, service_id=service_id)
|
return fields_mgr.create(name=field, service_id=service_id)
|
||||||
|
|
||||||
|
def __init__(self, request, *args, **kwargs):
|
||||||
|
super(CreateFieldForm, self).__init__(request, *args, **kwargs)
|
||||||
|
service_id = kwargs['initial']['service_id']
|
||||||
|
manager = api.cloudkittyclient(request)
|
||||||
|
service = manager.hashmap.services.get(service_id=service_id)
|
||||||
|
self.fields['service_name'].initial = service.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
fields = manager.service_info.get(service_id=service.name)
|
||||||
|
except exceptions.NotFound:
|
||||||
|
fields = None
|
||||||
|
|
||||||
|
if fields:
|
||||||
|
fields = api.identify(fields)
|
||||||
|
choices = sorted([(field, field) for field in fields.metadata])
|
||||||
|
self.fields['field'] = forms.DynamicChoiceField(
|
||||||
|
label=_("Field"),
|
||||||
|
required=True)
|
||||||
|
self.fields['field'].choices = choices
|
||||||
|
else:
|
||||||
|
self.fields['field'] = forms.CharField(
|
||||||
|
label=_("Field"),
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
|
||||||
class CreateGroupForm(forms.SelfHandlingForm):
|
class CreateGroupForm(forms.SelfHandlingForm):
|
||||||
|
|
|
@ -51,6 +51,10 @@ class ServicesTable(tables.DataTable):
|
||||||
"""
|
"""
|
||||||
name = tables.Column('name', verbose_name=_("Name"),
|
name = tables.Column('name', verbose_name=_("Name"),
|
||||||
link='horizon:admin:hashmap:service')
|
link='horizon:admin:hashmap:service')
|
||||||
|
unit = tables.Column("unit", verbose_name=_("Unit"))
|
||||||
|
|
||||||
|
def get_object_id(self, datum):
|
||||||
|
return datum['id']
|
||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
name = "services"
|
name = "services"
|
||||||
|
|
|
@ -5,6 +5,13 @@
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<div class="row-fluid">
|
<div class="row-fluid">
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
|
|
||||||
|
{% if service_period %}
|
||||||
|
{% blocktrans with service_period as period %}
|
||||||
|
<p>Usage data are collected every {{ period }} seconds.</p>
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{{ tab_group.render }}
|
{{ tab_group.render }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -21,6 +21,7 @@ from horizon import tables
|
||||||
from horizon import tabs
|
from horizon import tabs
|
||||||
from horizon import views
|
from horizon import views
|
||||||
|
|
||||||
|
from cloudkittyclient.apiclient import exceptions
|
||||||
from cloudkittydashboard.api import cloudkitty as api
|
from cloudkittydashboard.api import cloudkitty as api
|
||||||
from cloudkittydashboard.dashboards.admin.hashmap import forms as hashmap_forms
|
from cloudkittydashboard.dashboards.admin.hashmap import forms as hashmap_forms
|
||||||
from cloudkittydashboard.dashboards.admin.hashmap \
|
from cloudkittydashboard.dashboards.admin.hashmap \
|
||||||
|
@ -32,8 +33,23 @@ class IndexView(tables.DataTableView):
|
||||||
template_name = "admin/hashmap/services_list.html"
|
template_name = "admin/hashmap/services_list.html"
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
out = api.cloudkittyclient(self.request).hashmap.services.list()
|
manager = api.cloudkittyclient(self.request)
|
||||||
return api.identify(out)
|
services = manager.hashmap.services.list()
|
||||||
|
services = sorted(services, key=lambda service: service.name)
|
||||||
|
list_services = []
|
||||||
|
for s in services:
|
||||||
|
try:
|
||||||
|
service = manager.service_info.get(service_id=s.name)
|
||||||
|
unit = service.unit
|
||||||
|
except exceptions.NotFound:
|
||||||
|
unit = "-"
|
||||||
|
|
||||||
|
list_services.append({
|
||||||
|
"id": s.service_id,
|
||||||
|
"name": s.name,
|
||||||
|
"unit": unit
|
||||||
|
})
|
||||||
|
return list_services
|
||||||
|
|
||||||
|
|
||||||
class ServiceView(tabs.TabbedTableView):
|
class ServiceView(tabs.TabbedTableView):
|
||||||
|
@ -48,6 +64,21 @@ class ServiceView(tabs.TabbedTableView):
|
||||||
self.page_title = "Hashmap Service : %s" % service.name
|
self.page_title = "Hashmap Service : %s" % service.name
|
||||||
return super(ServiceView, self).get(*args, **kwargs)
|
return super(ServiceView, self).get(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(ServiceView, self).get_context_data(**kwargs)
|
||||||
|
manager = api.cloudkittyclient(self.request)
|
||||||
|
service = manager.hashmap.services.get(
|
||||||
|
service_id=kwargs['service_id']
|
||||||
|
)
|
||||||
|
config = manager.config.get_config()
|
||||||
|
period = None
|
||||||
|
|
||||||
|
if service.name in config['collect']['services']:
|
||||||
|
period = config['collect']['period']
|
||||||
|
|
||||||
|
context["service_period"] = period
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ServiceCreateView(forms.ModalFormView):
|
class ServiceCreateView(forms.ModalFormView):
|
||||||
form_class = hashmap_forms.CreateServiceForm
|
form_class = hashmap_forms.CreateServiceForm
|
||||||
|
|
Loading…
Reference in New Issue