diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index f64abfd60..082ea2313 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -69,6 +69,19 @@ def dao_get_notification_statistics_for_service_and_day(service_id, day): ).order_by(desc(NotificationStatistics.day)).first() +def dao_get_notification_statistics_for_service_and_previous_days(service_id, limit_days): + return NotificationStatistics.query.filter_by( + service_id=service_id + ).filter( + NotificationStatistics.day.in_(( + (date.today() - timedelta(days=days_ago)).strftime('%Y-%m-%d') + for days_ago in range(0, limit_days + 1) + )) + ).order_by( + desc(NotificationStatistics.day) + ).all() + + def dao_get_template_statistics_for_service(service_id, limit_days=None): filter = [TemplateStatistics.service_id == service_id] if limit_days: diff --git a/app/notifications_statistics/rest.py b/app/notifications_statistics/rest.py index 9eeb57e15..5f3a66483 100644 --- a/app/notifications_statistics/rest.py +++ b/app/notifications_statistics/rest.py @@ -4,7 +4,8 @@ from flask import ( ) from app.dao.notifications_dao import ( - dao_get_notification_statistics_for_service + dao_get_notification_statistics_for_service, + dao_get_notification_statistics_for_service_and_previous_days ) from app.schemas import notifications_statistics_schema @@ -19,7 +20,20 @@ register_errors(notifications_statistics) @notifications_statistics.route('', methods=['GET']) -def get_all_templates_for_service(service_id): - templates = dao_get_notification_statistics_for_service(service_id=service_id) - data, errors = notifications_statistics_schema.dump(templates, many=True) +def get_all_notification_statistics_for_service(service_id): + + if request.args.get('limit_days'): + try: + statistics = dao_get_notification_statistics_for_service_and_previous_days( + service_id=service_id, + limit_days=int(request.args['limit_days']) + ) + except ValueError as e: + error = '{} is not an integer'.format(request.args['limit_days']) + current_app.logger.error(error) + return jsonify(result="error", message={'limit_days': [error]}), 400 + else: + statistics = dao_get_notification_statistics_for_service(service_id=service_id) + + data, errors = notifications_statistics_schema.dump(statistics, many=True) return jsonify(data=data) diff --git a/tests/app/dao/test_notification_dao.py b/tests/app/dao/test_notification_dao.py index 265855486..a2acfd43b 100644 --- a/tests/app/dao/test_notification_dao.py +++ b/tests/app/dao/test_notification_dao.py @@ -26,6 +26,7 @@ from app.dao.notifications_dao import ( delete_notifications_created_more_than_a_day_ago, delete_notifications_created_more_than_a_week_ago, dao_get_notification_statistics_for_service_and_day, + dao_get_notification_statistics_for_service_and_previous_days, update_notification_status_by_id, update_notification_reference_by_id, update_notification_status_by_reference, @@ -279,6 +280,46 @@ def test_should_be_empty_list_if_no_statistics_for_a_service(sample_service): assert len(dao_get_notification_statistics_for_service(sample_service.id)) == 0 +def test_should_be_able_to_get_all_statistics_for_a_service_for_several_days_previous(sample_template): + data = { + 'to': '+44709123456', + 'service': sample_template.service, + 'service_id': sample_template.service.id, + 'template': sample_template, + 'template_id': sample_template.id + } + + today = datetime.utcnow() + seven_days_ago = datetime.utcnow() - timedelta(days=7) + eight_days_ago = datetime.utcnow() - timedelta(days=8) + data.update({ + 'created_at': today + }) + notification_1 = Notification(**data) + data.update({ + 'created_at': seven_days_ago + }) + notification_2 = Notification(**data) + data.update({ + 'created_at': eight_days_ago + }) + notification_3 = Notification(**data) + dao_create_notification(notification_1, sample_template.template_type) + dao_create_notification(notification_2, sample_template.template_type) + dao_create_notification(notification_3, sample_template.template_type) + + stats = dao_get_notification_statistics_for_service_and_previous_days( + sample_template.service.id, 7 + ) + assert len(stats) == 2 + assert stats[0].emails_requested == 0 + assert stats[0].sms_requested == 1 + assert stats[0].day == today.strftime(DATE_FORMAT) + assert stats[1].emails_requested == 0 + assert stats[1].sms_requested == 1 + assert stats[1].day == seven_days_ago.strftime(DATE_FORMAT) + + def test_save_notification_creates_sms_and_template_stats(sample_template, sample_job): assert Notification.query.count() == 0 assert NotificationStatistics.query.count() == 0