From a3c08fd9bfcdd4b7735a81f6cd4ee44a6f73f76e Mon Sep 17 00:00:00 2001 From: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com> Date: Thu, 24 Apr 2025 22:41:15 -0300 Subject: [PATCH] fix(sqllab permalink): Commit SQL Lab permalinks (#33237) (cherry picked from commit fbd8ae28881a1d8f9f6cbd4d42b4a55b09c2098a) --- superset/commands/sql_lab/permalink/create.py | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/superset/commands/sql_lab/permalink/create.py b/superset/commands/sql_lab/permalink/create.py index 150b069d6f7..4493073a02d 100644 --- a/superset/commands/sql_lab/permalink/create.py +++ b/superset/commands/sql_lab/permalink/create.py @@ -15,14 +15,21 @@ # specific language governing permissions and limitations # under the License. import logging +from functools import partial from typing import Any +from sqlalchemy.exc import SQLAlchemyError + from superset import db from superset.commands.sql_lab.permalink.base import BaseSqlLabPermalinkCommand from superset.daos.key_value import KeyValueDAO -from superset.key_value.exceptions import KeyValueCodecEncodeException +from superset.key_value.exceptions import ( + KeyValueCodecEncodeException, + KeyValueCreateFailedError, +) from superset.key_value.utils import encode_permalink_key from superset.sqllab.permalink.exceptions import SqlLabPermalinkCreateFailedError +from superset.utils.decorators import on_error, transaction logger = logging.getLogger(__name__) @@ -31,19 +38,25 @@ class CreateSqlLabPermalinkCommand(BaseSqlLabPermalinkCommand): def __init__(self, state: dict[str, Any]): self._properties = state.copy() + @transaction( + on_error=partial( + on_error, + catches=( + KeyValueCodecEncodeException, + KeyValueCreateFailedError, + SQLAlchemyError, + ), + reraise=SqlLabPermalinkCreateFailedError, + ), + ) def run(self) -> str: self.validate() - try: - entry = KeyValueDAO.create_entry( - self.resource, self._properties, self.codec - ) - db.session.flush() - key = entry.id - if key is None: - raise SqlLabPermalinkCreateFailedError("Unexpected missing key id") - return encode_permalink_key(key=key, salt=self.salt) - except KeyValueCodecEncodeException as ex: - raise SqlLabPermalinkCreateFailedError(str(ex)) from ex + entry = KeyValueDAO.create_entry(self.resource, self._properties, self.codec) + db.session.flush() + key = entry.id + if key is None: + raise SqlLabPermalinkCreateFailedError("Unexpected missing key id") + return encode_permalink_key(key=key, salt=self.salt) def validate(self) -> None: pass