Merge branch 'main' of https://github.com/GSA/notifications-admin into 1423-Sign-in-content-changes-for-login-gov

This commit is contained in:
Jonathan Bobel
2024-04-16 11:10:46 -04:00
6 changed files with 68 additions and 58 deletions

View File

@@ -134,11 +134,17 @@ def template_usage(service_id):
months=months, months=months,
stats=stats, stats=stats,
most_used_template_count=max( most_used_template_count=max(
max( (
(template["requested_count"] for template in month["templates_used"]), max(
default=0, (
) template["requested_count"]
for month in months for template in month["templates_used"]
),
default=0,
)
for month in months
),
default=0,
), ),
years=get_tuples_of_financial_years( years=get_tuples_of_financial_years(
partial(url_for, ".template_usage", service_id=service_id), partial(url_for, ".template_usage", service_id=service_id),
@@ -155,31 +161,16 @@ def usage(service_id):
year, current_financial_year = requested_and_current_financial_year(request) year, current_financial_year = requested_and_current_financial_year(request)
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year( free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
service_id, year service_id
) )
units = billing_api_client.get_monthly_usage_for_service(service_id, year) units = billing_api_client.get_monthly_usage_for_service(service_id, year)
yearly_usage = billing_api_client.get_annual_usage_for_service(service_id, year) yearly_usage = billing_api_client.get_annual_usage_for_service(service_id, year)
more_stats = format_monthly_stats_to_list( more_stats = format_monthly_stats_to_list(
service_api_client.get_monthly_notification_stats(service_id, year)["data"] service_api_client.get_monthly_notification_stats(service_id, year)["data"]
) )
if year == current_financial_year:
# This includes Oct, Nov, Dec
# but we don't need next year's data yet
more_stats = [
month
for month in more_stats
if month["name"] in ["October", "November", "December"]
]
elif year == (current_financial_year + 1):
# This is all the other months
# and we need last year's data
more_stats = [
month
for month in more_stats
if month["name"] not in ["October", "November", "December"]
]
return render_template( return render_template(
"views/usage.html", "views/usage.html",
months=list(get_monthly_usage_breakdown(year, units, more_stats)), months=list(get_monthly_usage_breakdown(year, units, more_stats)),
@@ -341,8 +332,15 @@ def get_dashboard_partials(service_id):
dashboard_totals = (get_dashboard_totals(stats),) dashboard_totals = (get_dashboard_totals(stats),)
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year( free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
current_service.id, current_service.id,
get_current_financial_year(),
) )
# These 2 calls will update the dashboard sms allowance count while in trial mode.
billing_api_client.get_monthly_usage_for_service(
service_id, get_current_financial_year()
)
billing_api_client.create_or_update_free_sms_fragment_limit(
service_id, free_sms_fragment_limit=free_sms_allowance
)
yearly_usage = billing_api_client.get_annual_usage_for_service( yearly_usage = billing_api_client.get_annual_usage_for_service(
service_id, service_id,
get_current_financial_year(), get_current_financial_year(),
@@ -433,13 +431,7 @@ def aggregate_status_types(counts_dict):
def get_months_for_financial_year(year, time_format="%B"): def get_months_for_financial_year(year, time_format="%B"):
return [ return [month.strftime(time_format) for month in (get_months_for_year(1, 13, year))]
month.strftime(time_format)
for month in (
get_months_for_year(10, 13, year) + get_months_for_year(1, 10, year + 1)
)
if month < datetime.now()
]
def get_months_for_year(start, end, year): def get_months_for_year(start, end, year):

View File

@@ -11,7 +11,7 @@ def get_current_financial_year():
now = datetime.now(preferred_tz) now = datetime.now(preferred_tz)
current_month = int(now.strftime("%-m")) current_month = int(now.strftime("%-m"))
current_year = int(now.strftime("%Y")) current_year = int(now.strftime("%Y"))
return current_year if current_month > 9 else current_year - 1 return current_year if current_month < 10 else current_year + 1
def is_less_than_days_ago(date_from_db, number_of_days): def is_less_than_days_ago(date_from_db, number_of_days):

View File

@@ -388,7 +388,7 @@ def test_organization_services_shows_live_services_and_usage(
client_request.login(active_user_with_permissions) client_request.login(active_user_with_permissions)
page = client_request.get(".organization_dashboard", org_id=ORGANISATION_ID) page = client_request.get(".organization_dashboard", org_id=ORGANISATION_ID)
mock.assert_called_once_with(ORGANISATION_ID, 2019) mock.assert_called_once_with(ORGANISATION_ID, 2020)
services = page.select("main h3") services = page.select("main h3")
usage_rows = page.select("main .grid-col-6") usage_rows = page.select("main .grid-col-6")
@@ -459,9 +459,9 @@ def test_organization_services_shows_live_services_and_usage_with_count_of_1(
@pytest.mark.parametrize( @pytest.mark.parametrize(
("financial_year", "expected_selected"), ("financial_year", "expected_selected"),
[ [
(2017, "2017 to 2018 fiscal year"),
(2018, "2018 to 2019 fiscal year"), (2018, "2018 to 2019 fiscal year"),
(2019, "2019 to 2020 fiscal year"), (2019, "2019 to 2020 fiscal year"),
(2020, "2020 to 2021 fiscal year"),
], ],
) )
def test_organization_services_filters_by_financial_year( def test_organization_services_filters_by_financial_year(
@@ -483,9 +483,9 @@ def test_organization_services_filters_by_financial_year(
) )
mock.assert_called_once_with(ORGANISATION_ID, financial_year) mock.assert_called_once_with(ORGANISATION_ID, financial_year)
assert normalize_spaces(page.select_one(".pill").text) == ( assert normalize_spaces(page.select_one(".pill").text) == (
"2020 to 2021 fiscal year "
"2019 to 2020 fiscal year " "2019 to 2020 fiscal year "
"2018 to 2019 fiscal year " "2018 to 2019 fiscal year"
"2017 to 2018 fiscal year"
) )
assert normalize_spaces(page.select_one(".pill-item--selected").text) == ( assert normalize_spaces(page.select_one(".pill-item--selected").text) == (
expected_selected expected_selected
@@ -610,7 +610,7 @@ def test_organization_services_links_to_downloadable_report(
assert link_to_report.attrs["href"] == url_for( assert link_to_report.attrs["href"] == url_for(
".download_organization_usage_report", ".download_organization_usage_report",
org_id=ORGANISATION_ID, org_id=ORGANISATION_ID,
selected_year=2021, selected_year=2022,
) )

View File

@@ -678,12 +678,12 @@ def test_should_show_redirect_from_template_history(
) )
@freeze_time("2017-01-01 12:00") # 4 months into 2016 financial year @freeze_time("2017-01-01 12:00")
@pytest.mark.parametrize( @pytest.mark.parametrize(
"extra_args", "extra_args",
[ [
{}, {},
{"year": "2016"}, {"year": "2017"},
], ],
) )
def test_should_show_monthly_breakdown_of_template_usage( def test_should_show_monthly_breakdown_of_template_usage(
@@ -695,7 +695,7 @@ def test_should_show_monthly_breakdown_of_template_usage(
"main.template_usage", service_id=SERVICE_ONE_ID, **extra_args "main.template_usage", service_id=SERVICE_ONE_ID, **extra_args
) )
mock_get_monthly_template_usage.assert_called_once_with(SERVICE_ONE_ID, 2016) mock_get_monthly_template_usage.assert_called_once_with(SERVICE_ONE_ID, 2017)
table_rows = page.select("tbody tr") table_rows = page.select("tbody tr")
@@ -703,9 +703,22 @@ def test_should_show_monthly_breakdown_of_template_usage(
"My first template " "Text message template " "2" "My first template " "Text message template " "2"
) )
assert len(table_rows) == len(["October"]) assert len(table_rows) == len(["January"])
# October is the only month with data, thus it's not in the list.
assert len(page.select(".table-no-data")) == len( assert len(page.select(".table-no-data")) == len(
["November", "December", "January"] [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"November",
"December",
]
) )
@@ -748,9 +761,9 @@ def test_stats_pages_show_last_3_years(
) )
assert normalize_spaces(page.select_one(".pill").text) == ( assert normalize_spaces(page.select_one(".pill").text) == (
"2015 to 2016 fiscal year "
"2014 to 2015 fiscal year " "2014 to 2015 fiscal year "
"2013 to 2014 fiscal year " "2013 to 2014 fiscal year"
"2012 to 2013 fiscal year"
) )
@@ -965,18 +978,18 @@ def test_usage_page(
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
) )
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2012)
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2012)
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2011) mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
nav = page.find("ul", {"class": "pill"}) nav = page.find("ul", {"class": "pill"})
unselected_nav_links = nav.select("a:not(.pill-item--selected)") unselected_nav_links = nav.select("a:not(.pill-item--selected)")
assert ( assert (
normalize_spaces(nav.find("a", {"aria-current": "page"}).text) normalize_spaces(nav.find("a", {"aria-current": "page"}).text)
== "2011 to 2012 fiscal year" == "2012 to 2013 fiscal year"
) )
assert normalize_spaces(unselected_nav_links[0].text) == "2010 to 2011 fiscal year" assert normalize_spaces(unselected_nav_links[0].text) == "2011 to 2012 fiscal year"
assert normalize_spaces(unselected_nav_links[1].text) == "2009 to 2010 fiscal year" assert normalize_spaces(unselected_nav_links[1].text) == "2010 to 2011 fiscal year"
annual_usage = page.find_all("div", {"class": "keyline-block"}) annual_usage = page.find_all("div", {"class": "keyline-block"})
@@ -1043,6 +1056,7 @@ def test_usage_page_monthly_breakdown(
page = client_request.get("main.usage", service_id=SERVICE_ONE_ID) page = client_request.get("main.usage", service_id=SERVICE_ONE_ID)
monthly_breakdown = normalize_spaces(page.find("table").text) monthly_breakdown = normalize_spaces(page.find("table").text)
assert "January" in monthly_breakdown
assert "October" in monthly_breakdown assert "October" in monthly_breakdown
assert "February" in monthly_breakdown assert "February" in monthly_breakdown
assert "March" in monthly_breakdown assert "March" in monthly_breakdown
@@ -1051,8 +1065,8 @@ def test_usage_page_monthly_breakdown(
@pytest.mark.parametrize( @pytest.mark.parametrize(
("now", "expected_number_of_months"), ("now", "expected_number_of_months"),
[ [
(freeze_time("2017-03-31 11:09:00.061258"), 6), (freeze_time("2017-03-31 11:09:00.061258"), 12),
(freeze_time("2017-01-01 11:09:00.061258"), 4), (freeze_time("2017-01-01 11:09:00.061258"), 12),
], ],
) )
def test_usage_page_monthly_breakdown_shows_months_so_far( def test_usage_page_monthly_breakdown_shows_months_so_far(
@@ -1112,7 +1126,7 @@ def test_usage_page_with_year_argument(
) )
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000) mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000) mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2000) mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2000) mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2000)
@@ -1147,7 +1161,7 @@ def test_future_usage_page(
mock_get_annual_usage_for_service_in_future.assert_called_once_with( mock_get_annual_usage_for_service_in_future.assert_called_once_with(
SERVICE_ONE_ID, 2014 SERVICE_ONE_ID, 2014
) )
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2014) mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2014) mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2014)
@@ -1378,7 +1392,9 @@ def test_route_for_service_permissions(
mock_has_no_jobs, mock_has_no_jobs,
mock_get_template_statistics, mock_get_template_statistics,
mock_get_service_statistics, mock_get_service_statistics,
mock_get_monthly_usage_for_service,
mock_get_annual_usage_for_service, mock_get_annual_usage_for_service,
mock_create_or_update_free_sms_fragment_limit,
mock_get_free_sms_fragment_limit, mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary, mock_get_inbound_sms_summary,
): ):

