add dao function to get notification stats for a server for toady only

This commit is contained in:
Leo Hemsted
2016-07-22 15:16:24 +01:00
parent 95af32f289
commit fd96c854e1
3 changed files with 37 additions and 3 deletions

View File

@@ -1,4 +1,5 @@
import uuid import uuid
from datetime import date
from sqlalchemy import asc, func from sqlalchemy import asc, func
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
@@ -136,6 +137,16 @@ def delete_service_and_all_associated_db_objects(service):
def dao_fetch_stats_for_service(service_id): def dao_fetch_stats_for_service(service_id):
return _stats_for_service_query(service_id).all()
def dao_fetch_todays_stats_for_service(service_id):
return _stats_for_service_query(service_id).filter(
func.date(Notification.created_at) == date.today()
).all()
def _stats_for_service_query(service_id):
return db.session.query( return db.session.query(
Notification.notification_type, Notification.notification_type,
Notification.status, Notification.status,
@@ -145,4 +156,4 @@ def dao_fetch_stats_for_service(service_id):
).group_by( ).group_by(
Notification.notification_type, Notification.notification_type,
Notification.status, Notification.status,
).all() )

View File

@@ -319,12 +319,14 @@ def sample_notification(notify_db,
to_field=None, to_field=None,
status='created', status='created',
reference=None, reference=None,
created_at=datetime.utcnow(), created_at=None,
content_char_count=160, content_char_count=160,
create=True, create=True,
personalisation=None, personalisation=None,
api_key_id=None, api_key_id=None,
key_type=KEY_TYPE_NORMAL): key_type=KEY_TYPE_NORMAL):
if created_at is None:
created_at = datetime.utcnow()
if service is None: if service is None:
service = sample_service(notify_db, notify_db_session) service = sample_service(notify_db, notify_db_session)
if template is None: if template is None:

View File

@@ -3,6 +3,7 @@ import pytest
from sqlalchemy.orm.exc import FlushError, NoResultFound from sqlalchemy.orm.exc import FlushError, NoResultFound
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from freezegun import freeze_time
from app import db from app import db
from app.dao.services_dao import ( from app.dao.services_dao import (
@@ -14,7 +15,8 @@ from app.dao.services_dao import (
dao_fetch_all_services_by_user, dao_fetch_all_services_by_user,
dao_update_service, dao_update_service,
delete_service_and_all_associated_db_objects, delete_service_and_all_associated_db_objects,
dao_fetch_stats_for_service dao_fetch_stats_for_service,
dao_fetch_todays_stats_for_service
) )
from app.dao.users_dao import save_model_user from app.dao.users_dao import save_model_user
from app.models import ( from app.models import (
@@ -420,3 +422,22 @@ def test_fetch_stats_counts_correctly(notify_db, notify_db_session, sample_templ
assert stats[2].notification_type == 'sms' assert stats[2].notification_type == 'sms'
assert stats[2].status == 'created' assert stats[2].status == 'created'
assert stats[2].count == 1 assert stats[2].count == 1
def test_fetch_stats_for_today_only_includes_today(notify_db, notify_db_session, sample_template):
# two created email, one failed email, and one created sms
with freeze_time('2001-01-01T23:59:00'):
just_before_midnight_yesterday = create_notification(notify_db, None, to_field='1', status='delivered')
with freeze_time('2001-01-02T00:01:00'):
just_after_midnight_today = create_notification(notify_db, None, to_field='2', status='failed')
with freeze_time('2001-01-02T12:00:00'):
right_now = create_notification(notify_db, None, to_field='3', status='created')
stats = dao_fetch_todays_stats_for_service(sample_template.service.id)
stats = {row.status: row.count for row in stats}
assert 'delivered' not in stats
assert stats['failed'] == 1
assert stats['created'] == 1