UI: Actions screen improvements

* added pagination:  adressed all comments given to Liat on:
  https://review.openstack.org/#/c/266826/
* removed redundant template inheritance
* resolved bug: [ui] Pagination is absent in the "Actions" tab
* resolved bug: [ui] Every click on "Actions" tab takes too much time
* resolved bug: [ui] Problem with "Actions" page layout

Screenshots:
  http://pasteboard.co/1yhuS10g.png

Partially implements blueprint: Actions-screen-improvements
Closes-Bug: #1505657
Closes-Bug: #1505668
Closes-Bug: #1505662

Change-Id: I4c15e39830ca425a8321b09e7d6039e6623eea8b
This commit is contained in:
Gal Margalit 2016-02-14 16:59:15 +00:00
parent 79d53e818b
commit ff8e684d84
10 changed files with 84 additions and 35 deletions

View File

@ -90,9 +90,18 @@ class ActionsTable(tables.DataTable):
verbose_name=_("Name"),
link="horizon:mistral:actions:detail"
)
is_system = tables.Column("is_system", verbose_name=_("Is System"))
tags = tables.Column(tags_to_string, verbose_name=_("Tags"))
inputs = tables.Column(cut, verbose_name=_("Input"))
is_system = tables.Column(
"is_system",
verbose_name=_("Is System")
)
tags = tables.Column(
tags_to_string,
verbose_name=_("Tags")
)
inputs = tables.Column(
cut,
verbose_name=_("Input")
)
created = tables.Column(
"created_at",
verbose_name=_("Created"),
@ -110,9 +119,6 @@ class ActionsTable(tables.DataTable):
)
)
def get_object_id(self, datum):
return datum.name
class Meta(object):
name = "actions"
verbose_name = _("Actions")

View File

@ -1,11 +1,7 @@
{% extends 'mistral/default/base.html' %}
{% extends 'mistral/default/table.html' %}
{% load i18n %}
{% block title %}{% trans "Actions" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Actions") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}
{% endblock page_header %}

View File

@ -49,11 +49,59 @@ class UpdateView(forms.ModalFormView):
class IndexView(tables.DataTableView):
table_id = "workflow_action"
table_class = ActionsTable
template_name = 'mistral/actions/index.html'
def has_prev_data(self, table):
return self._prev
def has_more_data(self, table):
return self._more
def get_data(self):
return api.action_list(self.request)
actions = []
prev_marker = self.request.GET.get(
ActionsTable._meta.prev_pagination_param,
None
)
if prev_marker is not None:
sort_dir = 'asc'
marker = prev_marker
else:
sort_dir = 'desc'
marker = self.request.GET.get(
ActionsTable._meta.pagination_param,
None
)
try:
actions, self._more, self._prev = api.pagination_list(
entity="actions",
request=self.request,
marker=marker,
sort_keys='name',
sort_dirs=sort_dir,
paginate=True
)
if prev_marker is not None:
actions = sorted(
actions,
key=lambda action: getattr(
action, 'name'
),
reverse=True
)
except Exception as e:
self._prev = False
self._more = False
msg = _('Unable to retrieve actions list: %s') % str(e)
exceptions.handle(self.request, msg)
return actions
class DetailView(generic.TemplateView):

View File

@ -48,15 +48,16 @@ def mistralclient(request):
@handle_errors(_("Unable to retrieve list"), [])
def pagination_list(entity, request, marker='', sort_keys='',
sort_dirs='', paginate=False):
sort_dirs='asc', paginate=False):
"""Retrieve a listing of specific entity and handles pagination.
:param entity: Requested entity (String)
:param request: Request data
:param marker: Pagination marker for large data sets: entity id
:param sort_keys: Columns to sort results by. Default: created_at
:param sort_keys: Columns to sort results by
:param sort_dirs: Sorting Directions (asc/desc). Default:asc
:param paginate: If true will perform pagination based on settings
:param paginate: If true will perform pagination based on settings.
Default:False
"""
limit = getattr(settings, 'API_RESULT_LIMIT', 1000)
@ -67,8 +68,8 @@ def pagination_list(entity, request, marker='', sort_keys='',
else:
request_size = limit
request = mistralclient(request)
entities_iter = (eval('request.%s' % entity)).list(
api = mistralclient(request)
entities_iter = getattr(api, entity).list(
marker, limit, sort_keys, sort_dirs
)

View File

@ -1,5 +1,7 @@
{% extends 'mistral/default/base.html' %}
{% block main %}
<div class="mistral-wrapper">
{{ table.render }}
</div>
{% endblock %}

View File

@ -1,11 +1,7 @@
{% extends 'mistral/default/base.html' %}
{% extends 'mistral/default/table.html' %}
{% load i18n %}
{% block title %}{% trans "Executions" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Executions") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -1,3 +1,11 @@
.list{
list-style: inherit;
}
.mistral-wrapper #actions{
width:100%;
}
.mistral-wrapper #actions a.btn{
width:inherit;
}

View File

@ -1,11 +1,7 @@
{% extends 'mistral/default/base.html' %}
{% extends 'mistral/default/table.html' %}
{% load i18n %}
{% block title %}{% trans "Workbooks" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Workbooks") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -50,8 +50,8 @@ class ExecuteForm(forms.SelfHandlingForm):
messages.success(request, msg)
return True
except Exception:
msg = _('Failed to execute workflow "%s".') % data['workflow_name']
except Exception as e:
msg = _('Failed to execute workflow "%s".') % e
redirect = reverse('horizon:mistral:workflows:index')
exceptions.handle(request, msg, redirect=redirect)

View File

@ -1,11 +1,7 @@
{% extends 'mistral/default/base.html' %}
{% extends 'mistral/default/table.html' %}
{% load i18n %}
{% block title %}{% trans "Workflows" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Workflows") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}