From edb0b8214d9fce3ab4da5970f116bea52bac0f5f Mon Sep 17 00:00:00 2001 From: Ben Thorner Date: Mon, 14 Jun 2021 11:00:05 +0100 Subject: [PATCH] Move pagination utils into own module This continues the pattern established in [1], just to chip away a bit more at the random collection of stuff in utils/__init__.py. [1]: https://github.com/alphagov/notifications-admin/pull/3923 --- app/main/views/dashboard.py | 3 +-- app/main/views/jobs.py | 13 ++++++------- app/main/views/platform_admin.py | 4 ++-- app/main/views/uploads.py | 12 ++++++------ app/utils/__init__.py | 26 -------------------------- app/utils/pagination.py | 27 +++++++++++++++++++++++++++ tests/app/test_utils.py | 21 --------------------- tests/app/utils/test_pagination.py | 20 ++++++++++++++++++++ 8 files changed, 62 insertions(+), 64 deletions(-) create mode 100644 app/utils/pagination.py create mode 100644 tests/app/utils/test_pagination.py diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index fb8b56ae8..f5a64d213 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -30,12 +30,11 @@ from app.utils import ( DELIVERED_STATUSES, FAILURE_STATUSES, REQUESTED_STATUSES, - generate_next_dict, - generate_previous_dict, get_current_financial_year, service_has_permission, ) from app.utils.csv import Spreadsheet +from app.utils.pagination import generate_next_dict, generate_previous_dict from app.utils.user import user_has_permissions diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 66952030f..fe86ad1c4 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -33,18 +33,17 @@ from app.formatters import get_time_left, message_count_noun from app.main import main from app.main.forms import SearchNotificationsForm from app.models.job import Job -from app.utils import ( - generate_next_dict, - generate_previous_dict, - get_page_from_request, - parse_filter_args, - set_status_filters, -) +from app.utils import parse_filter_args, set_status_filters from app.utils.csv import generate_notifications_csv from app.utils.letters import ( get_letter_printing_statement, printing_today_or_tomorrow, ) +from app.utils.pagination import ( + generate_next_dict, + generate_previous_dict, + get_page_from_request, +) from app.utils.user import user_has_permissions diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 5ce4dd937..229bd168b 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -27,12 +27,12 @@ from app.statistics_utils import ( get_formatted_percentage, get_formatted_percentage_two_dp, ) -from app.utils import ( +from app.utils.csv import Spreadsheet +from app.utils.pagination import ( generate_next_dict, generate_previous_dict, get_page_from_request, ) -from app.utils.csv import Spreadsheet from app.utils.user import user_is_platform_admin COMPLAINT_THRESHOLD = 0.02 diff --git a/app/main/views/uploads.py b/app/main/views/uploads.py index 628009e6c..3ef0666b1 100644 --- a/app/main/views/uploads.py +++ b/app/main/views/uploads.py @@ -45,17 +45,17 @@ from app.s3_client.s3_letter_upload_client import ( upload_letter_to_s3, ) from app.template_previews import TemplatePreview, sanitise_letter -from app.utils import ( - generate_next_dict, - generate_previous_dict, - get_page_from_request, - unicode_truncate, -) +from app.utils import unicode_truncate from app.utils.csv import Spreadsheet, get_errors_for_csv from app.utils.letters import ( get_letter_printing_statement, get_letter_validation_error, ) +from app.utils.pagination import ( + generate_next_dict, + generate_previous_dict, + get_page_from_request, +) from app.utils.templates import get_sample_template, get_template from app.utils.user import user_has_permissions diff --git a/app/utils/__init__.py b/app/utils/__init__.py index 3a2e27298..02359c820 100644 --- a/app/utils/__init__.py +++ b/app/utils/__init__.py @@ -55,32 +55,6 @@ def redirect_to_sign_in(f): return wrapped -def get_page_from_request(): - if 'page' in request.args: - try: - return int(request.args['page']) - except ValueError: - return None - else: - return 1 - - -def generate_previous_dict(view, service_id, page, url_args=None): - return generate_previous_next_dict(view, service_id, page - 1, 'Previous page', url_args or {}) - - -def generate_next_dict(view, service_id, page, url_args=None): - return generate_previous_next_dict(view, service_id, page + 1, 'Next page', url_args or {}) - - -def generate_previous_next_dict(view, service_id, page, title, url_args): - return { - 'url': url_for(view, service_id=service_id, page=page, **url_args), - 'title': title, - 'label': 'page {}'.format(page) - } - - def get_help_argument(): return request.args.get('help') if request.args.get('help') in ('1', '2', '3') else None diff --git a/app/utils/pagination.py b/app/utils/pagination.py new file mode 100644 index 000000000..b6c8bf53b --- /dev/null +++ b/app/utils/pagination.py @@ -0,0 +1,27 @@ +from flask import request, url_for + + +def get_page_from_request(): + if 'page' in request.args: + try: + return int(request.args['page']) + except ValueError: + return None + else: + return 1 + + +def generate_previous_dict(view, service_id, page, url_args=None): + return generate_previous_next_dict(view, service_id, page - 1, 'Previous page', url_args or {}) + + +def generate_next_dict(view, service_id, page, url_args=None): + return generate_previous_next_dict(view, service_id, page + 1, 'Next page', url_args or {}) + + +def generate_previous_next_dict(view, service_id, page, title, url_args): + return { + 'url': url_for(view, service_id=service_id, page=page, **url_args), + 'title': title, + 'label': 'page {}'.format(page) + } diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index dd0b8da74..68536b22e 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -4,8 +4,6 @@ from freezegun import freeze_time from app import format_datetime_relative from app.formatters import email_safe, round_to_significant_figures from app.utils import ( - generate_next_dict, - generate_previous_dict, get_current_financial_year, get_logo_cdn_domain, is_less_than_days_ago, @@ -29,25 +27,6 @@ def test_email_safe_return_dot_separated_email_domain(service_name, safe_email): assert email_safe(service_name) == safe_email -def test_generate_previous_dict(client): - ret = generate_previous_dict('main.view_jobs', 'foo', 2, {}) - assert 'page=1' in ret['url'] - assert ret['title'] == 'Previous page' - assert ret['label'] == 'page 1' - - -def test_generate_next_dict(client): - ret = generate_next_dict('main.view_jobs', 'foo', 2, {}) - assert 'page=3' in ret['url'] - assert ret['title'] == 'Next page' - assert ret['label'] == 'page 3' - - -def test_generate_previous_next_dict_adds_other_url_args(client): - ret = generate_next_dict('main.view_notifications', 'foo', 2, {'message_type': 'blah'}) - assert 'notifications/blah' in ret['url'] - - def test_get_cdn_domain_on_localhost(client, mocker): mocker.patch.dict('app.current_app.config', values={'ADMIN_BASE_URL': 'http://localhost:6012'}) domain = get_logo_cdn_domain() diff --git a/tests/app/utils/test_pagination.py b/tests/app/utils/test_pagination.py new file mode 100644 index 000000000..444942f5e --- /dev/null +++ b/tests/app/utils/test_pagination.py @@ -0,0 +1,20 @@ +from app.utils.pagination import generate_next_dict, generate_previous_dict + + +def test_generate_previous_dict(client): + ret = generate_previous_dict('main.view_jobs', 'foo', 2, {}) + assert 'page=1' in ret['url'] + assert ret['title'] == 'Previous page' + assert ret['label'] == 'page 1' + + +def test_generate_next_dict(client): + ret = generate_next_dict('main.view_jobs', 'foo', 2, {}) + assert 'page=3' in ret['url'] + assert ret['title'] == 'Next page' + assert ret['label'] == 'page 3' + + +def test_generate_previous_next_dict_adds_other_url_args(client): + ret = generate_next_dict('main.view_notifications', 'foo', 2, {'message_type': 'blah'}) + assert 'notifications/blah' in ret['url']