mirror of
https://github.com/GSA/notifications-api.git
synced 2026-07-18 05:30:48 -04:00
Merge pull request #1332 from alphagov/improve-platform-admin
Improve platform admin
This commit is contained in:
@@ -423,6 +423,35 @@ def fetch_stats_by_date_range_for_all_services(start_date, end_date, include_fro
|
||||
return query.all()
|
||||
|
||||
|
||||
@statsd(namespace='dao')
|
||||
def fetch_aggregate_stats_by_date_range_for_all_services(start_date, end_date, include_from_test_key=True):
|
||||
start_date = get_london_midnight_in_utc(start_date)
|
||||
end_date = get_london_midnight_in_utc(end_date + timedelta(days=1))
|
||||
table = NotificationHistory
|
||||
|
||||
if start_date >= datetime.utcnow() - timedelta(days=7):
|
||||
table = Notification
|
||||
|
||||
query = db.session.query(
|
||||
table.notification_type,
|
||||
table.status,
|
||||
func.count(table.id).label('count')
|
||||
).filter(
|
||||
table.created_at >= start_date,
|
||||
table.created_at < end_date
|
||||
).group_by(
|
||||
table.notification_type,
|
||||
table.status
|
||||
).order_by(
|
||||
table.notification_type
|
||||
)
|
||||
|
||||
if not include_from_test_key:
|
||||
query = query.filter(table.key_type != KEY_TYPE_TEST)
|
||||
|
||||
return query.all()
|
||||
|
||||
|
||||
@transactional
|
||||
@version_class(Service)
|
||||
@version_class(ApiKey)
|
||||
|
||||
@@ -46,8 +46,8 @@ from app.dao.services_dao import (
|
||||
dao_suspend_service,
|
||||
dao_resume_service,
|
||||
dao_fetch_monthly_historical_stats_for_service,
|
||||
dao_fetch_monthly_historical_stats_by_template_for_service
|
||||
)
|
||||
dao_fetch_monthly_historical_stats_by_template_for_service,
|
||||
fetch_aggregate_stats_by_date_range_for_all_services)
|
||||
from app.dao.service_whitelist_dao import (
|
||||
dao_fetch_service_whitelist,
|
||||
dao_add_and_commit_whitelisted_contacts,
|
||||
@@ -103,6 +103,25 @@ service_blueprint = Blueprint('service', __name__)
|
||||
register_errors(service_blueprint)
|
||||
|
||||
|
||||
@service_blueprint.route('/platform-stats', methods=['GET'])
|
||||
def get_platform_stats():
|
||||
include_from_test_key = request.args.get('include_from_test_key', 'True') != 'False'
|
||||
|
||||
# If start and end date are not set, we are expecting today's stats.
|
||||
today = str(datetime.utcnow().date())
|
||||
|
||||
start_date = datetime.strptime(request.args.get('start_date', today), '%Y-%m-%d').date()
|
||||
end_date = datetime.strptime(request.args.get('end_date', today), '%Y-%m-%d').date()
|
||||
data = fetch_aggregate_stats_by_date_range_for_all_services(start_date=start_date,
|
||||
end_date=end_date,
|
||||
include_from_test_key=include_from_test_key
|
||||
)
|
||||
stats = statistics.format_statistics(data)
|
||||
|
||||
result = jsonify(stats)
|
||||
return result
|
||||
|
||||
|
||||
@service_blueprint.route('', methods=['GET'])
|
||||
def get_services():
|
||||
only_active = request.args.get('only_active') == 'True'
|
||||
|
||||
@@ -2782,3 +2782,50 @@ def test_get_service_sms_senders_for_service_returns_empty_list_when_service_doe
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert json.loads(response.get_data(as_text=True)) == []
|
||||
|
||||
|
||||
def test_get_platform_stats(client, notify_db_session):
|
||||
service_1 = create_service(service_name='Service 1')
|
||||
service_2 = create_service(service_name='Service 2')
|
||||
sms_template = create_template(service=service_1)
|
||||
email_template = create_template(service=service_2, template_type=EMAIL_TYPE)
|
||||
letter_template = create_template(service=service_2, template_type=LETTER_TYPE)
|
||||
create_notification(template=sms_template, status='sending')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=email_template, status='temporary-failure')
|
||||
create_notification(template=email_template, status='delivered')
|
||||
create_notification(template=letter_template, status='sending')
|
||||
create_notification(template=letter_template, status='sending')
|
||||
|
||||
response = client.get('/service/platform-stats',
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()]
|
||||
)
|
||||
assert response.status_code == 200
|
||||
json_resp = json.loads(response.get_data(as_text=True))
|
||||
assert json_resp['email'] == {'delivered': 1, 'requested': 2, 'failed': 1}
|
||||
assert json_resp['letter'] == {'delivered': 0, 'requested': 2, 'failed': 0}
|
||||
assert json_resp['sms'] == {'delivered': 3, 'requested': 4, 'failed': 0}
|
||||
|
||||
|
||||
def test_get_platform_stats_creates_zero_stats(client, notify_db_session):
|
||||
service_1 = create_service(service_name='Service 1')
|
||||
service_2 = create_service(service_name='Service 2')
|
||||
sms_template = create_template(service=service_1)
|
||||
email_template = create_template(service=service_2, template_type=EMAIL_TYPE)
|
||||
create_notification(template=sms_template, status='sending')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=sms_template, status='delivered')
|
||||
create_notification(template=email_template, status='temporary-failure')
|
||||
create_notification(template=email_template, status='delivered')
|
||||
|
||||
response = client.get('/service/platform-stats',
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()]
|
||||
)
|
||||
assert response.status_code == 200
|
||||
json_resp = json.loads(response.get_data(as_text=True))
|
||||
assert json_resp['email'] == {'failed': 1, 'requested': 2, 'delivered': 1}
|
||||
assert json_resp['letter'] == {'failed': 0, 'requested': 0, 'delivered': 0}
|
||||
assert json_resp['sms'] == {'failed': 0, 'requested': 4, 'delivered': 3}
|
||||
|
||||
Reference in New Issue
Block a user