diff --git a/app/dao/dao_utils.py b/app/dao/dao_utils.py index e4753a1d1..f5179e8b5 100644 --- a/app/dao/dao_utils.py +++ b/app/dao/dao_utils.py @@ -9,8 +9,9 @@ def transactional(func): from flask import current_app from app import db try: - func(*args, **kwargs) + res = func(*args, **kwargs) db.session.commit() + return res except Exception as e: current_app.logger.error(e) db.session.rollback() diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index 52dc18720..2c9dca604 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -231,47 +231,51 @@ def _update_job_stats_query(status): 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. # 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': status = 'temporary-failure' return status -def _update_notification_status(notification, status): +def _update_notification_status(notification, status, notification_statistics_status): if not notification: return 0 - status = _set_firetext_status(notification=notification, 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) + status = _decide_permanent_temporary_failure(current_status=notification.status, status=status) + count = db.session.query(Notification).filter(Notification.id == notification.id + ).update({Notification.status: status}) if count == 1 and notification_statistics_status: _update_statistics(notification, notification_statistics_status) - db.session.commit() 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): - notification = Notification.query.filter_by(reference=reference).first() - count = _update_notification_status(notification=notification, status=status) + notification = Notification.query.filter(Notification.reference == reference, + or_(Notification.status == 'sending', + Notification.status == 'pending') + ).first() - if count == 1: - _update_statistics(notification, notification_statistics_status) - - db.session.commit() - return count + return _update_notification_status(notification=notification, + status=status, + notification_statistics_status=notification_statistics_status) def dao_update_notification(notification): diff --git a/app/models.py b/app/models.py index 42a8f30b1..266eedcce 100644 --- a/app/models.py +++ b/app/models.py @@ -345,7 +345,7 @@ class Notification(db.Model): nullable=True, onupdate=datetime.datetime.utcnow) 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) diff --git a/tests/conftest.py b/tests/conftest.py index c323c672f..26af719b0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -40,8 +40,6 @@ def notify_db(notify_api, request): def teardown(): db.session.remove() db.drop_all() - db.engine.execute("drop type notify_status_types") - db.engine.execute("drop table alembic_version") db.get_engine(notify_api).dispose() request.addfinalizer(teardown)