UI: table pagination logic encapsulation
* following https://review.openstack.org/#/c/266826/ suggestion: API requests that required UI pagination will be passed via generic handler. * At first I've written a decorator - which I didn't like, feel faulty by design - too many returns and over complicated blocks... Partially implements blueprint: mistral-dashboard-executions-screen Change-Id: Ie131bf74a74b816d2779888c6c23e7bcfa4b8f22
This commit is contained in:
parent
e9fa1ef7e5
commit
40222407bf
|
@ -46,19 +46,14 @@ def mistralclient(request):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def execution_create(request, **data):
|
@handle_errors(_("Unable to retrieve list"), [])
|
||||||
"""Creates new execution."""
|
def pagination_list(entity, request, marker='', sort_keys='',
|
||||||
|
sort_dirs='', paginate=False):
|
||||||
return mistralclient(request).executions.create(**data)
|
"""Retrieve a listing of specific entity and handles pagination.
|
||||||
|
|
||||||
|
|
||||||
@handle_errors(_("Unable to retrieve executions."), [])
|
|
||||||
def execution_list(request, marker='', sort_keys='',
|
|
||||||
sort_dirs='', paginate=False):
|
|
||||||
"""Retrieve a listing of executions.
|
|
||||||
|
|
||||||
|
:param entity: Requested entity (String)
|
||||||
:param request: Request data
|
:param request: Request data
|
||||||
:param marker: Pagination marker for large data sets: execution id
|
: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. Default: created_at
|
||||||
:param sort_dirs: Sorting Directions (asc/desc). Default:asc
|
: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
|
||||||
|
@ -72,17 +67,18 @@ def execution_list(request, marker='', sort_keys='',
|
||||||
else:
|
else:
|
||||||
request_size = limit
|
request_size = limit
|
||||||
|
|
||||||
executions_iter = mistralclient(request).executions.list(
|
request = mistralclient(request)
|
||||||
|
entities_iter = (eval('request.%s' % entity)).list(
|
||||||
marker, limit, sort_keys, sort_dirs
|
marker, limit, sort_keys, sort_dirs
|
||||||
)
|
)
|
||||||
|
|
||||||
has_prev_data = has_more_data = False
|
has_prev_data = has_more_data = False
|
||||||
|
|
||||||
if paginate:
|
if paginate:
|
||||||
executions = list(itertools.islice(executions_iter, request_size))
|
entities = list(itertools.islice(entities_iter, request_size))
|
||||||
# first and middle page condition
|
# first and middle page condition
|
||||||
if len(executions) > page_size:
|
if len(entities) > page_size:
|
||||||
executions.pop(-1)
|
entities.pop(-1)
|
||||||
has_more_data = True
|
has_more_data = True
|
||||||
# middle page condition
|
# middle page condition
|
||||||
if marker is not None:
|
if marker is not None:
|
||||||
|
@ -94,9 +90,15 @@ def execution_list(request, marker='', sort_keys='',
|
||||||
elif marker is not None:
|
elif marker is not None:
|
||||||
has_prev_data = True
|
has_prev_data = True
|
||||||
else:
|
else:
|
||||||
executions = list(executions_iter)
|
entities = list(entities_iter)
|
||||||
|
|
||||||
return executions, has_more_data, has_prev_data
|
return entities, has_more_data, has_prev_data
|
||||||
|
|
||||||
|
|
||||||
|
def execution_create(request, **data):
|
||||||
|
"""Creates new execution."""
|
||||||
|
|
||||||
|
return mistralclient(request).executions.create(**data)
|
||||||
|
|
||||||
|
|
||||||
def execution_get(request, execution_id):
|
def execution_get(request, execution_id):
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
</p>
|
</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>
|
<p>
|
||||||
<strong class="block">
|
<strong>
|
||||||
{% trans "Please note" %}:
|
{% trans "Please note" %}:
|
||||||
</strong>
|
</strong>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
|
@ -26,7 +26,7 @@ class ExecutionsTest(test.TestCase):
|
||||||
|
|
||||||
def test_index(self):
|
def test_index(self):
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
mock.patch('mistraldashboard.api.execution_list',
|
mock.patch('mistraldashboard.api.pagination_list',
|
||||||
return_value=self.mistralclient_executions.list()),):
|
return_value=self.mistralclient_executions.list()),):
|
||||||
res = self.client.get(INDEX_URL)
|
res = self.client.get(INDEX_URL)
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,8 @@ class IndexView(tables.DataTableView):
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
executions, self._more, self._prev = api.execution_list(
|
executions, self._more, self._prev = api.pagination_list(
|
||||||
|
entity="executions",
|
||||||
request=self.request,
|
request=self.request,
|
||||||
marker=marker,
|
marker=marker,
|
||||||
sort_dirs=sort_dir,
|
sort_dirs=sort_dir,
|
||||||
|
|
Loading…
Reference in New Issue