diff --git a/app/formatters.py b/app/formatters.py
index 971beb03e..c695746bf 100644
--- a/app/formatters.py
+++ b/app/formatters.py
@@ -99,9 +99,7 @@ def format_datetime_short(date):
def format_datetime_short_america(date):
- return "{} at {}".format(
- format_date_numeric_america(date), format_time_12h(date)
- )
+ return "{} at {}".format(format_date_numeric_america(date), format_time_12h(date))
def format_date_numeric_america(date):
@@ -117,7 +115,9 @@ def format_time_12h(date):
date = parse_naive_dt(date)
preferred_tz = pytz.timezone(get_user_preferred_timezone())
- return date.replace(tzinfo=timezone.utc).astimezone(preferred_tz).strftime("%I:%M %p")
+ return (
+ date.replace(tzinfo=timezone.utc).astimezone(preferred_tz).strftime("%I:%M %p")
+ )
def format_datetime_relative(date):
diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py
index cb868fde7..a88203ae7 100644
--- a/app/main/views/dashboard.py
+++ b/app/main/views/dashboard.py
@@ -58,11 +58,13 @@ def service_dashboard(service_id):
{
"job_id": job["id"],
"time_left": get_time_left(job["created_at"]),
- "download_link": url_for(".view_job_csv", service_id=current_service.id, job_id=job["id"]),
+ "download_link": url_for(
+ ".view_job_csv", service_id=current_service.id, job_id=job["id"]
+ ),
"notification_count": job["notification_count"],
"created_by": job["created_by"],
}
- for job in job_response.get('data', [])
+ for job in job_response["data"]
]
return render_template(
"views/dashboard/dashboard.html",
diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html
index f4af4d930..b99f322c6 100644
--- a/app/templates/views/dashboard/dashboard.html
+++ b/app/templates/views/dashboard/dashboard.html
@@ -57,7 +57,7 @@
{% for notification in notifications %}
{% if notification %}
-
+
{{ notification.job.original_file_name if notification.job.original_file_name else 'Manually entered number'}}
diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py
index b15e55a48..7bb288ef2 100644
--- a/tests/app/main/views/test_dashboard.py
+++ b/tests/app/main/views/test_dashboard.py
@@ -130,6 +130,37 @@ MOCK_ONE_OFF_JOB = {
}
}
+MOCK_JOBS = {
+ "data": [{
+ "archived": False,
+ "created_at": "2024-01-04T20:43:52+00:00",
+ "created_by": {
+ "id": "mocked_user_id",
+ "name": "mocked_user",
+ },
+ "id": "mocked_notification_id",
+ "job_status": 'finished',
+ "notification_count": 1,
+ "original_file_name": 'mocked_file.csv',
+ 'processing_finished': '2024-01-25T23:02:25+00:00',
+ 'processing_started': '2024-01-25T23:02:24+00:00',
+ 'scheduled_for': None,
+ 'service': '21b3ee3d-1cb0-4666-bfa0-9c5ac26d3fe3',
+ 'service_name': {
+ 'name': "Mock Texting Service"
+ },
+ 'statistics': [{
+ 'count': 1,
+ 'status': 'sending'
+ }],
+ 'template': '6a456418-498c-4c86-b0cd-9403c14a216c',
+ 'template_name': 'Mock Template Name',
+ 'template_type': 'sms',
+ 'template_version': 3,
+ 'updated_at': '2024-01-25T23:02:25+00:00',
+ }]
+}
+
stub_template_stats = [
{
"template_type": "sms",
@@ -218,7 +249,7 @@ def test_get_started(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -248,7 +279,7 @@ def test_get_started_is_hidden_once_templates_exist(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -275,7 +306,7 @@ def test_inbound_messages_not_visible_to_service_without_permissions(
mock_get_inbound_sms_summary,
):
service_one["permissions"] = []
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -303,7 +334,7 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
mock_get_inbound_sms_summary,
):
service_one["permissions"] = ["inbound_sms"]
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -335,7 +366,7 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
mock_get_inbound_sms_summary_with_no_messages,
):
service_one["permissions"] = ["inbound_sms"]
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -585,7 +616,7 @@ def test_should_show_recent_templates_on_dashboard(
"app.template_statistics_client.get_template_statistics_for_service",
return_value=copy.deepcopy(stub_template_stats),
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -642,7 +673,7 @@ def test_should_not_show_recent_templates_on_dashboard_if_only_one_template_used
"app.template_statistics_client.get_template_statistics_for_service",
return_value=stats,
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -782,7 +813,7 @@ def test_should_show_upcoming_jobs_on_dashboard(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -824,7 +855,7 @@ def test_should_not_show_upcoming_jobs_on_dashboard_if_count_is_0(
"soonest_scheduled_for": None,
},
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -850,7 +881,7 @@ def test_should_not_show_upcoming_jobs_on_dashboard_if_service_has_no_jobs(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -904,7 +935,7 @@ def test_correct_font_size_for_big_numbers(
service_one["permissions"] = permissions
mocker.patch("app.main.views.dashboard.get_dashboard_totals", return_value=totals)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -938,7 +969,7 @@ def test_should_not_show_jobs_on_dashboard_for_users_with_uploads_page(
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1209,7 +1240,7 @@ def test_menu_send_messages(
):
service_one["permissions"] = ["email", "sms"]
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1246,7 +1277,7 @@ def test_menu_manage_service(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1283,7 +1314,7 @@ def test_menu_main_settings(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1319,7 +1350,7 @@ def test_menu_manage_api_keys(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1359,7 +1390,7 @@ def test_menu_all_services_for_platform_admin_user(
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1404,7 +1435,7 @@ def test_route_for_service_permissions(
mocker.patch(
"app.service_api_client.get_global_notification_count", side_effect=_get
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1460,7 +1491,7 @@ def test_service_dashboard_updates_gets_dashboard_totals(
"sms": {"requested": 456, "delivered": 0, "failed": 0},
},
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1586,7 +1617,7 @@ def test_org_breadcrumbs_do_not_show_if_service_has_no_org(
mock_get_annual_usage_for_service,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1653,7 +1684,7 @@ def test_org_breadcrumbs_show_if_user_is_a_member_of_the_services_org(
id_=ORGANISATION_ID,
),
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1689,7 +1720,7 @@ def test_org_breadcrumbs_do_not_show_if_user_is_a_member_of_the_services_org_but
)
mocker.patch("app.models.service.Organization")
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1727,7 +1758,7 @@ def test_org_breadcrumbs_show_if_user_is_platform_admin(
),
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1763,7 +1794,7 @@ def test_breadcrumb_shows_if_service_is_suspended(
"app.service_api_client.get_service", return_value={"data": service_one_json}
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1797,7 +1828,7 @@ def test_service_dashboard_shows_usage(
"count": 500,
},
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
@@ -1840,7 +1871,7 @@ def test_service_dashboard_shows_free_allowance(
}
],
)
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
@@ -1864,7 +1895,7 @@ def test_service_dashboard_shows_batched_jobs(
mock_get_annual_usage_for_service,
mock_get_free_sms_fragment_limit,
):
- mocker.patch("app.job_api_client.get_job", return_value=MOCK_ONE_OFF_JOB)
+ mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
mocker.patch(
"app.notification_api_client.get_notifications_for_service",
return_value=FAKE_ONE_OFF_NOTIFICATION,
|