mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-01 07:35:34 -05:00
Make update notification status transcational.
Refactor methods for reusability.
This commit is contained in:
@@ -9,8 +9,9 @@ def transactional(func):
|
|||||||
from flask import current_app
|
from flask import current_app
|
||||||
from app import db
|
from app import db
|
||||||
try:
|
try:
|
||||||
func(*args, **kwargs)
|
res = func(*args, **kwargs)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
return res
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
current_app.logger.error(e)
|
current_app.logger.error(e)
|
||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
|
|||||||
@@ -231,47 +231,51 @@ def _update_job_stats_query(status):
|
|||||||
return {mapping[status]: mapping[status] + 1}
|
return {mapping[status]: mapping[status] + 1}
|
||||||
|
|
||||||
|
|
||||||
def _set_firetext_status(notification, status):
|
def _decide_permanent_temporary_failure(current_status, status):
|
||||||
# Firetext will send pending, then send either succes or fail.
|
# 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
|
# If we go from pending to delivered we need to set failure type as temporary-failure
|
||||||
if notification.status == 'pending':
|
if current_status == 'pending':
|
||||||
if status == 'permanent-failure':
|
if status == 'permanent-failure':
|
||||||
status = 'temporary-failure'
|
status = 'temporary-failure'
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
|
||||||
def _update_notification_status(notification, status):
|
def _update_notification_status(notification, status, notification_statistics_status):
|
||||||
if not notification:
|
if not notification:
|
||||||
return 0
|
return 0
|
||||||
status = _set_firetext_status(notification=notification, status=status)
|
status = _decide_permanent_temporary_failure(current_status=notification.status, status=status)
|
||||||
|
|
||||||
count = db.session.query(Notification).filter(
|
|
||||||
Notification.id == notification.id,
|
|
||||||
or_(Notification.status == 'sending',
|
|
||||||
Notification.status == 'pending')).update({Notification.status: status})
|
|
||||||
return count
|
|
||||||
|
|
||||||
|
|
||||||
def update_notification_status_by_id(notification_id, status, notification_statistics_status=None):
|
|
||||||
notification = Notification.query.get(notification_id)
|
|
||||||
count = _update_notification_status(notification=notification, status=status)
|
|
||||||
|
|
||||||
|
count = db.session.query(Notification).filter(Notification.id == notification.id
|
||||||
|
).update({Notification.status: status})
|
||||||
if count == 1 and notification_statistics_status:
|
if count == 1 and notification_statistics_status:
|
||||||
_update_statistics(notification, notification_statistics_status)
|
_update_statistics(notification, notification_statistics_status)
|
||||||
|
|
||||||
db.session.commit()
|
|
||||||
return count
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
@transactional
|
||||||
|
def update_notification_status_by_id(notification_id, status, notification_statistics_status=None):
|
||||||
|
notification = Notification.query.filter(Notification.id == notification_id,
|
||||||
|
or_(Notification.status == 'sending',
|
||||||
|
Notification.status == 'pending')
|
||||||
|
).first()
|
||||||
|
|
||||||
|
count = _update_notification_status(notification=notification,
|
||||||
|
status=status,
|
||||||
|
notification_statistics_status=notification_statistics_status)
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
@transactional
|
||||||
def update_notification_status_by_reference(reference, status, notification_statistics_status):
|
def update_notification_status_by_reference(reference, status, notification_statistics_status):
|
||||||
notification = Notification.query.filter_by(reference=reference).first()
|
notification = Notification.query.filter(Notification.reference == reference,
|
||||||
count = _update_notification_status(notification=notification, status=status)
|
or_(Notification.status == 'sending',
|
||||||
|
Notification.status == 'pending')
|
||||||
|
).first()
|
||||||
|
|
||||||
if count == 1:
|
return _update_notification_status(notification=notification,
|
||||||
_update_statistics(notification, notification_statistics_status)
|
status=status,
|
||||||
|
notification_statistics_status=notification_statistics_status)
|
||||||
db.session.commit()
|
|
||||||
return count
|
|
||||||
|
|
||||||
|
|
||||||
def dao_update_notification(notification):
|
def dao_update_notification(notification):
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ class Notification(db.Model):
|
|||||||
nullable=True,
|
nullable=True,
|
||||||
onupdate=datetime.datetime.utcnow)
|
onupdate=datetime.datetime.utcnow)
|
||||||
status = db.Column(
|
status = db.Column(
|
||||||
db.Enum(*NOTIFICATION_STATUS_TYPES, name='notification_status_type'), nullable=False, default='sending')
|
db.Enum(*NOTIFICATION_STATUS_TYPES, name='notify_status_types'), nullable=False, default='sending')
|
||||||
reference = db.Column(db.String, nullable=True, index=True)
|
reference = db.Column(db.String, nullable=True, index=True)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -40,8 +40,6 @@ def notify_db(notify_api, request):
|
|||||||
def teardown():
|
def teardown():
|
||||||
db.session.remove()
|
db.session.remove()
|
||||||
db.drop_all()
|
db.drop_all()
|
||||||
db.engine.execute("drop type notify_status_types")
|
|
||||||
db.engine.execute("drop table alembic_version")
|
|
||||||
db.get_engine(notify_api).dispose()
|
db.get_engine(notify_api).dispose()
|
||||||
|
|
||||||
request.addfinalizer(teardown)
|
request.addfinalizer(teardown)
|
||||||
|
|||||||
Reference in New Issue
Block a user