mirror of
https://github.com/apache/superset.git
synced 2026-05-12 19:35:17 +00:00
feat: add permalink to dashboard and explore (#19078)
* rename key_value to temporary_cache
* add migration
* create new key_value package
* add commands
* lots of new stuff
* fix schema reference
* remove redundant filter state from bootstrap data
* add missing license headers
* fix pylint
* fix dashboard permalink access
* use valid json mocks for filter state tests
* fix temporary cache tests
* add anchors to dashboard state
* lint
* fix util test
* fix url shortlink button tests
* remove legacy shortner
* remove unused imports
* fix js tests
* fix test
* add native filter state to anchor link
* add UPDATING.md section
* address comments
* address comments
* lint
* fix test
* add utils tests + other test stubs
* add key_value integration tests
* add filter box state to permalink state
* fully support persisting url parameters
* lint, add redirects and a few integration tests
* fix test + clean up trailing comma
* fix anchor bug
* change value to LargeBinary to support persisting binary values
* fix urlParams type and simplify urlencode
* lint
* add optional entry expiration
* fix incorrect chart id + add test
(cherry picked from commit b7a0559aaf)
This commit is contained in:
committed by
Ville Brofeldt
parent
90f4d77422
commit
8c102174b8
@@ -22,10 +22,11 @@ from sqlalchemy.exc import SQLAlchemyError
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.explore.form_data.commands.parameters import CommandParameters
|
||||
from superset.explore.form_data.commands.state import TemporaryExploreState
|
||||
from superset.explore.form_data.utils import check_access
|
||||
from superset.explore.utils import check_access
|
||||
from superset.extensions import cache_manager
|
||||
from superset.key_value.commands.exceptions import KeyValueCreateFailedError
|
||||
from superset.key_value.utils import cache_key, random_key
|
||||
from superset.temporary_cache.commands.exceptions import TemporaryCacheCreateFailedError
|
||||
from superset.temporary_cache.utils import cache_key, random_key
|
||||
from superset.utils.schema import validate_json
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -35,6 +36,7 @@ class CreateFormDataCommand(BaseCommand):
|
||||
self._cmd_params = cmd_params
|
||||
|
||||
def run(self) -> str:
|
||||
self.validate()
|
||||
try:
|
||||
dataset_id = self._cmd_params.dataset_id
|
||||
chart_id = self._cmd_params.chart_id
|
||||
@@ -58,7 +60,8 @@ class CreateFormDataCommand(BaseCommand):
|
||||
return key
|
||||
except SQLAlchemyError as ex:
|
||||
logger.exception("Error running create command")
|
||||
raise KeyValueCreateFailedError() from ex
|
||||
raise TemporaryCacheCreateFailedError() from ex
|
||||
|
||||
def validate(self) -> None:
|
||||
pass
|
||||
if self._cmd_params.form_data:
|
||||
validate_json(self._cmd_params.form_data)
|
||||
|
||||
@@ -23,13 +23,13 @@ from sqlalchemy.exc import SQLAlchemyError
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.explore.form_data.commands.parameters import CommandParameters
|
||||
from superset.explore.form_data.commands.state import TemporaryExploreState
|
||||
from superset.explore.form_data.utils import check_access
|
||||
from superset.explore.utils import check_access
|
||||
from superset.extensions import cache_manager
|
||||
from superset.key_value.commands.exceptions import (
|
||||
KeyValueAccessDeniedError,
|
||||
KeyValueDeleteFailedError,
|
||||
from superset.temporary_cache.commands.exceptions import (
|
||||
TemporaryCacheAccessDeniedError,
|
||||
TemporaryCacheDeleteFailedError,
|
||||
)
|
||||
from superset.key_value.utils import cache_key
|
||||
from superset.temporary_cache.utils import cache_key
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -50,7 +50,7 @@ class DeleteFormDataCommand(BaseCommand, ABC):
|
||||
chart_id = state["chart_id"]
|
||||
check_access(dataset_id, chart_id, actor)
|
||||
if state["owner"] != actor.get_user_id():
|
||||
raise KeyValueAccessDeniedError()
|
||||
raise TemporaryCacheAccessDeniedError()
|
||||
tab_id = self._cmd_params.tab_id
|
||||
contextual_key = cache_key(
|
||||
session.get("_id"), tab_id, dataset_id, chart_id
|
||||
@@ -60,7 +60,7 @@ class DeleteFormDataCommand(BaseCommand, ABC):
|
||||
return False
|
||||
except SQLAlchemyError as ex:
|
||||
logger.exception("Error running delete command")
|
||||
raise KeyValueDeleteFailedError() from ex
|
||||
raise TemporaryCacheDeleteFailedError() from ex
|
||||
|
||||
def validate(self) -> None:
|
||||
pass
|
||||
|
||||
@@ -24,9 +24,9 @@ from sqlalchemy.exc import SQLAlchemyError
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.explore.form_data.commands.parameters import CommandParameters
|
||||
from superset.explore.form_data.commands.state import TemporaryExploreState
|
||||
from superset.explore.form_data.utils import check_access
|
||||
from superset.explore.utils import check_access
|
||||
from superset.extensions import cache_manager
|
||||
from superset.key_value.commands.exceptions import KeyValueGetFailedError
|
||||
from superset.temporary_cache.commands.exceptions import TemporaryCacheGetFailedError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -52,7 +52,7 @@ class GetFormDataCommand(BaseCommand, ABC):
|
||||
return None
|
||||
except SQLAlchemyError as ex:
|
||||
logger.exception("Error running get command")
|
||||
raise KeyValueGetFailedError() from ex
|
||||
raise TemporaryCacheGetFailedError() from ex
|
||||
|
||||
def validate(self) -> None:
|
||||
pass
|
||||
|
||||
@@ -24,13 +24,14 @@ from sqlalchemy.exc import SQLAlchemyError
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.explore.form_data.commands.parameters import CommandParameters
|
||||
from superset.explore.form_data.commands.state import TemporaryExploreState
|
||||
from superset.explore.form_data.utils import check_access
|
||||
from superset.explore.utils import check_access
|
||||
from superset.extensions import cache_manager
|
||||
from superset.key_value.commands.exceptions import (
|
||||
KeyValueAccessDeniedError,
|
||||
KeyValueUpdateFailedError,
|
||||
from superset.temporary_cache.commands.exceptions import (
|
||||
TemporaryCacheAccessDeniedError,
|
||||
TemporaryCacheUpdateFailedError,
|
||||
)
|
||||
from superset.key_value.utils import cache_key, random_key
|
||||
from superset.temporary_cache.utils import cache_key, random_key
|
||||
from superset.utils.schema import validate_json
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -42,6 +43,7 @@ class UpdateFormDataCommand(BaseCommand, ABC):
|
||||
self._cmd_params = cmd_params
|
||||
|
||||
def run(self) -> Optional[str]:
|
||||
self.validate()
|
||||
try:
|
||||
dataset_id = self._cmd_params.dataset_id
|
||||
chart_id = self._cmd_params.chart_id
|
||||
@@ -55,7 +57,7 @@ class UpdateFormDataCommand(BaseCommand, ABC):
|
||||
if state and form_data:
|
||||
user_id = actor.get_user_id()
|
||||
if state["owner"] != user_id:
|
||||
raise KeyValueAccessDeniedError()
|
||||
raise TemporaryCacheAccessDeniedError()
|
||||
|
||||
# Generate a new key if tab_id changes or equals 0
|
||||
tab_id = self._cmd_params.tab_id
|
||||
@@ -77,7 +79,8 @@ class UpdateFormDataCommand(BaseCommand, ABC):
|
||||
return key
|
||||
except SQLAlchemyError as ex:
|
||||
logger.exception("Error running update command")
|
||||
raise KeyValueUpdateFailedError() from ex
|
||||
raise TemporaryCacheUpdateFailedError() from ex
|
||||
|
||||
def validate(self) -> None:
|
||||
pass
|
||||
if self._cmd_params.form_data:
|
||||
validate_json(self._cmd_params.form_data)
|
||||
|
||||
Reference in New Issue
Block a user