Add results for notification stats for last 7 days and today

This commit is contained in:
Pea Tyczynska
2018-11-06 11:38:50 +00:00
parent 8a3dc8e039
commit c37c399741
2 changed files with 81 additions and 67 deletions

View File

@@ -95,24 +95,6 @@ def fetch_notification_status_for_service_by_month(start_date, end_date, service
).all()
def fetch_notification_status_for_service_for_7_days(service_id):
start_date = midnight_n_days_ago(7)
return db.session.query(
FactNotificationStatus.bst_date,
FactNotificationStatus.notification_type,
FactNotificationStatus.notification_status,
func.sum(FactNotificationStatus.notification_count).label('count')
).filter(
FactNotificationStatus.service_id == service_id,
FactNotificationStatus.bst_date >= start_date,
FactNotificationStatus.key_type != KEY_TYPE_TEST
).group_by(
FactNotificationStatus.bst_date,
FactNotificationStatus.notification_type,
FactNotificationStatus.notification_status,
).all()
def fetch_notification_status_for_service_for_day(bst_day, service_id):
return db.session.query(
# return current month as a datetime so the data has the same shape as the ft_notification_status query
@@ -129,3 +111,39 @@ def fetch_notification_status_for_service_for_day(bst_day, service_id):
Notification.notification_type,
Notification.status
).all()
def fetch_notification_status_for_service_for_today_and_7_previous_days(service_id):
start_date = midnight_n_days_ago(7)
now = datetime.utcnow()
stats_for_7_days = db.session.query(
FactNotificationStatus.notification_type.label('notification_type'),
FactNotificationStatus.notification_status.label('notification_status'),
FactNotificationStatus.notification_count.label('count')
).filter(
FactNotificationStatus.service_id == service_id,
FactNotificationStatus.bst_date >= start_date,
FactNotificationStatus.key_type != KEY_TYPE_TEST
)
stats_for_today = db.session.query(
Notification.notification_type.cast(db.Text),
Notification.status.label('notification_status'),
func.count().label('count')
).filter(
Notification.created_at >= get_london_midnight_in_utc(now),
Notification.service_id == service_id,
Notification.key_type != KEY_TYPE_TEST
).group_by(
Notification.notification_type,
Notification.status
)
all_stats_table = stats_for_7_days.union_all(stats_for_today).subquery()
return db.session.query(
all_stats_table.c.notification_type,
all_stats_table.c.notification_status,
func.sum(all_stats_table.c.count).label('count')
).group_by(
all_stats_table.c.notification_type,
all_stats_table.c.notification_status,
).all()

View File

@@ -5,10 +5,10 @@ from app.dao.fact_notification_status_dao import (
update_fact_notification_status,
fetch_notification_status_for_day,
fetch_notification_status_for_service_by_month,
fetch_notification_status_for_service_for_7_days,
fetch_notification_status_for_service_for_day,
fetch_notification_status_for_service_for_today_and_7_previous_days
)
from app.models import FactNotificationStatus, KEY_TYPE_TEST, KEY_TYPE_TEAM
from app.models import FactNotificationStatus, KEY_TYPE_TEST, KEY_TYPE_TEAM, EMAIL_TYPE, SMS_TYPE
from freezegun import freeze_time
from tests.app.db import create_notification, create_service, create_template, create_ft_notification_status
@@ -137,53 +137,6 @@ def test_fetch_notification_status_for_service_by_month(notify_db_session):
assert results[3].count == 1
@freeze_time('2018-10-30T10:00:00')
def test_fetch_notification_status_for_service_for_7_days(notify_db_session):
service_1 = create_service(service_name='service_1')
service_2 = create_service(service_name='service_2')
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, count=10)
create_ft_notification_status(date(2018, 10, 23), 'sms', service_1, count=8)
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, notification_status='created')
create_ft_notification_status(date(2018, 10, 29), 'email', service_1, count=3)
create_ft_notification_status(date(2018, 10, 26), 'letter', service_1, count=5)
# not included - too early
create_ft_notification_status(date(2018, 10, 22), 'sms', service_1)
# not included - wrong service
create_ft_notification_status(date(2018, 10, 29), 'sms', service_2)
# not included - test keys
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, key_type=KEY_TYPE_TEST)
results = fetch_notification_status_for_service_for_7_days(service_1.id)
assert len(results) == 5
assert results[2].bst_date == date(2018, 10, 29)
assert results[2].notification_type == 'email'
assert results[2].notification_status == 'delivered'
assert results[2].count == 3
assert results[1].bst_date == date(2018, 10, 26)
assert results[1].notification_type == 'letter'
assert results[1].notification_status == 'delivered'
assert results[1].count == 5
assert results[3].bst_date == date(2018, 10, 29)
assert results[3].notification_type == 'sms'
assert results[3].notification_status == 'created'
assert results[3].count == 1
assert results[0].bst_date == date(2018, 10, 23)
assert results[0].notification_type == 'sms'
assert results[0].notification_status == 'delivered'
assert results[0].count == 8
assert results[4].bst_date == date(2018, 10, 29)
assert results[4].notification_type == 'sms'
assert results[4].notification_status == 'delivered'
assert results[4].count == 10
def test_fetch_notification_status_for_service_for_day(notify_db_session):
service_1 = create_service(service_name='service_1')
service_2 = create_service(service_name='service_2')
@@ -224,3 +177,46 @@ def test_fetch_notification_status_for_service_for_day(notify_db_session):
assert results[1].notification_type == 'sms'
assert results[1].notification_status == 'delivered'
assert results[1].count == 1
@freeze_time('2018-10-31T18:00:00')
def test_fetch_notification_status_for_service_for_today_and_7_previous_days(notify_db_session):
service_1 = create_service(service_name='service_1')
sms_template = create_template(service=service_1, template_type=SMS_TYPE)
email_template = create_template(service=service_1, template_type=EMAIL_TYPE)
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, count=10)
create_ft_notification_status(date(2018, 10, 24), 'sms', service_1, count=8)
create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, notification_status='created')
create_ft_notification_status(date(2018, 10, 29), 'email', service_1, count=3)
create_ft_notification_status(date(2018, 10, 26), 'letter', service_1, count=5)
create_notification(sms_template, created_at=datetime(2018, 10, 31, 11, 0, 0))
create_notification(sms_template, created_at=datetime(2018, 10, 31, 12, 0, 0), status='delivered')
create_notification(email_template, created_at=datetime(2018, 10, 31, 13, 0, 0), status='delivered')
# too early, shouldn't be included
create_notification(service_1.templates[0], created_at=datetime(2018, 10, 30, 12, 0, 0), status='delivered')
results = sorted(
fetch_notification_status_for_service_for_today_and_7_previous_days(service_1.id),
key=lambda x: (x.notification_type, x.notification_status)
)
assert len(results) == 4
assert results[0].notification_type == 'email'
assert results[0].notification_status == 'delivered'
assert results[0].count == 4
assert results[1].notification_type == 'letter'
assert results[1].notification_status == 'delivered'
assert results[1].count == 5
assert results[2].notification_type == 'sms'
assert results[2].notification_status == 'created'
assert results[2].count == 2
assert results[3].notification_type == 'sms'
assert results[3].notification_status == 'delivered'
assert results[3].count == 19