View File

@@ -20,10 +20,10 @@ def test_is_less_than_days_ago(date_from_db, expected_result):
@pytest.mark.parametrize( @pytest.mark.parametrize(
("datetime_string", "financial_year"), ("datetime_string", "financial_year"),
[ [
("2021-01-01T00:00:00+00:00", 2020), # Start of 2021 ("2021-01-01T00:00:00+00:00", 2021), # Start of 2021
("2021-04-01T03:59:59+00:00", 2020), # One minute before midnight (BST) ("2021-04-01T03:59:59+00:00", 2021), # One minute before midnight (BST)
("2021-10-01T04:05:00+00:00", 2021), # Midnight (BST) ("2021-10-01T04:05:00+00:00", 2022), # Midnight (BST)
("2021-12-12T12:12:12+01:00", 2021), # Later in the year ("2021-12-12T12:12:12+01:00", 2022), # Later in the year
], ],
) )
def test_get_financial_year(datetime_string, financial_year): def test_get_financial_year(datetime_string, financial_year):

View File

@@ -2330,6 +2330,8 @@ def client_request(logged_in_client, mocker, service_one): # noqa (C901 too com
"app.billing_api_client.create_or_update_free_sms_fragment_limit", autospec=True "app.billing_api_client.create_or_update_free_sms_fragment_limit", autospec=True
) )
mocker.patch("app.billing_api_client.get_monthly_usage_for_service", autospec=True)
class ClientRequest: class ClientRequest:
@staticmethod @staticmethod
@contextmanager @contextmanager