From 34575016fdbe67457ad601669c63a3cf7b605c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Casaj=C3=BAs?= Date: Mon, 21 Oct 2024 16:13:15 +0200 Subject: [PATCH] Fix error in event processing where the event is deleted before marking it as taken (#2280) Co-authored-by: Carlos Quintana <74399022+cquintana92@users.noreply.github.com> --- app/models.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/models.py b/app/models.py index 83140c75..702e8752 100644 --- a/app/models.py +++ b/app/models.py @@ -24,6 +24,7 @@ from sqlalchemy import text, desc, CheckConstraint, Index, Column from sqlalchemy.dialects.postgresql import TSVECTOR from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import deferred +from sqlalchemy.orm.exc import ObjectDeletedError from sqlalchemy.sql import and_ from sqlalchemy_utils import ArrowType @@ -3781,15 +3782,18 @@ class SyncEvent(Base, ModelMixin): ) def mark_as_taken(self, allow_taken_older_than: Optional[Arrow] = None) -> bool: - taken_condition = ["taken_time IS NULL"] - args = {"taken_time": arrow.now().datetime, "sync_event_id": self.id} - if allow_taken_older_than: - taken_condition.append("taken_time < :taken_older_than") - args["taken_older_than"] = allow_taken_older_than.datetime - sql_taken_condition = "({})".format(" OR ".join(taken_condition)) - sql = f"UPDATE sync_event SET taken_time = :taken_time WHERE id = :sync_event_id AND {sql_taken_condition}" - res = Session.execute(sql, args) - Session.commit() + try: + taken_condition = ["taken_time IS NULL"] + args = {"taken_time": arrow.now().datetime, "sync_event_id": self.id} + if allow_taken_older_than: + taken_condition.append("taken_time < :taken_older_than") + args["taken_older_than"] = allow_taken_older_than.datetime + sql_taken_condition = "({})".format(" OR ".join(taken_condition)) + sql = f"UPDATE sync_event SET taken_time = :taken_time WHERE id = :sync_event_id AND {sql_taken_condition}" + res = Session.execute(sql, args) + Session.commit() + except ObjectDeletedError: + return False return res.rowcount > 0