2016-03-31 15:57:50 +01:00
|
|
|
from sqlalchemy import desc
|
|
|
|
|
from datetime import (
|
|
|
|
|
datetime,
|
|
|
|
|
timedelta,
|
|
|
|
|
date
|
|
|
|
|
)
|
|
|
|
|
|
2016-03-01 13:30:10 +00:00
|
|
|
from flask import current_app
|
2016-03-31 15:57:50 +01:00
|
|
|
|
2016-02-09 12:01:17 +00:00
|
|
|
from app import db
|
2016-03-21 12:37:34 +00:00
|
|
|
from app.models import (
|
|
|
|
|
Notification,
|
|
|
|
|
Job,
|
|
|
|
|
NotificationStatistics,
|
2016-03-31 15:57:50 +01:00
|
|
|
TemplateStatistics,
|
2016-03-21 12:37:34 +00:00
|
|
|
TEMPLATE_TYPE_SMS,
|
|
|
|
|
TEMPLATE_TYPE_EMAIL,
|
2016-03-31 15:57:50 +01:00
|
|
|
Template
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
from app.clients import (
|
|
|
|
|
STATISTICS_FAILURE,
|
|
|
|
|
STATISTICS_DELIVERED,
|
|
|
|
|
STATISTICS_REQUESTED
|
|
|
|
|
)
|
2016-03-21 13:24:37 +00:00
|
|
|
|
2016-02-09 12:01:17 +00:00
|
|
|
|
2016-03-08 16:34:03 +00:00
|
|
|
def dao_get_notification_statistics_for_service(service_id):
|
|
|
|
|
return NotificationStatistics.query.filter_by(
|
|
|
|
|
service_id=service_id
|
|
|
|
|
).order_by(desc(NotificationStatistics.day)).all()
|
|
|
|
|
|
|
|
|
|
|
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-03-08 15:23:19 +00:00
|
|
|
def dao_create_notification(notification, notification_type):
|
|
|
|
|
try:
|
|
|
|
|
if notification.job_id:
|
2016-03-14 11:45:21 +00:00
|
|
|
db.session.query(Job).filter_by(
|
|
|
|
|
id=notification.job_id
|
|
|
|
|
).update({
|
|
|
|
|
Job.notifications_sent: Job.notifications_sent + 1,
|
|
|
|
|
Job.updated_at: datetime.utcnow()
|
|
|
|
|
})
|
2016-03-08 15:23:19 +00:00
|
|
|
|
2016-03-15 14:40:42 +00:00
|
|
|
update_count = db.session.query(NotificationStatistics).filter_by(
|
|
|
|
|
day=notification.created_at.strftime('%Y-%m-%d'),
|
|
|
|
|
service_id=notification.service_id
|
|
|
|
|
).update(update_query(notification_type, 'requested'))
|
|
|
|
|
|
|
|
|
|
if update_count == 0:
|
2016-03-08 16:34:03 +00:00
|
|
|
stats = NotificationStatistics(
|
|
|
|
|
day=notification.created_at.strftime('%Y-%m-%d'),
|
2016-03-08 15:23:19 +00:00
|
|
|
service_id=notification.service_id,
|
|
|
|
|
sms_requested=1 if notification_type == TEMPLATE_TYPE_SMS else 0,
|
|
|
|
|
emails_requested=1 if notification_type == TEMPLATE_TYPE_EMAIL else 0
|
|
|
|
|
)
|
|
|
|
|
db.session.add(stats)
|
2016-03-31 15:57:50 +01:00
|
|
|
|
|
|
|
|
update_count = db.session.query(TemplateStatistics).filter_by(
|
|
|
|
|
day=date.today(),
|
|
|
|
|
service_id=notification.service_id,
|
|
|
|
|
template_id=notification.template_id
|
|
|
|
|
).update({'usage_count': TemplateStatistics.usage_count + 1})
|
|
|
|
|
|
|
|
|
|
if update_count == 0:
|
|
|
|
|
template_stats = TemplateStatistics(template_id=notification.template_id,
|
|
|
|
|
service_id=notification.service_id)
|
|
|
|
|
db.session.add(template_stats)
|
|
|
|
|
|
2016-03-08 15:23:19 +00:00
|
|
|
db.session.add(notification)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
except:
|
|
|
|
|
db.session.rollback()
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
2016-03-15 14:40:42 +00:00
|
|
|
def update_query(notification_type, status):
|
|
|
|
|
mapping = {
|
2016-03-21 13:24:37 +00:00
|
|
|
TEMPLATE_TYPE_SMS: {
|
|
|
|
|
STATISTICS_REQUESTED: NotificationStatistics.sms_requested,
|
|
|
|
|
STATISTICS_DELIVERED: NotificationStatistics.sms_delivered,
|
|
|
|
|
STATISTICS_FAILURE: NotificationStatistics.sms_error
|
2016-03-15 14:40:42 +00:00
|
|
|
},
|
2016-03-21 13:24:37 +00:00
|
|
|
TEMPLATE_TYPE_EMAIL: {
|
|
|
|
|
STATISTICS_REQUESTED: NotificationStatistics.emails_requested,
|
|
|
|
|
STATISTICS_DELIVERED: NotificationStatistics.emails_delivered,
|
|
|
|
|
STATISTICS_FAILURE: NotificationStatistics.emails_error
|
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-02-25 09:59:50 +00:00
|
|
|
def dao_update_notification(notification):
|
2016-03-11 09:40:35 +00:00
|
|
|
notification.updated_at = datetime.utcnow()
|
2016-02-25 09:59:50 +00:00
|
|
|
db.session.add(notification)
|
2016-02-09 12:01:17 +00:00
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
|
2016-03-21 13:24:37 +00:00
|
|
|
def update_notification_status_by_id(notification_id, status, notification_statistics_status):
|
2016-03-10 17:29:17 +00:00
|
|
|
count = db.session.query(Notification).filter_by(
|
|
|
|
|
id=notification_id
|
|
|
|
|
).update({
|
2016-03-14 11:45:21 +00:00
|
|
|
Notification.status: status
|
2016-03-10 17:29:17 +00:00
|
|
|
})
|
2016-03-21 13:24:37 +00:00
|
|
|
|
|
|
|
|
if count == 1 and notification_statistics_status:
|
2016-03-15 14:40:42 +00:00
|
|
|
notification = Notification.query.get(notification_id)
|
2016-03-21 13:24:37 +00:00
|
|
|
|
2016-03-15 14:40:42 +00:00
|
|
|
db.session.query(NotificationStatistics).filter_by(
|
|
|
|
|
day=notification.created_at.strftime('%Y-%m-%d'),
|
|
|
|
|
service_id=notification.service_id
|
2016-03-21 13:24:37 +00:00
|
|
|
).update(
|
|
|
|
|
update_query(notification.template.template_type, notification_statistics_status)
|
|
|
|
|
)
|
2016-03-15 14:40:42 +00:00
|
|
|
|
2016-03-10 17:29:17 +00:00
|
|
|
db.session.commit()
|
|
|
|
|
return count
|
|
|
|
|
|
|
|
|
|
|
2016-03-21 13:24:37 +00:00
|
|
|
def update_notification_status_by_reference(reference, status, notification_statistics_status):
|
2016-03-11 09:40:35 +00:00
|
|
|
count = db.session.query(Notification).filter_by(
|
2016-03-11 10:19:40 +00:00
|
|
|
reference=reference
|
2016-03-11 09:40:35 +00:00
|
|
|
).update({
|
2016-03-14 11:45:21 +00:00
|
|
|
Notification.status: status
|
2016-03-11 09:40:35 +00:00
|
|
|
})
|
2016-03-21 13:24:37 +00:00
|
|
|
|
|
|
|
|
if count == 1:
|
|
|
|
|
notification = Notification.query.filter_by(
|
|
|
|
|
reference=reference
|
|
|
|
|
).first()
|
|
|
|
|
|
|
|
|
|
db.session.query(NotificationStatistics).filter_by(
|
|
|
|
|
day=notification.created_at.strftime('%Y-%m-%d'),
|
|
|
|
|
service_id=notification.service_id
|
|
|
|
|
).update(
|
|
|
|
|
update_query(notification.template.template_type, notification_statistics_status)
|
|
|
|
|
)
|
|
|
|
|
|
2016-03-11 09:40:35 +00:00
|
|
|
db.session.commit()
|
|
|
|
|
return count
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def update_notification_reference_by_id(id, reference):
|
|
|
|
|
count = db.session.query(Notification).filter_by(
|
|
|
|
|
id=id
|
|
|
|
|
).update({
|
2016-03-14 11:45:21 +00:00
|
|
|
Notification.reference: reference
|
2016-03-11 09:40:35 +00:00
|
|
|
})
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return count
|
|
|
|
|
|
|
|
|
|
|
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-03-21 12:37:34 +00:00
|
|
|
def get_notifications_for_job(service_id, job_id, filter_dict=None, page=1):
|
|
|
|
|
query = Notification.query.filter_by(service_id=service_id, job_id=job_id)
|
|
|
|
|
query = filter_query(query, filter_dict)
|
|
|
|
|
pagination = query.order_by(desc(Notification.created_at)).paginate(
|
2016-03-04 14:25:28 +00:00
|
|
|
page=page,
|
|
|
|
|
per_page=current_app.config['PAGE_SIZE']
|
|
|
|
|
)
|
2016-03-21 12:37:34 +00:00
|
|
|
return pagination
|
2016-02-16 11:22:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_notification(service_id, notification_id):
|
|
|
|
|
return Notification.query.filter_by(service_id=service_id, id=notification_id).one()
|
2016-03-01 13:30:10 +00:00
|
|
|
|
|
|
|
|
|
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-03-21 12:37:34 +00:00
|
|
|
def get_notifications_for_service(service_id, filter_dict=None, page=1):
|
|
|
|
|
query = Notification.query.filter_by(service_id=service_id)
|
|
|
|
|
query = filter_query(query, filter_dict)
|
|
|
|
|
pagination = query.order_by(desc(Notification.created_at)).paginate(
|
2016-03-01 13:30:10 +00:00
|
|
|
page=page,
|
|
|
|
|
per_page=current_app.config['PAGE_SIZE']
|
|
|
|
|
)
|
2016-03-21 12:37:34 +00:00
|
|
|
return pagination
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def filter_query(query, filter_dict=None):
|
|
|
|
|
if filter_dict and 'status' in filter_dict:
|
|
|
|
|
query = query.filter_by(status=filter_dict['status'])
|
|
|
|
|
if filter_dict and 'template_type' in filter_dict:
|
|
|
|
|
query = query.join(Template).filter(Template.template_type == filter_dict['template_type'])
|
2016-03-01 13:30:10 +00:00
|
|
|
return query
|
2016-03-09 17:46:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_successful_notifications_created_more_than_a_day_ago():
|
|
|
|
|
deleted = db.session.query(Notification).filter(
|
2016-03-10 09:34:27 +00:00
|
|
|
Notification.created_at < datetime.utcnow() - timedelta(days=1),
|
2016-03-09 17:46:01 +00:00
|
|
|
Notification.status == 'sent'
|
|
|
|
|
).delete()
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return deleted
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_failed_notifications_created_more_than_a_week_ago():
|
|
|
|
|
deleted = db.session.query(Notification).filter(
|
2016-03-10 09:34:27 +00:00
|
|
|
Notification.created_at < datetime.utcnow() - timedelta(days=7),
|
2016-03-09 17:46:01 +00:00
|
|
|
Notification.status == 'failed'
|
|
|
|
|
).delete()
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return deleted
|