From 91c190837cbae06e1f060139f875ffb32f2bdaa2 Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Sun, 6 Sep 2020 11:40:13 -0400 Subject: [PATCH] UI: Add pagination for playbook results This will allow larger playbooks to load much faster without needing to return and render all of a playbook's results on a single page. Fixes: https://github.com/ansible-community/ara/issues/168 Change-Id: I5fcf8bc411bc6da946fdd5ce23325b2b11a7197a --- ara/ui/templates/playbook.html | 5 ++++- ara/ui/views.py | 24 +++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ara/ui/templates/playbook.html b/ara/ui/templates/playbook.html index ac2b241c..877823d6 100644 --- a/ara/ui/templates/playbook.html +++ b/ara/ui/templates/playbook.html @@ -101,6 +101,9 @@
Task results + {% if not static_generation %} + {% include "partials/pagination.html" with data=results %} + {% endif %} @@ -117,7 +120,7 @@ - {% for result in results %} + {% for result in results.results %}
{% include "partials/result_status_icon.html" with status=result.status %} diff --git a/ara/ui/views.py b/ara/ui/views.py index 00fe5623..71b94930 100644 --- a/ara/ui/views.py +++ b/ara/ui/views.py @@ -65,6 +65,7 @@ class Playbook(generics.RetrieveAPIView): queryset = models.Playbook.objects.all() renderer_classes = [TemplateHTMLRenderer] + pagination_class = LimitOffsetPaginationWithLinks template_name = "playbook.html" def get(self, request, *args, **kwargs): @@ -78,15 +79,27 @@ class Playbook(generics.RetrieveAPIView): records = serializers.ListRecordSerializer( models.Record.objects.filter(playbook=playbook.data["id"]).all(), many=True ) - results = serializers.ListResultSerializer( - models.Result.objects.filter(playbook=playbook.data["id"]).all(), many=True - ) - for result in results.data: + results = models.Result.objects.filter(playbook=playbook.data["id"]) + + page = self.paginate_queryset(results) + if page is not None: + serializer = serializers.ListResultSerializer(page, many=True) + else: + serializer = serializers.ListResultSerializer(results, many=True) + + for result in serializer.data: task_id = result["task"] result["task"] = serializers.SimpleTaskSerializer(models.Task.objects.get(pk=task_id)).data host_id = result["host"] result["host"] = serializers.SimpleHostSerializer(models.Host.objects.get(pk=host_id)).data + paginated_results = self.get_paginated_response(serializer.data) + + if self.paginator.count > (self.paginator.offset + self.paginator.limit): + max_current = self.paginator.offset + self.paginator.limit + else: + max_current = self.paginator.count + current_page_results = "%s-%s" % (self.paginator.offset + 1, max_current) # fmt: off return Response({ @@ -94,7 +107,8 @@ class Playbook(generics.RetrieveAPIView): "hosts": hosts.data, "files": files.data, "records": records.data, - "results": results.data + "results": paginated_results.data, + "current_page_results": current_page_results, }) # fmt: on