From 7bbf02e8d7e50c3c30d27cc22a8ff2a085fe744f Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Bardina Date: Wed, 1 Feb 2017 10:07:54 +0000 Subject: [PATCH] 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 --- .../dashboards/admin/hashmap/forms.py | 81 ++++++++++++++++--- .../dashboards/admin/hashmap/tables.py | 4 + .../templates/hashmap/service_details.html | 7 ++ .../dashboards/admin/hashmap/views.py | 35 +++++++- 4 files changed, 116 insertions(+), 11 deletions(-) diff --git a/cloudkittydashboard/dashboards/admin/hashmap/forms.py b/cloudkittydashboard/dashboards/admin/hashmap/forms.py index d15a989..e9d3234 100644 --- a/cloudkittydashboard/dashboards/admin/hashmap/forms.py +++ b/cloudkittydashboard/dashboards/admin/hashmap/forms.py @@ -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): diff --git a/cloudkittydashboard/dashboards/admin/hashmap/tables.py b/cloudkittydashboard/dashboards/admin/hashmap/tables.py index 1cd48e8..ab57b87 100644 --- a/cloudkittydashboard/dashboards/admin/hashmap/tables.py +++ b/cloudkittydashboard/dashboards/admin/hashmap/tables.py @@ -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" diff --git a/cloudkittydashboard/dashboards/admin/hashmap/templates/hashmap/service_details.html b/cloudkittydashboard/dashboards/admin/hashmap/templates/hashmap/service_details.html index 338be43..6573875 100644 --- a/cloudkittydashboard/dashboards/admin/hashmap/templates/hashmap/service_details.html +++ b/cloudkittydashboard/dashboards/admin/hashmap/templates/hashmap/service_details.html @@ -5,6 +5,13 @@ {% block main %}
+ +{% if service_period %} + {% blocktrans with service_period as period %} +

Usage data are collected every {{ period }} seconds.

+ {% endblocktrans %} +{% endif %} + {{ tab_group.render }}
diff --git a/cloudkittydashboard/dashboards/admin/hashmap/views.py b/cloudkittydashboard/dashboards/admin/hashmap/views.py index 87363f8..0017930 100644 --- a/cloudkittydashboard/dashboards/admin/hashmap/views.py +++ b/cloudkittydashboard/dashboards/admin/hashmap/views.py @@ -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