Merge pull request #1332 from alphagov/improve-platform-admin

Improve platform admin
This commit is contained in:
Rebecca Law
2017-10-24 10:25:54 +01:00
committed by GitHub
3 changed files with 97 additions and 2 deletions

View File

@@ -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)

View File

@@ -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'

View File

@@ -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}