Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 25 additions & 12 deletions superset/commands/sql_lab/permalink/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand All @@ -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