mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-10 01:56:03 -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()
|
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
|
@transactional
|
||||||
@version_class(Service)
|
@version_class(Service)
|
||||||
@version_class(ApiKey)
|
@version_class(ApiKey)
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ from app.dao.services_dao import (
|
|||||||
dao_suspend_service,
|
dao_suspend_service,
|
||||||
dao_resume_service,
|
dao_resume_service,
|
||||||
dao_fetch_monthly_historical_stats_for_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 (
|
from app.dao.service_whitelist_dao import (
|
||||||
dao_fetch_service_whitelist,
|
dao_fetch_service_whitelist,
|
||||||
dao_add_and_commit_whitelisted_contacts,
|
dao_add_and_commit_whitelisted_contacts,
|
||||||
@@ -103,6 +103,25 @@ service_blueprint = Blueprint('service', __name__)
|
|||||||
register_errors(service_blueprint)
|
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'])
|
@service_blueprint.route('', methods=['GET'])
|
||||||
def get_services():
|
def get_services():
|
||||||
only_active = request.args.get('only_active') == 'True'
|
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 response.status_code == 200
|
||||||
assert json.loads(response.get_data(as_text=True)) == []
|
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