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 horizon import forms
from cloudkittyclient.apiclient import exceptions
from cloudkittydashboard.api import cloudkitty as api
from cloudkittydashboard.dashboards import common
@ -26,26 +27,88 @@ LOG = logging.getLogger(__name__)
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):
name = data['name']
LOG.info('Creating service with name %s' % (name))
return api.cloudkittyclient(request).hashmap.services.create(name=name)
if data['service_type'] == 'service':
service = data['service']
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):
service_id = forms.CharField(label=_("Service ID"),
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
name = forms.CharField(label=_("Name"))
attrs={'readonly': 'readonly'}))
service_name = forms.CharField(label=_("Service Name"),
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
def handle(self, request, data):
name = data['name']
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
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):

View File

@ -51,6 +51,10 @@ class ServicesTable(tables.DataTable):
"""
name = tables.Column('name', verbose_name=_("Name"),
link='horizon:admin:hashmap:service')
unit = tables.Column("unit", verbose_name=_("Unit"))
def get_object_id(self, datum):
return datum['id']
class Meta(object):
name = "services"

View File

@ -5,6 +5,13 @@
{% block main %}
<div class="row-fluid">
<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 }}
</div>
</div>

View File

@ -21,6 +21,7 @@ from horizon import tables
from horizon import tabs
from horizon import views
from cloudkittyclient.apiclient import exceptions
from cloudkittydashboard.api import cloudkitty as api
from cloudkittydashboard.dashboards.admin.hashmap import forms as hashmap_forms
from cloudkittydashboard.dashboards.admin.hashmap \
@ -32,8 +33,23 @@ class IndexView(tables.DataTableView):
template_name = "admin/hashmap/services_list.html"
def get_data(self):
out = api.cloudkittyclient(self.request).hashmap.services.list()
return api.identify(out)
manager = api.cloudkittyclient(self.request)
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):
@ -48,6 +64,21 @@ class ServiceView(tabs.TabbedTableView):
self.page_title = "Hashmap Service : %s" % service.name
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):
form_class = hashmap_forms.CreateServiceForm