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:
Pierre-Alexandre Bardina 2017-02-01 10:07:54 +00:00
parent f8291137d5
commit 7bbf02e8d7
4 changed files with 116 additions and 11 deletions

View File

@ -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):

View File

@ -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"

View File

@ -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>

View File

@ -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