diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 6190ac988..07e973704 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -3,7 +3,7 @@ import json from collections import OrderedDict from datetime import datetime -from flask import abort, flash, render_template, request, url_for +from flask import Response, abort, flash, render_template, request, send_file, url_for from notifications_python_client.errors import HTTPError from app import ( @@ -70,6 +70,29 @@ def platform_admin(): ) +@main.route("/platform-admin/download-all-users") +@user_is_platform_admin +def download_all_users(): + + # Create a CSV string from the user data + csv_data = "Name,Email Address,Mobile Number,Service\n" + users = user_api_client.get_all_users_detailed() + + if len(users) == 0: + return "No data to download." + users = json.loads(users) + for user in users: + if user["name"].startswith("e2e"): + continue + csv_data += f"{user['name']},{user['email_address']},{user['mobile_number']},{user['service']}\n" + + # Create a direct download response with the CSV data and appropriate headers + response = Response(csv_data, content_type="text/csv") + response.headers["Content-Disposition"] = "attachment; filename=users.csv" + + return response + + def is_over_threshold(number, total, threshold): percentage = number / total * 100 if total else 0 return percentage > threshold diff --git a/app/navigation.py b/app/navigation.py index 3ce3b6e62..6ef0907a6 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -123,6 +123,7 @@ class HeaderNavigation(Navigation): "get_billing_report", "get_users_report", "get_daily_volumes", + "download_all_users", "get_daily_sms_provider_volumes", "get_volumes_by_service", "organizations", diff --git a/app/notify_client/user_api_client.py b/app/notify_client/user_api_client.py index 06d6385b2..e47bc4030 100644 --- a/app/notify_client/user_api_client.py +++ b/app/notify_client/user_api_client.py @@ -157,6 +157,10 @@ class UserApiClient(NotifyAdminAPIClient): endpoint = "/user" return self.get(endpoint)["data"] + def get_all_users_detailed(self): + endpoint = "/user/report-all-users" + return self.get(endpoint)["data"] + @cache.delete("service-{service_id}") @cache.delete("service-{service_id}-template-folders") @cache.delete("user-{user_id}") diff --git a/app/templates/views/platform-admin/reports.html b/app/templates/views/platform-admin/reports.html index f22faa728..3b7b32d3a 100644 --- a/app/templates/views/platform-admin/reports.html +++ b/app/templates/views/platform-admin/reports.html @@ -31,4 +31,8 @@

Users Report

+

+ Download All Users +

+ {% endblock %}