2016-07-11 16:48:32 +01:00
|
|
|
import uuid
|
2016-03-31 15:57:50 +01:00
|
|
|
from datetime import (
|
|
|
|
|
datetime,
|
|
|
|
|
timedelta,
|
|
|
|
|
date
|
|
|
|
|
)
|
|
|
|
|
|
2016-03-01 13:30:10 +00:00
|
|
|
from flask import current_app
|
2016-04-04 13:13:29 +01:00
|
|
|
from werkzeug.datastructures import MultiDict
|
2016-07-11 16:48:32 +01:00
|
|
|
from sqlalchemy import (desc, func, Integer, or_, and_, asc)
|
2016-08-09 13:07:48 +01:00
|
|
|
from sqlalchemy.orm import joinedload
|
2016-07-11 16:48:32 +01:00
|
|
|
from sqlalchemy.sql.expression import cast
|
2016-03-31 15:57:50 +01:00
|
|
|
|
2016-02-09 12:01:17 +00:00
|
|
|
from app import db
|
2016-05-25 11:13:49 +01:00
|
|
|
from app.dao import days_ago
|
2016-03-21 12:37:34 +00:00
|
|
|
from app.models import (
|
2016-05-20 15:16:53 +01:00
|
|
|
Service,
|
2016-03-21 12:37:34 +00:00
|
|
|
Notification,
|
2016-07-08 16:19:34 +01:00
|
|
|
NotificationHistory,
|
2016-03-21 12:37:34 +00:00
|
|
|
Job,
|
|
|
|
|
NotificationStatistics,
|
2016-03-31 15:57:50 +01:00
|
|
|
TemplateStatistics,
|
2016-06-29 11:50:54 +01:00
|
|
|
SMS_TYPE,
|
|
|
|
|
EMAIL_TYPE,
|
2016-04-21 11:37:38 +01:00
|
|
|
Template,
|
2016-05-06 09:09:47 +01:00
|
|
|
ProviderStatistics,
|
|
|
|
|
ProviderDetails)
|
2016-03-31 15:57:50 +01:00
|
|
|
from app.clients import (
|
|
|
|
|
STATISTICS_FAILURE,
|
|
|
|
|
STATISTICS_DELIVERED,
|
|
|
|
|
STATISTICS_REQUESTED
|
|
|
|
|
)
|
2016-04-14 15:09:59 +01:00
|
|
|
from app.dao.dao_utils import transactional
|
2016-08-05 10:44:43 +01:00
|
|
|
from app.statsd_decorators import statsd
|
2016-04-04 12:21:38 +01:00
|
|
|
|
2016-02-09 12:01:17 +00:00
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-04-27 10:58:08 +01:00
|
|
|
def dao_get_notification_statistics_for_service(service_id, limit_days=None):
|
2016-05-24 11:31:44 +01:00
|
|
|
query_filter = [NotificationStatistics.service_id == service_id]
|
2016-04-27 10:58:08 +01:00
|
|
|
if limit_days is not None:
|
2016-05-24 11:31:44 +01:00
|
|
|
query_filter.append(NotificationStatistics.day >= days_ago(limit_days))
|
2016-04-27 10:58:08 +01:00
|
|
|
return NotificationStatistics.query.filter(
|
2016-05-24 11:31:44 +01:00
|
|
|
*query_filter
|
2016-04-27 10:58:08 +01:00
|
|
|
).order_by(
|
|
|
|
|
desc(NotificationStatistics.day)
|
|
|
|
|
).all()
|
2016-03-08 16:34:03 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-03-09 11:06:37 +00:00
|
|
|
def dao_get_notification_statistics_for_service_and_day(service_id, day):
|
|
|
|
|
return NotificationStatistics.query.filter_by(
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
day=day
|
|
|
|
|
).order_by(desc(NotificationStatistics.day)).first()
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-19 16:42:21 +01:00
|
|
|
def dao_get_notification_statistics_for_day(day):
|
2016-05-24 11:31:44 +01:00
|
|
|
return NotificationStatistics.query.filter_by(day=day).all()
|
2016-05-19 16:42:21 +01:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-20 15:16:53 +01:00
|
|
|
def dao_get_potential_notification_statistics_for_day(day):
|
|
|
|
|
all_services = db.session.query(
|
|
|
|
|
Service.id,
|
|
|
|
|
NotificationStatistics
|
|
|
|
|
).outerjoin(
|
2016-05-26 16:46:16 +01:00
|
|
|
NotificationStatistics,
|
|
|
|
|
and_(
|
|
|
|
|
Service.id == NotificationStatistics.service_id,
|
|
|
|
|
or_(
|
|
|
|
|
NotificationStatistics.day == day,
|
|
|
|
|
NotificationStatistics.day == None # noqa
|
|
|
|
|
)
|
2016-05-20 15:16:53 +01:00
|
|
|
)
|
|
|
|
|
).order_by(
|
|
|
|
|
asc(Service.created_at)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
notification_statistics = []
|
|
|
|
|
for service_notification_stats_pair in all_services:
|
|
|
|
|
if service_notification_stats_pair.NotificationStatistics:
|
|
|
|
|
notification_statistics.append(
|
|
|
|
|
service_notification_stats_pair.NotificationStatistics
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
notification_statistics.append(
|
|
|
|
|
create_notification_statistics_dict(
|
|
|
|
|
service_notification_stats_pair,
|
|
|
|
|
day
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
return notification_statistics
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_notification_statistics_dict(service_id, day):
|
|
|
|
|
return {
|
|
|
|
|
'id': None,
|
|
|
|
|
'emails_requested': 0,
|
|
|
|
|
'emails_delivered': 0,
|
|
|
|
|
'emails_failed': 0,
|
|
|
|
|
'sms_requested': 0,
|
|
|
|
|
'sms_delivered': 0,
|
|
|
|
|
'sms_failed': 0,
|
|
|
|
|
'day': day.isoformat(),
|
|
|
|
|
'service': service_id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-05 10:45:47 +01:00
|
|
|
def dao_get_7_day_agg_notification_statistics_for_service(service_id,
|
|
|
|
|
date_from,
|
|
|
|
|
week_count=52):
|
|
|
|
|
doy = date_from.timetuple().tm_yday
|
|
|
|
|
return db.session.query(
|
|
|
|
|
cast(func.floor((func.extract('doy', NotificationStatistics.day) - doy) / 7), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.emails_requested), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.emails_delivered), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.emails_failed), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.sms_requested), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.sms_delivered), Integer),
|
|
|
|
|
cast(func.sum(NotificationStatistics.sms_failed), Integer)
|
|
|
|
|
).filter(
|
|
|
|
|
NotificationStatistics.service_id == service_id
|
|
|
|
|
).filter(
|
|
|
|
|
NotificationStatistics.day >= date_from
|
|
|
|
|
).filter(
|
|
|
|
|
NotificationStatistics.day < date_from + timedelta(days=7 * week_count)
|
|
|
|
|
).group_by(
|
|
|
|
|
func.floor(((func.extract('doy', NotificationStatistics.day) - doy) / 7))
|
|
|
|
|
).order_by(
|
|
|
|
|
desc(func.floor(((func.extract('doy', NotificationStatistics.day) - doy) / 7)))
|
|
|
|
|
).limit(
|
|
|
|
|
week_count
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2016-08-18 12:06:00 +01:00
|
|
|
@statsd(namespace="dao")
|
|
|
|
|
def dao_get_template_usage(service_id, limit_days=None):
|
|
|
|
|
|
2016-08-22 10:38:44 +01:00
|
|
|
table = NotificationHistory
|
|
|
|
|
|
|
|
|
|
if limit_days and limit_days <= 7: # can get this data from notifications table
|
|
|
|
|
table = Notification
|
|
|
|
|
|
2016-08-18 12:06:00 +01:00
|
|
|
query = db.session.query(
|
2016-08-22 10:38:44 +01:00
|
|
|
func.count(table.template_id).label('count'),
|
|
|
|
|
table.template_id,
|
2016-08-18 12:06:00 +01:00
|
|
|
Template.name,
|
|
|
|
|
Template.template_type
|
|
|
|
|
)
|
|
|
|
|
|
2016-08-22 10:38:44 +01:00
|
|
|
query_filter = [table.service_id == service_id]
|
2016-08-18 12:06:00 +01:00
|
|
|
if limit_days is not None:
|
2016-08-22 10:38:44 +01:00
|
|
|
query_filter.append(table.created_at >= days_ago(limit_days))
|
2016-08-18 12:06:00 +01:00
|
|
|
|
|
|
|
|
return query.filter(*query_filter) \
|
|
|
|
|
.join(Template)\
|
2016-08-22 10:38:44 +01:00
|
|
|
.group_by(table.template_id, Template.name, Template.template_type)\
|
|
|
|
|
.order_by(asc(Template.name))\
|
|
|
|
|
.all()
|
2016-08-18 12:06:00 +01:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-04-04 12:21:38 +01:00
|
|
|
def dao_get_template_statistics_for_service(service_id, limit_days=None):
|
2016-05-24 11:31:44 +01:00
|
|
|
query_filter = [TemplateStatistics.service_id == service_id]
|
2016-04-27 10:58:08 +01:00
|
|
|
if limit_days is not None:
|
2016-05-24 11:31:44 +01:00
|
|
|
query_filter.append(TemplateStatistics.day >= days_ago(limit_days))
|
|
|
|
|
return TemplateStatistics.query.filter(*query_filter).order_by(
|
2016-04-06 14:30:13 +01:00
|
|
|
desc(TemplateStatistics.updated_at)).all()
|
2016-04-04 12:21:38 +01:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-06-07 14:18:42 +01:00
|
|
|
def dao_get_template_statistics_for_template(template_id):
|
|
|
|
|
return TemplateStatistics.query.filter(
|
|
|
|
|
TemplateStatistics.template_id == template_id
|
2016-06-09 11:21:48 +01:00
|
|
|
).order_by(
|
|
|
|
|
desc(TemplateStatistics.updated_at)
|
2016-06-07 14:18:42 +01:00
|
|
|
).all()
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-04-04 12:21:38 +01:00
|
|
|
@transactional
|
2016-06-03 14:54:46 +01:00
|
|
|
def dao_create_notification(notification, notification_type):
|
2016-04-04 12:21:38 +01:00
|
|
|
if notification.job_id:
|
|
|
|
|
db.session.query(Job).filter_by(
|
|
|
|
|
id=notification.job_id
|
|
|
|
|
).update({
|
|
|
|
|
Job.notifications_sent: Job.notifications_sent + 1,
|
|
|
|
|
Job.updated_at: datetime.utcnow()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
update_count = db.session.query(NotificationStatistics).filter_by(
|
2016-04-20 15:38:06 +01:00
|
|
|
day=notification.created_at.date(),
|
2016-04-04 12:21:38 +01:00
|
|
|
service_id=notification.service_id
|
2016-05-26 16:46:00 +01:00
|
|
|
).update(_update_notification_stats_query(notification_type, 'requested'))
|
2016-04-04 12:21:38 +01:00
|
|
|
|
|
|
|
|
if update_count == 0:
|
|
|
|
|
stats = NotificationStatistics(
|
2016-04-20 15:38:06 +01:00
|
|
|
day=notification.created_at.date(),
|
2016-03-31 15:57:50 +01:00
|
|
|
service_id=notification.service_id,
|
2016-06-29 11:50:54 +01:00
|
|
|
sms_requested=1 if notification_type == SMS_TYPE else 0,
|
|
|
|
|
emails_requested=1 if notification_type == EMAIL_TYPE else 0
|
2016-04-04 12:21:38 +01:00
|
|
|
)
|
|
|
|
|
db.session.add(stats)
|
|
|
|
|
|
|
|
|
|
update_count = db.session.query(TemplateStatistics).filter_by(
|
|
|
|
|
day=date.today(),
|
|
|
|
|
service_id=notification.service_id,
|
|
|
|
|
template_id=notification.template_id
|
2016-04-06 14:30:13 +01:00
|
|
|
).update({'usage_count': TemplateStatistics.usage_count + 1, 'updated_at': datetime.utcnow()})
|
2016-04-04 12:21:38 +01:00
|
|
|
|
|
|
|
|
if update_count == 0:
|
|
|
|
|
template_stats = TemplateStatistics(template_id=notification.template_id,
|
|
|
|
|
service_id=notification.service_id)
|
|
|
|
|
db.session.add(template_stats)
|
|
|
|
|
|
2016-07-11 16:48:32 +01:00
|
|
|
if not notification.id:
|
|
|
|
|
# need to populate defaulted fields before we create the notification history object
|
|
|
|
|
notification.id = uuid.uuid4()
|
|
|
|
|
if not notification.status:
|
|
|
|
|
notification.status = 'created'
|
|
|
|
|
|
2016-07-08 16:19:34 +01:00
|
|
|
notification_history = NotificationHistory.from_notification(notification)
|
|
|
|
|
|
2016-04-04 12:21:38 +01:00
|
|
|
db.session.add(notification)
|
2016-07-08 16:19:34 +01:00
|
|
|
db.session.add(notification_history)
|
2016-03-08 15:23:19 +00:00
|
|
|
|
|
|
|
|
|
2016-05-26 16:46:00 +01:00
|
|
|
def _update_notification_stats_query(notification_type, status):
|
2016-03-15 14:40:42 +00:00
|
|
|
mapping = {
|
2016-06-29 11:50:54 +01:00
|
|
|
SMS_TYPE: {
|
2016-03-21 13:24:37 +00:00
|
|
|
STATISTICS_REQUESTED: NotificationStatistics.sms_requested,
|
|
|
|
|
STATISTICS_DELIVERED: NotificationStatistics.sms_delivered,
|
2016-04-08 16:13:10 +01:00
|
|
|
STATISTICS_FAILURE: NotificationStatistics.sms_failed
|
2016-03-15 14:40:42 +00:00
|
|
|
},
|
2016-06-29 11:50:54 +01:00
|
|
|
EMAIL_TYPE: {
|
2016-03-21 13:24:37 +00:00
|
|
|
STATISTICS_REQUESTED: NotificationStatistics.emails_requested,
|
|
|
|
|
STATISTICS_DELIVERED: NotificationStatistics.emails_delivered,
|
2016-04-08 16:13:10 +01:00
|
|
|
STATISTICS_FAILURE: NotificationStatistics.emails_failed
|
2016-03-08 16:34:03 +00:00
|
|
|
}
|
2016-03-15 14:40:42 +00:00
|
|
|
}
|
|
|
|
|
return {
|
|
|
|
|
mapping[notification_type][status]: mapping[notification_type][status] + 1
|
|
|
|
|
}
|
2016-03-08 16:34:03 +00:00
|
|
|
|
|
|
|
|
|
2016-05-24 11:31:44 +01:00
|
|
|
def _update_statistics(notification, notification_statistics_status):
|
2016-05-31 10:17:15 +01:00
|
|
|
if notification.job_id:
|
2016-06-13 11:38:25 +01:00
|
|
|
db.session.query(Job).filter_by(
|
|
|
|
|
id=notification.job_id
|
|
|
|
|
).update(_update_job_stats_query(notification_statistics_status))
|
2016-05-31 10:17:15 +01:00
|
|
|
|
2016-05-24 11:31:44 +01:00
|
|
|
db.session.query(NotificationStatistics).filter_by(
|
|
|
|
|
day=notification.created_at.date(),
|
|
|
|
|
service_id=notification.service_id
|
|
|
|
|
).update(
|
2016-06-29 12:12:35 +01:00
|
|
|
_update_notification_stats_query(notification.notification_type, notification_statistics_status)
|
2016-05-24 11:31:44 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2016-05-26 16:46:00 +01:00
|
|
|
def _update_job_stats_query(status):
|
2016-05-24 11:31:44 +01:00
|
|
|
mapping = {
|
|
|
|
|
STATISTICS_FAILURE: Job.notifications_failed,
|
|
|
|
|
STATISTICS_DELIVERED: Job.notifications_delivered
|
|
|
|
|
}
|
|
|
|
|
return {mapping[status]: mapping[status] + 1}
|
|
|
|
|
|
|
|
|
|
|
2016-05-27 12:09:36 +01:00
|
|
|
def _decide_permanent_temporary_failure(current_status, status):
|
2016-05-26 16:46:00 +01:00
|
|
|
# Firetext will send pending, then send either succes or fail.
|
|
|
|
|
# If we go from pending to delivered we need to set failure type as temporary-failure
|
2016-05-27 12:09:36 +01:00
|
|
|
if current_status == 'pending':
|
2016-05-26 16:46:00 +01:00
|
|
|
if status == 'permanent-failure':
|
|
|
|
|
status = 'temporary-failure'
|
|
|
|
|
return status
|
|
|
|
|
|
2016-02-09 12:01:17 +00:00
|
|
|
|
2016-05-27 12:09:36 +01:00
|
|
|
def _update_notification_status(notification, status, notification_statistics_status):
|
|
|
|
|
status = _decide_permanent_temporary_failure(current_status=notification.status, status=status)
|
2016-05-26 16:46:00 +01:00
|
|
|
|
2016-05-31 10:17:15 +01:00
|
|
|
if notification_statistics_status:
|
2016-05-24 11:31:44 +01:00
|
|
|
_update_statistics(notification, notification_statistics_status)
|
2016-03-15 14:40:42 +00:00
|
|
|
|
2016-07-11 16:48:32 +01:00
|
|
|
notification.status = status
|
|
|
|
|
dao_update_notification(notification)
|
2016-05-31 10:17:15 +01:00
|
|
|
return True
|
2016-03-10 17:29:17 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-27 12:09:36 +01:00
|
|
|
@transactional
|
|
|
|
|
def update_notification_status_by_id(notification_id, status, notification_statistics_status=None):
|
2016-07-08 14:48:07 +01:00
|
|
|
notification = Notification.query.with_lockmode("update").filter(
|
2016-06-13 11:38:25 +01:00
|
|
|
Notification.id == notification_id,
|
2016-06-22 14:42:55 +01:00
|
|
|
or_(Notification.status == 'created',
|
|
|
|
|
Notification.status == 'sending',
|
2016-06-13 11:38:25 +01:00
|
|
|
Notification.status == 'pending')).first()
|
2016-05-27 12:09:36 +01:00
|
|
|
|
2016-05-31 10:17:15 +01:00
|
|
|
if not notification:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return _update_notification_status(
|
|
|
|
|
notification=notification,
|
|
|
|
|
status=status,
|
|
|
|
|
notification_statistics_status=notification_statistics_status
|
|
|
|
|
)
|
2016-03-21 13:24:37 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-27 12:09:36 +01:00
|
|
|
@transactional
|
|
|
|
|
def update_notification_status_by_reference(reference, status, notification_statistics_status):
|
|
|
|
|
notification = Notification.query.filter(Notification.reference == reference,
|
|
|
|
|
or_(Notification.status == 'sending',
|
|
|
|
|
Notification.status == 'pending')
|
|
|
|
|
).first()
|
2016-05-31 10:17:15 +01:00
|
|
|
if not notification:
|
|
|
|
|
return False
|
2016-05-27 12:09:36 +01:00
|
|
|
|
2016-05-31 10:17:15 +01:00
|
|
|
return _update_notification_status(
|
|
|
|
|
notification=notification,
|
|
|
|
|
status=status,
|
|
|
|
|
notification_statistics_status=notification_statistics_status
|
|
|
|
|
)
|
2016-03-11 09:40:35 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-26 16:46:00 +01:00
|
|
|
def dao_update_notification(notification):
|
|
|
|
|
notification.updated_at = datetime.utcnow()
|
2016-07-08 16:19:34 +01:00
|
|
|
notification_history = NotificationHistory.query.get(notification.id)
|
|
|
|
|
notification_history.update_from_notification(notification)
|
2016-05-26 16:46:00 +01:00
|
|
|
db.session.add(notification)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-06-01 12:42:19 +01:00
|
|
|
@transactional
|
2016-06-02 09:52:47 +01:00
|
|
|
def update_provider_stats(
|
|
|
|
|
id_,
|
|
|
|
|
notification_type,
|
2016-06-03 14:54:46 +01:00
|
|
|
provider_name,
|
2016-08-03 17:22:20 +01:00
|
|
|
billable_units=1):
|
2016-06-01 12:42:19 +01:00
|
|
|
notification = Notification.query.filter(Notification.id == id_).one()
|
2016-06-02 09:52:47 +01:00
|
|
|
provider = ProviderDetails.query.filter_by(identifier=provider_name).one()
|
2016-06-02 09:17:06 +01:00
|
|
|
|
2016-06-01 12:42:19 +01:00
|
|
|
update_count = db.session.query(ProviderStatistics).filter_by(
|
|
|
|
|
day=date.today(),
|
|
|
|
|
service_id=notification.service_id,
|
|
|
|
|
provider_id=provider.id
|
2016-08-03 17:22:20 +01:00
|
|
|
).update({'unit_count': ProviderStatistics.unit_count + billable_units})
|
2016-06-01 12:42:19 +01:00
|
|
|
|
|
|
|
|
if update_count == 0:
|
|
|
|
|
provider_stats = ProviderStatistics(
|
|
|
|
|
day=notification.created_at.date(),
|
|
|
|
|
service_id=notification.service_id,
|
|
|
|
|
provider_id=provider.id,
|
2016-08-03 17:22:20 +01:00
|
|
|
unit_count=billable_units
|
2016-06-02 09:17:06 +01:00
|
|
|
)
|
|
|
|
|
|
2016-06-01 12:42:19 +01:00
|
|
|
db.session.add(provider_stats)
|
2016-03-11 09:40:35 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-02-16 11:22:44 +00:00
|
|
|
def get_notification_for_job(service_id, job_id, notification_id):
|
2016-02-09 14:17:42 +00:00
|
|
|
return Notification.query.filter_by(service_id=service_id, job_id=job_id, id=notification_id).one()
|
2016-02-09 12:01:17 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-04-19 10:52:52 +01:00
|
|
|
def get_notifications_for_job(service_id, job_id, filter_dict=None, page=1, page_size=None):
|
|
|
|
|
if page_size is None:
|
|
|
|
|
page_size = current_app.config['PAGE_SIZE']
|
2016-03-21 12:37:34 +00:00
|
|
|
query = Notification.query.filter_by(service_id=service_id, job_id=job_id)
|
2016-05-24 11:31:44 +01:00
|
|
|
query = _filter_query(query, filter_dict)
|
2016-05-19 10:46:03 +01:00
|
|
|
return query.order_by(asc(Notification.job_row_number)).paginate(
|
2016-03-04 14:25:28 +00:00
|
|
|
page=page,
|
2016-04-19 10:52:52 +01:00
|
|
|
per_page=page_size
|
2016-03-04 14:25:28 +00:00
|
|
|
)
|
2016-02-16 11:22:44 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-08-09 13:07:48 +01:00
|
|
|
def get_notification_with_personalisation(service_id, notification_id, key_type):
|
2016-06-30 18:43:15 +01:00
|
|
|
filter_dict = {'service_id': service_id, 'id': notification_id}
|
|
|
|
|
if key_type:
|
|
|
|
|
filter_dict['key_type'] = key_type
|
|
|
|
|
|
2016-08-10 16:57:27 +01:00
|
|
|
return Notification.query.filter_by(**filter_dict).options(joinedload('template_history')).one()
|
2016-03-01 13:30:10 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-03-10 15:40:41 +00:00
|
|
|
def get_notification_by_id(notification_id):
|
|
|
|
|
return Notification.query.filter_by(id=notification_id).first()
|
|
|
|
|
|
|
|
|
|
|
2016-06-08 15:25:57 +01:00
|
|
|
def get_notifications(filter_dict=None):
|
|
|
|
|
return _filter_query(Notification.query, filter_dict=filter_dict)
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-05-06 11:07:11 +01:00
|
|
|
def get_notifications_for_service(service_id,
|
|
|
|
|
filter_dict=None,
|
|
|
|
|
page=1,
|
|
|
|
|
page_size=None,
|
2016-06-30 18:43:15 +01:00
|
|
|
limit_days=None,
|
2016-08-09 13:07:48 +01:00
|
|
|
key_type=None,
|
|
|
|
|
personalisation=False):
|
2016-04-19 10:52:52 +01:00
|
|
|
if page_size is None:
|
|
|
|
|
page_size = current_app.config['PAGE_SIZE']
|
2016-04-28 16:10:35 +01:00
|
|
|
filters = [Notification.service_id == service_id]
|
|
|
|
|
|
|
|
|
|
if limit_days is not None:
|
|
|
|
|
days_ago = date.today() - timedelta(days=limit_days)
|
|
|
|
|
filters.append(func.date(Notification.created_at) >= days_ago)
|
|
|
|
|
|
2016-06-30 18:43:15 +01:00
|
|
|
if key_type is not None:
|
|
|
|
|
filters.append(Notification.key_type == key_type)
|
|
|
|
|
|
2016-04-28 16:10:35 +01:00
|
|
|
query = Notification.query.filter(*filters)
|
2016-05-24 11:31:44 +01:00
|
|
|
query = _filter_query(query, filter_dict)
|
2016-08-09 13:07:48 +01:00
|
|
|
if personalisation:
|
2016-08-09 16:53:09 +01:00
|
|
|
query = query.options(
|
2016-08-10 16:57:27 +01:00
|
|
|
joinedload('template_history')
|
2016-08-09 13:07:48 +01:00
|
|
|
)
|
2016-05-06 11:07:11 +01:00
|
|
|
return query.order_by(desc(Notification.created_at)).paginate(
|
2016-03-01 13:30:10 +00:00
|
|
|
page=page,
|
2016-04-19 10:52:52 +01:00
|
|
|
per_page=page_size
|
2016-03-01 13:30:10 +00:00
|
|
|
)
|
2016-03-21 12:37:34 +00:00
|
|
|
|
|
|
|
|
|
2016-05-24 11:31:44 +01:00
|
|
|
def _filter_query(query, filter_dict=None):
|
2016-04-04 13:13:29 +01:00
|
|
|
if filter_dict is None:
|
|
|
|
|
filter_dict = MultiDict()
|
|
|
|
|
else:
|
|
|
|
|
filter_dict = MultiDict(filter_dict)
|
|
|
|
|
statuses = filter_dict.getlist('status') if 'status' in filter_dict else None
|
|
|
|
|
if statuses:
|
|
|
|
|
query = query.filter(Notification.status.in_(statuses))
|
|
|
|
|
template_types = filter_dict.getlist('template_type') if 'template_type' in filter_dict else None
|
|
|
|
|
if template_types:
|
|
|
|
|
query = query.join(Template).filter(Template.template_type.in_(template_types))
|
2016-03-01 13:30:10 +00:00
|
|
|
return query
|
2016-03-09 17:46:01 +00:00
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
@statsd(namespace="dao")
|
2016-04-05 11:07:21 +01:00
|
|
|
def delete_notifications_created_more_than_a_week_ago(status):
|
2016-04-25 16:12:46 +01:00
|
|
|
seven_days_ago = date.today() - timedelta(days=7)
|
2016-03-09 17:46:01 +00:00
|
|
|
deleted = db.session.query(Notification).filter(
|
2016-04-25 16:12:46 +01:00
|
|
|
func.date(Notification.created_at) < seven_days_ago,
|
2016-04-05 11:07:21 +01:00
|
|
|
Notification.status == status
|
2016-04-25 16:12:46 +01:00
|
|
|
).delete(synchronize_session='fetch')
|
2016-03-09 17:46:01 +00:00
|
|
|
db.session.commit()
|
|
|
|
|
return deleted
|