diff --git a/.ds.baseline b/.ds.baseline index cec28396c..f95942edb 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -169,7 +169,7 @@ "filename": "app/config.py", "hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc", "is_verified": false, - "line_number": 111, + "line_number": 116, "is_secret": false } ], @@ -710,5 +710,5 @@ } ] }, - "generated_at": "2024-05-20T16:03:05Z" + "generated_at": "2024-06-10T16:09:52Z" } diff --git a/app/config.py b/app/config.py index 8ec4db186..2a0f0c3e7 100644 --- a/app/config.py +++ b/app/config.py @@ -53,7 +53,12 @@ class Config(object): PERMANENT_SESSION_LIFETIME = 1800 # 30 Minutes SEND_FILE_MAX_AGE_DEFAULT = 365 * 24 * 60 * 60 # 1 year REPLY_TO_EMAIL_ADDRESS_VALIDATION_TIMEOUT = 45 - ACTIVITY_STATS_LIMIT_DAYS = 7 + ACTIVITY_STATS_LIMIT_DAYS = { + "one_day": 1, + "three_day": 3, + "five_day": 5, + "seven_day": 7, + } SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_NAME = "notify_admin_session" SESSION_COOKIE_SECURE = True diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 010d19b26..6608ac419 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -143,11 +143,33 @@ def view_notifications(service_id, message_type=None): True: ["reference"], False: [], }.get(bool(current_service.api_keys)), - download_link=url_for( + download_link_one_day=url_for( ".download_notifications_csv", service_id=current_service.id, message_type=message_type, status=request.args.get("status"), + number_of_days="one_day", + ), + download_link_three_day=url_for( + ".download_notifications_csv", + service_id=current_service.id, + message_type=message_type, + status=request.args.get("status"), + number_of_days="three_day", + ), + download_link_five_day=url_for( + ".download_notifications_csv", + service_id=current_service.id, + message_type=message_type, + status=request.args.get("status"), + number_of_days="five_day", + ), + download_link_seven_day=url_for( + ".download_notifications_csv", + service_id=current_service.id, + message_type=message_type, + status=request.args.get("status"), + number_of_days="seven_day", ), ) @@ -183,10 +205,9 @@ def get_notifications(service_id, message_type, status_override=None): # noqa filter_args["status"] = set_status_filters(filter_args) service_data_retention_days = None search_term = request.form.get("to", "") - if message_type is not None: service_data_retention_days = current_service.get_days_of_retention( - message_type + message_type, number_of_days="seven_day" ) if request.path.endswith("csv") and current_user.has_permissions("view_activity"): @@ -212,7 +233,6 @@ def get_notifications(service_id, message_type, status_override=None): # noqa ) url_args = {"message_type": message_type, "status": request.args.get("status")} prev_page = None - if "links" in notifications and notifications["links"].get("prev", None): prev_page = generate_previous_dict( "main.view_notifications", service_id, page, url_args=url_args @@ -233,7 +253,6 @@ def get_notifications(service_id, message_type, status_override=None): # noqa ) else: download_link = None - return { "service_data_retention_days": service_data_retention_days, "counts": render_template( @@ -362,6 +381,7 @@ def get_job_partials(job): filter_args = parse_filter_args(request.args) filter_args["status"] = set_status_filters(filter_args) notifications = job.get_notifications(status=filter_args["status"]) + number_of_days = "seven_day" counts = render_template( "partials/count.html", counts=_get_job_counts(job), @@ -371,7 +391,7 @@ def get_job_partials(job): ), ) service_data_retention_days = current_service.get_days_of_retention( - job.template_type + job.template_type, number_of_days ) if request.referrer is not None: diff --git a/app/main/views/notifications.py b/app/main/views/notifications.py index ac05e05ff..e41708b8c 100644 --- a/app/main/views/notifications.py +++ b/app/main/views/notifications.py @@ -137,9 +137,9 @@ def get_all_personalisation_from_notification(notification): def download_notifications_csv(service_id): filter_args = parse_filter_args(request.args) filter_args["status"] = set_status_filters(filter_args) - + number_of_days = request.args["number_of_days"] service_data_retention_days = current_service.get_days_of_retention( - filter_args.get("message_type")[0] + filter_args.get("message_type")[0], number_of_days ) file_time = datetime.now().strftime("%Y-%m-%d %I:%M:%S %p") file_time = f"{file_time} {get_user_preferred_timezone()}" diff --git a/app/models/service.py b/app/models/service.py index 375047d8d..e9bcf8a7d 100644 --- a/app/models/service.py +++ b/app/models/service.py @@ -390,7 +390,7 @@ class Service(JSONModel, SortByNameMixin): def get_data_retention_item(self, id): return next((dr for dr in self.data_retention if dr["id"] == id), None) - def get_days_of_retention(self, notification_type): + def get_days_of_retention(self, notification_type, number_of_days): return next( ( dr @@ -398,7 +398,10 @@ class Service(JSONModel, SortByNameMixin): if dr["notification_type"] == notification_type ), {}, - ).get("days_of_retention", current_app.config["ACTIVITY_STATS_LIMIT_DAYS"]) + ).get( + "days_of_retention", + current_app.config["ACTIVITY_STATS_LIMIT_DAYS"].get(number_of_days), + ) @cached_property def organization(self): diff --git a/app/templates/views/notifications.html b/app/templates/views/notifications.html index 9f5accd43..4858382b2 100644 --- a/app/templates/views/notifications.html +++ b/app/templates/views/notifications.html @@ -64,10 +64,22 @@ {% if current_user.has_permissions('view_activity') %}

- Download this report (CSV) + Download all data last 7 days (CSV)   Data available for {{ partials.service_data_retention_days }} days

+

+ Download all data last 5 days (CSV) +   +

+

+ Download all data last 3 days (CSV) +   +

+

+ Download all data today (CSV) +   +

{% endif %} {{ ajax_block( diff --git a/tests/app/main/views/test_activity.py b/tests/app/main/views/test_activity.py index 3493aaae4..3bbe40282 100644 --- a/tests/app/main/views/test_activity.py +++ b/tests/app/main/views/test_activity.py @@ -228,12 +228,18 @@ def test_can_show_notifications_if_data_retention_not_available( url_for, ".download_notifications_csv", message_type=None, + number_of_days="seven_day", ), ), ( create_active_user_with_permissions(), {"status": "failed"}, - partial(url_for, ".download_notifications_csv", status="failed"), + partial( + url_for, + ".download_notifications_csv", + status="failed", + number_of_days="seven_day", + ), ), ( create_active_user_with_permissions(), @@ -242,15 +248,13 @@ def test_can_show_notifications_if_data_retention_not_available( url_for, ".download_notifications_csv", message_type="sms", + number_of_days="seven_day", ), ), ( create_active_user_view_permissions(), {}, - partial( - url_for, - ".download_notifications_csv", - ), + partial(url_for, ".download_notifications_csv", number_of_days="seven_day"), ), ( create_active_caseworking_user(),