Fixed pagination logic to prevent infinite next button

This commit is contained in:
Beverly Nguyen
2025-07-29 10:25:43 -07:00
parent d65be41da5
commit e5885f674b
3 changed files with 36 additions and 2 deletions

View File

@@ -97,10 +97,12 @@ def handle_pagination(jobs, service_id, page):
else None else None
) )
total_items = jobs.get("total", 0) total_items = jobs.get("total", 0)
page_size = jobs.get("page_size", 50)
total_pages = (total_items + page_size - 1) // page_size
has_next_link = jobs.get("links", {}).get("next") is not None has_next_link = jobs.get("links", {}).get("next") is not None
next_page = ( next_page = (
generate_next_dict("main.all_jobs_activity", service_id, page) generate_next_dict("main.all_jobs_activity", service_id, page)
if has_next_link and total_items > 50 if has_next_link and total_items > 50 and page < total_pages
else None else None
) )
pagination = generate_pagination_pages( pagination = generate_pagination_pages(

View File

@@ -254,10 +254,13 @@ def get_notifications(service_id, message_type, status_override=None): # noqa
next_page = None next_page = None
total_items = notifications.get("total", 0) total_items = notifications.get("total", 0)
page_size = notifications.get("page_size", 50)
total_pages = (total_items + page_size - 1) // page_size
if ( if (
"links" in notifications "links" in notifications
and notifications["links"].get("next", None) and notifications["links"].get("next", None)
and total_items > 50 and total_items > 50
and page < total_pages
): ):
next_page = generate_next_dict( next_page = generate_next_dict(
"main.view_notifications", service_id, page, url_args "main.view_notifications", service_id, page, url_args

View File

@@ -562,7 +562,7 @@ def test_should_show_notifications_for_a_service_with_next_previous(
"app.notification_api_client.get_notifications_for_service", "app.notification_api_client.get_notifications_for_service",
return_value=notification_json( return_value=notification_json(
service_one["id"], rows=50, with_links=True service_one["id"], rows=50, with_links=True
) | {"total": 100}, ) | {"total": 150},
) )
page = client_request.get( page = client_request.get(
"main.view_notifications", "main.view_notifications",
@@ -597,6 +597,35 @@ def test_should_show_notifications_for_a_service_with_next_previous(
assert "page 1" in prev_page_link.text.strip() assert "page 1" in prev_page_link.text.strip()
def test_doesnt_show_next_button_on_last_page(
client_request,
service_one,
active_user_with_permissions,
mock_get_service_statistics,
mock_get_service_data_retention,
mock_get_no_api_keys,
mocker,
):
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=notification_json(
service_one["id"], rows=50, with_links=True
) | {"total": 100},
)
page = client_request.get(
"main.view_notifications",
service_id=service_one["id"],
message_type="sms",
page=2,
)
next_page_link = page.find("a", {"rel": "next"})
prev_page_link = page.find("a", {"rel": "previous"})
assert next_page_link is None
assert prev_page_link is not None
def test_doesnt_show_pagination_when_50_or_fewer_items( def test_doesnt_show_pagination_when_50_or_fewer_items(
client_request, client_request,
service_one, service_one,