mirror of
https://github.com/ansible/awx.git
synced 2026-10-30 22:16:19 -02:30
[AAP-93974] perf(api): optimize non-superuser job list pagination (#16668)
perf(api): optimize non-superuser job list pagination Co-authored-by: Jake Jackson <24478650+thedoubl3j@users.noreply.github.com>
This commit is contained in:
co-authored by
Jake Jackson
parent
33a9eb7d15
commit
f8314ada72
@@ -45,6 +45,15 @@ class UnifiedJobPaginator(DjangoPaginator):
|
||||
return UnifiedJob.objects.count()
|
||||
|
||||
|
||||
class JobPaginator(DjangoPaginator):
|
||||
"""Count visible jobs through a primary-key subquery instead of full rows."""
|
||||
|
||||
@cached_property
|
||||
def count(self):
|
||||
visible_pks = self.object_list.order_by().values("pk")
|
||||
return self.object_list.model.objects.filter(pk__in=visible_pks).count()
|
||||
|
||||
|
||||
class Pagination(pagination.PageNumberPagination):
|
||||
page_size_query_param = "page_size"
|
||||
max_page_size = settings.MAX_PAGE_SIZE
|
||||
@@ -135,6 +144,10 @@ class UnifiedJobPagination(Pagination):
|
||||
return DjangoPaginator
|
||||
|
||||
|
||||
class JobPagination(Pagination):
|
||||
django_paginator_class = JobPaginator
|
||||
|
||||
|
||||
class LimitPagination(pagination.BasePagination):
|
||||
default_limit = api_settings.PAGE_SIZE
|
||||
limit_query_param = "limit"
|
||||
|
||||
@@ -130,7 +130,7 @@ from awx.api.views.mixin import (
|
||||
NoTruncateMixin,
|
||||
UnifiedJobExcludeMixin,
|
||||
)
|
||||
from awx.api.pagination import ActivityStreamPagination, UnifiedJobEventPagination, UnifiedJobPagination
|
||||
from awx.api.pagination import ActivityStreamPagination, JobPagination, UnifiedJobEventPagination, UnifiedJobPagination
|
||||
from awx.main.utils import set_environ
|
||||
|
||||
logger = logging.getLogger('awx.api.views')
|
||||
@@ -3885,6 +3885,7 @@ class SystemJobTemplateNotificationTemplatesSuccessList(SystemJobTemplateNotific
|
||||
class JobList(UnifiedJobExcludeMixin, ListAPIView):
|
||||
model = models.Job
|
||||
serializer_class = serializers.JobListSerializer
|
||||
pagination_class = JobPagination
|
||||
resource_purpose = 'jobs'
|
||||
|
||||
@extend_schema_if_available(extensions={"x-ai-description": "A list of jobs."})
|
||||
|
||||
Reference in New Issue
Block a user