mirror of https://github.com/apache/superset.git
chore(dao): Organize DAOs according to SIP-92 (#24331)
Co-authored-by: JUST.in DO IT <justin.park@airbnb.com>
This commit is contained in:
parent
1bc7d63cab
commit
3e76736874
|
@ -21,9 +21,9 @@ from superset.annotation_layers.annotations.commands.exceptions import (
|
|||
AnnotationBulkDeleteFailedError,
|
||||
AnnotationNotFoundError,
|
||||
)
|
||||
from superset.annotation_layers.annotations.dao import AnnotationDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.annotation import AnnotationDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.models.annotations import Annotation
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -27,11 +27,10 @@ from superset.annotation_layers.annotations.commands.exceptions import (
|
|||
AnnotationInvalidError,
|
||||
AnnotationUniquenessValidationError,
|
||||
)
|
||||
from superset.annotation_layers.annotations.dao import AnnotationDAO
|
||||
from superset.annotation_layers.commands.exceptions import AnnotationLayerNotFoundError
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.annotation import AnnotationDAO, AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -23,9 +23,9 @@ from superset.annotation_layers.annotations.commands.exceptions import (
|
|||
AnnotationDeleteFailedError,
|
||||
AnnotationNotFoundError,
|
||||
)
|
||||
from superset.annotation_layers.annotations.dao import AnnotationDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.annotation import AnnotationDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.models.annotations import Annotation
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -28,11 +28,10 @@ from superset.annotation_layers.annotations.commands.exceptions import (
|
|||
AnnotationUniquenessValidationError,
|
||||
AnnotationUpdateFailedError,
|
||||
)
|
||||
from superset.annotation_layers.annotations.dao import AnnotationDAO
|
||||
from superset.annotation_layers.commands.exceptions import AnnotationLayerNotFoundError
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.annotation import AnnotationDAO, AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.models.annotations import Annotation
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.models.annotations import Annotation
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AnnotationDAO(BaseDAO):
|
||||
model_cls = Annotation
|
||||
|
||||
@staticmethod
|
||||
def bulk_delete(models: Optional[list[Annotation]], commit: bool = True) -> None:
|
||||
item_ids = [model.id for model in models] if models else []
|
||||
try:
|
||||
db.session.query(Annotation).filter(Annotation.id.in_(item_ids)).delete(
|
||||
synchronize_session="fetch"
|
||||
)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex:
|
||||
db.session.rollback()
|
||||
raise DAODeleteFailedError() from ex
|
||||
|
||||
@staticmethod
|
||||
def validate_update_uniqueness(
|
||||
layer_id: int, short_descr: str, annotation_id: Optional[int] = None
|
||||
) -> bool:
|
||||
"""
|
||||
Validate if this annotation short description is unique. `id` is optional
|
||||
and serves for validating on updates
|
||||
|
||||
:param short_descr: The annotation short description
|
||||
:param layer_id: The annotation layer current id
|
||||
:param annotation_id: This annotation is (only for validating on updates)
|
||||
:return: bool
|
||||
"""
|
||||
query = db.session.query(Annotation).filter(
|
||||
Annotation.short_descr == short_descr, Annotation.layer_id == layer_id
|
||||
)
|
||||
if annotation_id:
|
||||
query = query.filter(Annotation.id != annotation_id)
|
||||
return not db.session.query(query.exists()).scalar()
|
|
@ -22,9 +22,9 @@ from superset.annotation_layers.commands.exceptions import (
|
|||
AnnotationLayerBulkDeleteIntegrityError,
|
||||
AnnotationLayerNotFoundError,
|
||||
)
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.annotation import AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.models.annotations import AnnotationLayer
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -25,9 +25,9 @@ from superset.annotation_layers.commands.exceptions import (
|
|||
AnnotationLayerInvalidError,
|
||||
AnnotationLayerNameUniquenessValidationError,
|
||||
)
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.annotation import AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -24,9 +24,9 @@ from superset.annotation_layers.commands.exceptions import (
|
|||
AnnotationLayerDeleteIntegrityError,
|
||||
AnnotationLayerNotFoundError,
|
||||
)
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.annotation import AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.models.annotations import AnnotationLayer
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -26,9 +26,9 @@ from superset.annotation_layers.commands.exceptions import (
|
|||
AnnotationLayerNotFoundError,
|
||||
AnnotationLayerUpdateFailedError,
|
||||
)
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.annotation import AnnotationLayerDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.models.annotations import AnnotationLayer
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -47,7 +47,6 @@ from superset.charts.commands.exceptions import (
|
|||
from superset.charts.commands.export import ExportChartsCommand
|
||||
from superset.charts.commands.importers.dispatcher import ImportChartsCommand
|
||||
from superset.charts.commands.update import UpdateChartCommand
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.charts.filters import (
|
||||
ChartAllTextFilter,
|
||||
ChartCertifiedFilter,
|
||||
|
@ -75,6 +74,7 @@ from superset.commands.importers.exceptions import (
|
|||
)
|
||||
from superset.commands.importers.v1.utils import get_contents_from_bundle
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.extensions import event_logger
|
||||
from superset.models.slice import Slice
|
||||
from superset.tasks.thumbnails import cache_chart_thumbnail
|
||||
|
|
|
@ -26,12 +26,12 @@ from superset.charts.commands.exceptions import (
|
|||
ChartForbiddenError,
|
||||
ChartNotFoundError,
|
||||
)
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.commands.exceptions import DeleteFailedError
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.models.slice import Slice
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -27,11 +27,11 @@ from superset.charts.commands.exceptions import (
|
|||
ChartInvalidError,
|
||||
DashboardsNotFoundValidationError,
|
||||
)
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.base import BaseCommand, CreateMixin
|
||||
from superset.commands.utils import get_datasource_by_id
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -27,13 +27,13 @@ from superset.charts.commands.exceptions import (
|
|||
ChartForbiddenError,
|
||||
ChartNotFoundError,
|
||||
)
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.slice import Slice
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ from collections.abc import Iterator
|
|||
import yaml
|
||||
|
||||
from superset.charts.commands.exceptions import ChartNotFoundError
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.datasets.commands.export import ExportDatasetsCommand
|
||||
from superset.commands.export.models import ExportModelsCommand
|
||||
from superset.models.slice import Slice
|
||||
|
|
|
@ -22,10 +22,10 @@ from sqlalchemy.orm import Session
|
|||
|
||||
from superset.charts.commands.exceptions import ChartImportError
|
||||
from superset.charts.commands.importers.v1.utils import import_chart
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.charts.schemas import ImportV1ChartSchema
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.databases.commands.importers.v1.utils import import_database
|
||||
from superset.databases.schemas import ImportV1DatabaseSchema
|
||||
from superset.datasets.commands.importers.v1.utils import import_dataset
|
||||
|
|
|
@ -31,11 +31,11 @@ from superset.charts.commands.exceptions import (
|
|||
DashboardsNotFoundValidationError,
|
||||
DatasourceTypeUpdateRequiredValidationError,
|
||||
)
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.base import BaseCommand, UpdateMixin
|
||||
from superset.commands.utils import get_datasource_by_id
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.models.slice import Slice
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ from superset.charts.post_processing import apply_post_process
|
|||
from superset.charts.schemas import ChartDataQueryContextSchema
|
||||
from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType
|
||||
from superset.connectors.base.models import BaseDatasource
|
||||
from superset.dao.exceptions import DatasourceNotFound
|
||||
from superset.daos.exceptions import DatasourceNotFound
|
||||
from superset.exceptions import QueryObjectValidationError
|
||||
from superset.extensions import event_logger
|
||||
from superset.models.sql_lab import Query
|
||||
|
|
|
@ -23,7 +23,7 @@ from flask_appbuilder import Model
|
|||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.commands.exceptions import CommandException
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.utils.dict_import_export import EXPORT_VERSION
|
||||
|
||||
METADATA_FILE_NAME = "metadata.yaml"
|
||||
|
|
|
@ -30,7 +30,7 @@ from superset.commands.importers.v1.utils import (
|
|||
METADATA_FILE_NAME,
|
||||
validate_metadata_type,
|
||||
)
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.models.core import Database
|
||||
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ from superset.charts.commands.importers.v1.utils import import_chart
|
|||
from superset.charts.schemas import ImportV1ChartSchema
|
||||
from superset.commands.exceptions import CommandException
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.dashboards.commands.importers.v1 import ImportDashboardsCommand
|
||||
from superset.dashboards.commands.importers.v1.utils import (
|
||||
find_chart_uuids,
|
||||
|
|
|
@ -27,8 +27,8 @@ from superset.commands.exceptions import (
|
|||
OwnersNotFoundValidationError,
|
||||
RolesNotFoundValidationError,
|
||||
)
|
||||
from superset.dao.exceptions import DatasourceNotFound
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
from superset.daos.exceptions import DatasourceNotFound
|
||||
from superset.extensions import db
|
||||
from superset.utils.core import DatasourceType, get_user_id
|
||||
|
||||
|
|
|
@ -19,12 +19,12 @@ from __future__ import annotations
|
|||
from typing import Any, TYPE_CHECKING
|
||||
|
||||
from superset import app, db
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType
|
||||
from superset.common.query_context import QueryContext
|
||||
from superset.common.query_object import QueryObject
|
||||
from superset.common.query_object_factory import QueryObjectFactory
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
from superset.models.slice import Slice
|
||||
from superset.utils.core import DatasourceDict, DatasourceType
|
||||
|
||||
|
|
|
@ -28,8 +28,6 @@ from pandas import DateOffset
|
|||
from typing_extensions import TypedDict
|
||||
|
||||
from superset import app
|
||||
from superset.annotation_layers.dao import AnnotationLayerDAO
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.common.chart_data import ChartDataResultFormat
|
||||
from superset.common.db_query_status import QueryStatus
|
||||
from superset.common.query_actions import get_query_results
|
||||
|
@ -38,6 +36,8 @@ from superset.common.utils.query_cache_manager import QueryCacheManager
|
|||
from superset.common.utils.time_range_utils import get_since_until_from_query_object
|
||||
from superset.connectors.base.models import BaseDatasource
|
||||
from superset.constants import CacheRegion, TimeGrain
|
||||
from superset.daos.annotation import AnnotationLayerDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.exceptions import (
|
||||
InvalidPostProcessingError,
|
||||
QueryObjectValidationError,
|
||||
|
|
|
@ -27,7 +27,7 @@ if TYPE_CHECKING:
|
|||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from superset.connectors.base.models import BaseDatasource
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
|
||||
|
||||
class QueryObjectFactory: # pylint: disable=too-few-public-methods
|
||||
|
|
|
@ -1439,8 +1439,8 @@ class SqlaTable(
|
|||
"""
|
||||
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.datasets.commands.exceptions import get_dataset_exist_error_msg
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
|
||||
# Check whether the relevant attributes have changed.
|
||||
state = db.inspect(target) # pylint: disable=no-member
|
||||
|
|
|
@ -22,8 +22,8 @@ from superset.css_templates.commands.exceptions import (
|
|||
CssTemplateBulkDeleteFailedError,
|
||||
CssTemplateNotFoundError,
|
||||
)
|
||||
from superset.css_templates.dao import CssTemplateDAO
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.css import CssTemplateDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.models.core import CssTemplate
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -19,14 +19,51 @@ from typing import Optional, Union
|
|||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.models.annotations import Annotation, AnnotationLayer
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AnnotationDAO(BaseDAO):
|
||||
model_cls = Annotation
|
||||
|
||||
@staticmethod
|
||||
def bulk_delete(models: Optional[list[Annotation]], commit: bool = True) -> None:
|
||||
item_ids = [model.id for model in models] if models else []
|
||||
try:
|
||||
db.session.query(Annotation).filter(Annotation.id.in_(item_ids)).delete(
|
||||
synchronize_session="fetch"
|
||||
)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex:
|
||||
db.session.rollback()
|
||||
raise DAODeleteFailedError() from ex
|
||||
|
||||
@staticmethod
|
||||
def validate_update_uniqueness(
|
||||
layer_id: int, short_descr: str, annotation_id: Optional[int] = None
|
||||
) -> bool:
|
||||
"""
|
||||
Validate if this annotation short description is unique. `id` is optional
|
||||
and serves for validating on updates
|
||||
|
||||
:param short_descr: The annotation short description
|
||||
:param layer_id: The annotation layer current id
|
||||
:param annotation_id: This annotation is (only for validating on updates)
|
||||
:return: bool
|
||||
"""
|
||||
query = db.session.query(Annotation).filter(
|
||||
Annotation.short_descr == short_descr, Annotation.layer_id == layer_id
|
||||
)
|
||||
if annotation_id:
|
||||
query = query.filter(Annotation.id != annotation_id)
|
||||
return not db.session.query(query.exists()).scalar()
|
||||
|
||||
|
||||
class AnnotationLayerDAO(BaseDAO):
|
||||
model_cls = AnnotationLayer
|
||||
|
|
@ -23,7 +23,7 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
|
|||
from sqlalchemy.exc import SQLAlchemyError, StatementError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from superset.dao.exceptions import (
|
||||
from superset.daos.exceptions import (
|
||||
DAOConfigError,
|
||||
DAOCreateFailedError,
|
||||
DAODeleteFailedError,
|
|
@ -22,7 +22,7 @@ from typing import Optional, TYPE_CHECKING
|
|||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.charts.filters import ChartFilter
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.extensions import db
|
||||
from superset.models.core import FavStar, FavStarClassName
|
||||
from superset.models.slice import Slice
|
|
@ -19,8 +19,8 @@ from typing import Optional
|
|||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.models.core import CssTemplate
|
||||
|
|
@ -20,16 +20,28 @@ from datetime import datetime
|
|||
from typing import Any, Optional, Union
|
||||
|
||||
from flask import g
|
||||
from flask_appbuilder.models.sqla import Model
|
||||
from flask_appbuilder.models.sqla.interface import SQLAInterface
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset import security_manager
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAOConfigError, DAOCreateFailedError
|
||||
from superset.dashboards.commands.exceptions import DashboardNotFoundError
|
||||
from superset.dashboards.filter_sets.consts import (
|
||||
DASHBOARD_ID_FIELD,
|
||||
DESCRIPTION_FIELD,
|
||||
JSON_METADATA_FIELD,
|
||||
NAME_FIELD,
|
||||
OWNER_ID_FIELD,
|
||||
OWNER_TYPE_FIELD,
|
||||
)
|
||||
from superset.dashboards.filters import DashboardAccessFilter, is_uuid
|
||||
from superset.extensions import db
|
||||
from superset.models.core import FavStar, FavStarClassName
|
||||
from superset.models.dashboard import Dashboard, id_or_slug_filter
|
||||
from superset.models.embedded_dashboard import EmbeddedDashboard
|
||||
from superset.models.filter_set import FilterSet
|
||||
from superset.models.slice import Slice
|
||||
from superset.utils.core import get_user_id
|
||||
from superset.utils.dashboard_filter_scopes_converter import copy_filter_scopes
|
||||
|
@ -365,3 +377,59 @@ class DashboardDAO(BaseDAO):
|
|||
if fav:
|
||||
db.session.delete(fav)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
class EmbeddedDashboardDAO(BaseDAO):
|
||||
model_cls = EmbeddedDashboard
|
||||
# There isn't really a regular scenario where we would rather get Embedded by id
|
||||
id_column_name = "uuid"
|
||||
|
||||
@staticmethod
|
||||
def upsert(dashboard: Dashboard, allowed_domains: list[str]) -> EmbeddedDashboard:
|
||||
"""
|
||||
Sets up a dashboard to be embeddable.
|
||||
Upsert is used to preserve the embedded_dashboard uuid across updates.
|
||||
"""
|
||||
embedded: EmbeddedDashboard = (
|
||||
dashboard.embedded[0] if dashboard.embedded else EmbeddedDashboard()
|
||||
)
|
||||
embedded.allow_domain_list = ",".join(allowed_domains)
|
||||
dashboard.embedded = [embedded]
|
||||
db.session.commit()
|
||||
return embedded
|
||||
|
||||
@classmethod
|
||||
def create(cls, properties: dict[str, Any], commit: bool = True) -> Any:
|
||||
"""
|
||||
Use EmbeddedDashboardDAO.upsert() instead.
|
||||
At least, until we are ok with more than one embedded instance per dashboard.
|
||||
"""
|
||||
raise NotImplementedError("Use EmbeddedDashboardDAO.upsert() instead.")
|
||||
|
||||
|
||||
class FilterSetDAO(BaseDAO):
|
||||
model_cls = FilterSet
|
||||
|
||||
@classmethod
|
||||
def create(cls, properties: dict[str, Any], commit: bool = True) -> Model:
|
||||
if cls.model_cls is None:
|
||||
raise DAOConfigError()
|
||||
model = FilterSet()
|
||||
setattr(model, NAME_FIELD, properties[NAME_FIELD])
|
||||
setattr(model, JSON_METADATA_FIELD, properties[JSON_METADATA_FIELD])
|
||||
setattr(model, DESCRIPTION_FIELD, properties.get(DESCRIPTION_FIELD, None))
|
||||
setattr(
|
||||
model,
|
||||
OWNER_ID_FIELD,
|
||||
properties.get(OWNER_ID_FIELD, properties[DASHBOARD_ID_FIELD]),
|
||||
)
|
||||
setattr(model, OWNER_TYPE_FIELD, properties[OWNER_TYPE_FIELD])
|
||||
setattr(model, DASHBOARD_ID_FIELD, properties[DASHBOARD_ID_FIELD])
|
||||
try:
|
||||
db.session.add(model)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex: # pragma: no cover
|
||||
db.session.rollback()
|
||||
raise DAOCreateFailedError() from ex
|
||||
return model
|
|
@ -17,7 +17,7 @@
|
|||
import logging
|
||||
from typing import Any, Optional
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.databases.filters import DatabaseFilter
|
||||
from superset.databases.ssh_tunnel.models import SSHTunnel
|
||||
from superset.extensions import db
|
||||
|
@ -26,6 +26,7 @@ from superset.models.dashboard import Dashboard
|
|||
from superset.models.slice import Slice
|
||||
from superset.models.sql_lab import TabState
|
||||
from superset.utils.core import DatasourceType
|
||||
from superset.utils.ssh_tunnel import unmask_password_info
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -135,3 +136,28 @@ class DatabaseDAO(BaseDAO):
|
|||
)
|
||||
|
||||
return ssh_tunnel
|
||||
|
||||
|
||||
class SSHTunnelDAO(BaseDAO):
|
||||
model_cls = SSHTunnel
|
||||
|
||||
@classmethod
|
||||
def update(
|
||||
cls,
|
||||
model: SSHTunnel,
|
||||
properties: dict[str, Any],
|
||||
commit: bool = True,
|
||||
) -> SSHTunnel:
|
||||
"""
|
||||
Unmask ``password``, ``private_key`` and ``private_key_password`` before updating.
|
||||
|
||||
When a database is edited the user sees a masked version of
|
||||
the aforementioned fields.
|
||||
|
||||
The masked values should be unmasked before the ssh tunnel is updated.
|
||||
"""
|
||||
# ID cannot be updated so we remove it if present in the payload
|
||||
properties.pop("id", None)
|
||||
properties = unmask_password_info(properties, model)
|
||||
|
||||
return super().update(model, properties, commit)
|
|
@ -20,7 +20,7 @@ from typing import Any, Optional
|
|||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.extensions import db
|
||||
from superset.models.core import Database
|
||||
from superset.models.dashboard import Dashboard
|
|
@ -21,8 +21,8 @@ from typing import Union
|
|||
from sqlalchemy.orm import Session
|
||||
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
|
||||
from superset.datasets.models import Dataset
|
||||
from superset.models.sql_lab import Query, SavedQuery
|
||||
from superset.tables.models import Table
|
|
@ -22,7 +22,7 @@ from sqlalchemy import and_, or_
|
|||
from sqlalchemy.sql import functions as func
|
||||
|
||||
from superset import db
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.models.core import Log
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.slice import Slice
|
|
@ -16,15 +16,19 @@
|
|||
# under the License.
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from typing import Any, Union
|
||||
from typing import Any, Optional, Union
|
||||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset import sql_lab
|
||||
from superset.common.db_query_status import QueryStatus
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.exceptions import QueryNotFoundException, SupersetCancelQueryException
|
||||
from superset.extensions import db
|
||||
from superset.models.sql_lab import Query, SavedQuery
|
||||
from superset.queries.filters import QueryFilter
|
||||
from superset.queries.saved_queries.filters import SavedQueryFilter
|
||||
from superset.utils.core import get_user_id
|
||||
from superset.utils.dates import now_as_float
|
||||
|
||||
|
@ -95,3 +99,21 @@ class QueryDAO(BaseDAO):
|
|||
query.status = QueryStatus.STOPPED
|
||||
query.end_time = now_as_float()
|
||||
db.session.commit()
|
||||
|
||||
|
||||
class SavedQueryDAO(BaseDAO):
|
||||
model_cls = SavedQuery
|
||||
base_filter = SavedQueryFilter
|
||||
|
||||
@staticmethod
|
||||
def bulk_delete(models: Optional[list[SavedQuery]], commit: bool = True) -> None:
|
||||
item_ids = [model.id for model in models] if models else []
|
||||
try:
|
||||
db.session.query(SavedQuery).filter(SavedQuery.id.in_(item_ids)).delete(
|
||||
synchronize_session="fetch"
|
||||
)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex:
|
||||
db.session.rollback()
|
||||
raise DAODeleteFailedError() from ex
|
|
@ -23,8 +23,8 @@ from flask_appbuilder import Model
|
|||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAOCreateFailedError, DAODeleteFailedError
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError, DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.reports.filters import ReportScheduleFilter
|
||||
from superset.reports.models import (
|
|
@ -16,7 +16,7 @@
|
|||
# under the License.
|
||||
|
||||
from superset.connectors.sqla.models import RowLevelSecurityFilter
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.daos.base import BaseDAO
|
||||
|
||||
|
||||
class RLSDAO(BaseDAO):
|
|
@ -20,8 +20,8 @@ from typing import Any, Optional
|
|||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAOCreateFailedError, DAODeleteFailedError
|
||||
from superset.daos.base import BaseDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError, DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.slice import Slice
|
|
@ -38,6 +38,7 @@ from superset.charts.schemas import ChartEntityResponseSchema
|
|||
from superset.commands.importers.exceptions import NoValidFilesFoundError
|
||||
from superset.commands.importers.v1.utils import get_contents_from_bundle
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.dashboard import DashboardDAO, EmbeddedDashboardDAO
|
||||
from superset.dashboards.commands.bulk_delete import BulkDeleteDashboardCommand
|
||||
from superset.dashboards.commands.create import CreateDashboardCommand
|
||||
from superset.dashboards.commands.delete import DeleteDashboardCommand
|
||||
|
@ -54,7 +55,6 @@ from superset.dashboards.commands.exceptions import (
|
|||
from superset.dashboards.commands.export import ExportDashboardsCommand
|
||||
from superset.dashboards.commands.importers.dispatcher import ImportDashboardsCommand
|
||||
from superset.dashboards.commands.update import UpdateDashboardCommand
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.dashboards.filters import (
|
||||
DashboardAccessFilter,
|
||||
DashboardCertifiedFilter,
|
||||
|
@ -80,7 +80,6 @@ from superset.dashboards.schemas import (
|
|||
openapi_spec_methods_override,
|
||||
thumbnail_query_schema,
|
||||
)
|
||||
from superset.embedded.dao import EmbeddedDAO
|
||||
from superset.extensions import event_logger
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.embedded_dashboard import EmbeddedDashboard
|
||||
|
@ -1320,7 +1319,7 @@ class DashboardRestApi(BaseSupersetModelRestApi):
|
|||
"""
|
||||
try:
|
||||
body = self.embedded_config_schema.load(request.json)
|
||||
embedded = EmbeddedDAO.upsert(dashboard, body["allowed_domains"])
|
||||
embedded = EmbeddedDashboardDAO.upsert(dashboard, body["allowed_domains"])
|
||||
result = self.embedded_response_schema.dump(embedded)
|
||||
return self.response(200, result=result)
|
||||
except ValidationError as error:
|
||||
|
|
|
@ -22,16 +22,16 @@ from flask_babel import lazy_gettext as _
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.commands.exceptions import DeleteFailedError
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.dashboards.commands.exceptions import (
|
||||
DashboardBulkDeleteFailedError,
|
||||
DashboardBulkDeleteFailedReportsExistError,
|
||||
DashboardForbiddenError,
|
||||
DashboardNotFoundError,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -22,13 +22,13 @@ from marshmallow import ValidationError
|
|||
|
||||
from superset.commands.base import BaseCommand, CreateMixin
|
||||
from superset.commands.utils import populate_roles
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.dashboards.commands.exceptions import (
|
||||
DashboardCreateFailedError,
|
||||
DashboardInvalidError,
|
||||
DashboardSlugExistsValidationError,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -22,17 +22,17 @@ from flask_babel import lazy_gettext as _
|
|||
|
||||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.dashboards.commands.exceptions import (
|
||||
DashboardDeleteFailedError,
|
||||
DashboardDeleteFailedReportsExistError,
|
||||
DashboardForbiddenError,
|
||||
DashboardNotFoundError,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -28,10 +28,10 @@ import yaml
|
|||
from superset.charts.commands.export import ExportChartsCommand
|
||||
from superset.dashboards.commands.exceptions import DashboardNotFoundError
|
||||
from superset.dashboards.commands.importers.v1.utils import find_chart_uuids
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.commands.export.models import ExportModelsCommand
|
||||
from superset.datasets.commands.export import ExportDatasetsCommand
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.slice import Slice
|
||||
from superset.utils.dict_import_export import EXPORT_VERSION
|
||||
|
|
|
@ -24,6 +24,7 @@ from sqlalchemy.sql import select
|
|||
from superset.charts.commands.importers.v1.utils import import_chart
|
||||
from superset.charts.schemas import ImportV1ChartSchema
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.commands.exceptions import DashboardImportError
|
||||
from superset.dashboards.commands.importers.v1.utils import (
|
||||
find_chart_uuids,
|
||||
|
@ -31,7 +32,6 @@ from superset.dashboards.commands.importers.v1.utils import (
|
|||
import_dashboard,
|
||||
update_id_refs,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.dashboards.schemas import ImportV1DashboardSchema
|
||||
from superset.databases.commands.importers.v1.utils import import_database
|
||||
from superset.databases.schemas import ImportV1DatabaseSchema
|
||||
|
|
|
@ -24,7 +24,8 @@ from marshmallow import ValidationError
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand, UpdateMixin
|
||||
from superset.commands.utils import populate_roles
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.dashboards.commands.exceptions import (
|
||||
DashboardForbiddenError,
|
||||
DashboardInvalidError,
|
||||
|
@ -32,7 +33,6 @@ from superset.dashboards.commands.exceptions import (
|
|||
DashboardSlugExistsValidationError,
|
||||
DashboardUpdateFailedError,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.extensions import db
|
||||
from superset.models.dashboard import Dashboard
|
||||
|
|
|
@ -30,8 +30,8 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
|
|||
from marshmallow import ValidationError
|
||||
|
||||
from superset.commands.exceptions import ObjectNotFoundError
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.commands.exceptions import DashboardNotFoundError
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.dashboards.filter_sets.commands.create import CreateFilterSetCommand
|
||||
from superset.dashboards.filter_sets.commands.delete import DeleteFilterSetCommand
|
||||
from superset.dashboards.filter_sets.commands.exceptions import (
|
||||
|
|
|
@ -21,8 +21,8 @@ from flask_appbuilder.models.sqla import Model
|
|||
|
||||
from superset import security_manager
|
||||
from superset.common.not_authorized_object import NotAuthorizedException
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.commands.exceptions import DashboardNotFoundError
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.dashboards.filter_sets.commands.exceptions import (
|
||||
FilterSetForbiddenError,
|
||||
FilterSetNotFoundError,
|
||||
|
|
|
@ -20,6 +20,7 @@ from typing import Any
|
|||
from flask_appbuilder.models.sqla import Model
|
||||
|
||||
from superset import security_manager
|
||||
from superset.daos.dashboard import FilterSetDAO
|
||||
from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand
|
||||
from superset.dashboards.filter_sets.commands.exceptions import (
|
||||
DashboardIdInconsistencyError,
|
||||
|
@ -32,7 +33,6 @@ from superset.dashboards.filter_sets.consts import (
|
|||
OWNER_ID_FIELD,
|
||||
OWNER_TYPE_FIELD,
|
||||
)
|
||||
from superset.dashboards.filter_sets.dao import FilterSetDAO
|
||||
from superset.utils.core import get_user_id
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -18,14 +18,14 @@ import logging
|
|||
|
||||
from flask_appbuilder.models.sqla import Model
|
||||
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.dashboard import FilterSetDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand
|
||||
from superset.dashboards.filter_sets.commands.exceptions import (
|
||||
FilterSetDeleteFailedError,
|
||||
FilterSetForbiddenError,
|
||||
FilterSetNotFoundError,
|
||||
)
|
||||
from superset.dashboards.filter_sets.dao import FilterSetDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -19,13 +19,13 @@ from typing import Any
|
|||
|
||||
from flask_appbuilder.models.sqla import Model
|
||||
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.dashboard import FilterSetDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand
|
||||
from superset.dashboards.filter_sets.commands.exceptions import (
|
||||
FilterSetUpdateFailedError,
|
||||
)
|
||||
from superset.dashboards.filter_sets.consts import OWNER_ID_FIELD, OWNER_TYPE_FIELD
|
||||
from superset.dashboards.filter_sets.dao import FilterSetDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from flask_appbuilder.models.sqla import Model
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAOConfigError, DAOCreateFailedError
|
||||
from superset.dashboards.filter_sets.consts import (
|
||||
DASHBOARD_ID_FIELD,
|
||||
DESCRIPTION_FIELD,
|
||||
JSON_METADATA_FIELD,
|
||||
NAME_FIELD,
|
||||
OWNER_ID_FIELD,
|
||||
OWNER_TYPE_FIELD,
|
||||
)
|
||||
from superset.extensions import db
|
||||
from superset.models.filter_set import FilterSet
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FilterSetDAO(BaseDAO):
|
||||
model_cls = FilterSet
|
||||
|
||||
@classmethod
|
||||
def create(cls, properties: dict[str, Any], commit: bool = True) -> Model:
|
||||
if cls.model_cls is None:
|
||||
raise DAOConfigError()
|
||||
model = FilterSet()
|
||||
setattr(model, NAME_FIELD, properties[NAME_FIELD])
|
||||
setattr(model, JSON_METADATA_FIELD, properties[JSON_METADATA_FIELD])
|
||||
setattr(model, DESCRIPTION_FIELD, properties.get(DESCRIPTION_FIELD, None))
|
||||
setattr(
|
||||
model,
|
||||
OWNER_ID_FIELD,
|
||||
properties.get(OWNER_ID_FIELD, properties[DASHBOARD_ID_FIELD]),
|
||||
)
|
||||
setattr(model, OWNER_TYPE_FIELD, properties[OWNER_TYPE_FIELD])
|
||||
setattr(model, DASHBOARD_ID_FIELD, properties[DASHBOARD_ID_FIELD])
|
||||
try:
|
||||
db.session.add(model)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex: # pragma: no cover
|
||||
db.session.rollback()
|
||||
raise DAOCreateFailedError() from ex
|
||||
return model
|
|
@ -15,11 +15,11 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.commands.exceptions import (
|
||||
DashboardAccessDeniedError,
|
||||
DashboardNotFoundError,
|
||||
)
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.temporary_cache.commands.exceptions import (
|
||||
TemporaryCacheAccessDeniedError,
|
||||
TemporaryCacheResourceNotFoundError,
|
||||
|
|
|
@ -18,7 +18,7 @@ import logging
|
|||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.permalink.commands.base import BaseDashboardPermalinkCommand
|
||||
from superset.dashboards.permalink.exceptions import DashboardPermalinkCreateFailedError
|
||||
from superset.dashboards.permalink.types import DashboardPermalinkState
|
||||
|
|
|
@ -19,8 +19,8 @@ from typing import Optional
|
|||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.dashboards.commands.exceptions import DashboardNotFoundError
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.dashboards.permalink.commands.base import BaseDashboardPermalinkCommand
|
||||
from superset.dashboards.permalink.exceptions import DashboardPermalinkGetFailedError
|
||||
from superset.dashboards.permalink.types import DashboardPermalinkValue
|
||||
|
|
|
@ -35,6 +35,7 @@ from superset.commands.importers.exceptions import (
|
|||
)
|
||||
from superset.commands.importers.v1.utils import get_contents_from_bundle
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.databases.commands.create import CreateDatabaseCommand
|
||||
from superset.databases.commands.delete import DeleteDatabaseCommand
|
||||
from superset.databases.commands.exceptions import (
|
||||
|
@ -55,7 +56,6 @@ from superset.databases.commands.test_connection import TestConnectionDatabaseCo
|
|||
from superset.databases.commands.update import UpdateDatabaseCommand
|
||||
from superset.databases.commands.validate import ValidateDatabaseParametersCommand
|
||||
from superset.databases.commands.validate_sql import ValidateSQLCommand
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.decorators import check_datasource_access
|
||||
from superset.databases.filters import DatabaseFilter, DatabaseUploadEnabledFilter
|
||||
from superset.databases.schemas import (
|
||||
|
|
|
@ -23,7 +23,8 @@ from marshmallow import ValidationError
|
|||
|
||||
from superset import is_feature_enabled
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseConnectionFailedError,
|
||||
DatabaseCreateFailedError,
|
||||
|
@ -32,7 +33,6 @@ from superset.databases.commands.exceptions import (
|
|||
DatabaseRequiredFieldValidationError,
|
||||
)
|
||||
from superset.databases.commands.test_connection import TestConnectionDatabaseCommand
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelCreateFailedError,
|
||||
|
|
|
@ -21,16 +21,16 @@ from flask_appbuilder.models.sqla import Model
|
|||
from flask_babel import lazy_gettext as _
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseDeleteDatasetsExistFailedError,
|
||||
DatabaseDeleteFailedError,
|
||||
DatabaseDeleteFailedReportsExistError,
|
||||
DatabaseNotFoundError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.models.core import Database
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ from collections.abc import Iterator
|
|||
import yaml
|
||||
|
||||
from superset.databases.commands.exceptions import DatabaseNotFoundError
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.commands.export.models import ExportModelsCommand
|
||||
from superset.models.core import Database
|
||||
from superset.utils.dict_import_export import EXPORT_VERSION
|
||||
|
|
|
@ -21,9 +21,9 @@ from marshmallow import Schema
|
|||
from sqlalchemy.orm import Session
|
||||
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.databases.commands.exceptions import DatabaseImportError
|
||||
from superset.databases.commands.importers.v1.utils import import_database
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.schemas import ImportV1DatabaseSchema
|
||||
from superset.datasets.commands.importers.v1.utils import import_dataset
|
||||
from superset.datasets.schemas import ImportV1DatasetSchema
|
||||
|
|
|
@ -21,11 +21,11 @@ from sqlalchemy.orm import lazyload, load_only
|
|||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseNotFoundError,
|
||||
DatabaseTablesUnexpectedError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.exceptions import SupersetException
|
||||
from superset.extensions import db, security_manager
|
||||
from superset.models.core import Database
|
||||
|
|
|
@ -27,16 +27,15 @@ from sqlalchemy.exc import DBAPIError, NoSuchModuleError
|
|||
|
||||
from superset import is_feature_enabled
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.daos.database import DatabaseDAO, SSHTunnelDAO
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseSecurityUnsafeError,
|
||||
DatabaseTestConnectionDriverError,
|
||||
DatabaseTestConnectionUnexpectedError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelingNotEnabledError,
|
||||
)
|
||||
from superset.databases.ssh_tunnel.dao import SSHTunnelDAO
|
||||
from superset.databases.ssh_tunnel.models import SSHTunnel
|
||||
from superset.databases.utils import make_url_safe
|
||||
from superset.errors import ErrorLevel, SupersetErrorType
|
||||
|
|
|
@ -22,7 +22,8 @@ from marshmallow import ValidationError
|
|||
|
||||
from superset import is_feature_enabled
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOCreateFailedError, DAOUpdateFailedError
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError, DAOUpdateFailedError
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseConnectionFailedError,
|
||||
DatabaseExistsValidationError,
|
||||
|
@ -30,7 +31,6 @@ from superset.databases.commands.exceptions import (
|
|||
DatabaseNotFoundError,
|
||||
DatabaseUpdateFailedError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelCreateFailedError,
|
||||
|
|
|
@ -21,13 +21,13 @@ from typing import Any, Optional
|
|||
from flask_babel import gettext as __
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseOfflineError,
|
||||
DatabaseTestConnectionFailedError,
|
||||
InvalidEngineError,
|
||||
InvalidParametersError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.databases.utils import make_url_safe
|
||||
from superset.db_engine_specs import get_engine_spec
|
||||
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
|
||||
|
|
|
@ -22,6 +22,7 @@ from flask import current_app
|
|||
from flask_babel import gettext as __
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.databases.commands.exceptions import (
|
||||
DatabaseNotFoundError,
|
||||
NoValidatorConfigFoundError,
|
||||
|
@ -30,7 +31,6 @@ from superset.databases.commands.exceptions import (
|
|||
ValidatorSQLError,
|
||||
ValidatorSQLUnexpectedError,
|
||||
)
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
|
||||
from superset.models.core import Database
|
||||
from superset.sql_validators import get_validator_by_name
|
||||
|
|
|
@ -21,13 +21,13 @@ from flask_appbuilder.models.sqla import Model
|
|||
from marshmallow import ValidationError
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.database import SSHTunnelDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelCreateFailedError,
|
||||
SSHTunnelInvalidError,
|
||||
SSHTunnelRequiredFieldValidationError,
|
||||
)
|
||||
from superset.databases.ssh_tunnel.dao import SSHTunnelDAO
|
||||
from superset.extensions import db, event_logger
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -21,13 +21,13 @@ from flask_appbuilder.models.sqla import Model
|
|||
|
||||
from superset import is_feature_enabled
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.database import SSHTunnelDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelDeleteFailedError,
|
||||
SSHTunnelingNotEnabledError,
|
||||
SSHTunnelNotFoundError,
|
||||
)
|
||||
from superset.databases.ssh_tunnel.dao import SSHTunnelDAO
|
||||
from superset.databases.ssh_tunnel.models import SSHTunnel
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -20,14 +20,14 @@ from typing import Any, Optional
|
|||
from flask_appbuilder.models.sqla import Model
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.database import SSHTunnelDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.databases.ssh_tunnel.commands.exceptions import (
|
||||
SSHTunnelInvalidError,
|
||||
SSHTunnelNotFoundError,
|
||||
SSHTunnelRequiredFieldValidationError,
|
||||
SSHTunnelUpdateFailedError,
|
||||
)
|
||||
from superset.databases.ssh_tunnel.dao import SSHTunnelDAO
|
||||
from superset.databases.ssh_tunnel.models import SSHTunnel
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.databases.ssh_tunnel.models import SSHTunnel
|
||||
from superset.utils.ssh_tunnel import unmask_password_info
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SSHTunnelDAO(BaseDAO):
|
||||
model_cls = SSHTunnel
|
||||
|
||||
@classmethod
|
||||
def update(
|
||||
cls,
|
||||
model: SSHTunnel,
|
||||
properties: dict[str, Any],
|
||||
commit: bool = True,
|
||||
) -> SSHTunnel:
|
||||
"""
|
||||
Unmask ``password``, ``private_key`` and ``private_key_password`` before updating.
|
||||
|
||||
When a database is edited the user sees a masked version of
|
||||
the aforementioned fields.
|
||||
|
||||
The masked values should be unmasked before the ssh tunnel is updated.
|
||||
"""
|
||||
# ID cannot be updated so we remove it if present in the payload
|
||||
properties.pop("id", None)
|
||||
properties = unmask_password_info(properties, model)
|
||||
|
||||
return super().update(model, properties, commit)
|
|
@ -33,6 +33,7 @@ from superset.commands.importers.exceptions import NoValidFilesFoundError
|
|||
from superset.commands.importers.v1.utils import get_contents_from_bundle
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.databases.filters import DatabaseFilter
|
||||
from superset.datasets.commands.bulk_delete import BulkDeleteDatasetCommand
|
||||
from superset.datasets.commands.create import CreateDatasetCommand
|
||||
|
@ -52,7 +53,6 @@ from superset.datasets.commands.export import ExportDatasetsCommand
|
|||
from superset.datasets.commands.importers.dispatcher import ImportDatasetsCommand
|
||||
from superset.datasets.commands.refresh import RefreshDatasetCommand
|
||||
from superset.datasets.commands.update import UpdateDatasetCommand
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.datasets.filters import DatasetCertifiedFilter, DatasetIsNullOrEmptyFilter
|
||||
from superset.datasets.schemas import (
|
||||
DatasetDuplicateSchema,
|
||||
|
|
|
@ -22,13 +22,13 @@ from flask_appbuilder.models.sqla import Model
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.sqla.models import TableColumn
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.datasets.columns.commands.exceptions import (
|
||||
DatasetColumnDeleteFailedError,
|
||||
DatasetColumnForbiddenError,
|
||||
DatasetColumnNotFoundError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -21,12 +21,12 @@ from superset import security_manager
|
|||
from superset.commands.base import BaseCommand
|
||||
from superset.commands.exceptions import DeleteFailedError
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatasetBulkDeleteFailedError,
|
||||
DatasetForbiddenError,
|
||||
DatasetNotFoundError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.extensions import db
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@ from marshmallow import ValidationError
|
|||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.commands.base import BaseCommand, CreateMixin
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatabaseNotFoundValidationError,
|
||||
DatasetCreateFailedError,
|
||||
|
@ -30,7 +31,6 @@ from superset.datasets.commands.exceptions import (
|
|||
DatasetInvalidError,
|
||||
TableNotFoundValidationError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.extensions import db
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -23,13 +23,13 @@ from sqlalchemy.exc import SQLAlchemyError
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatasetDeleteFailedError,
|
||||
DatasetForbiddenError,
|
||||
DatasetNotFoundError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.extensions import db
|
||||
|
||||
|
|
|
@ -25,14 +25,14 @@ from sqlalchemy.exc import SQLAlchemyError
|
|||
from superset.commands.base import BaseCommand, CreateMixin
|
||||
from superset.commands.exceptions import DatasourceTypeInvalidError
|
||||
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatasetDuplicateFailedError,
|
||||
DatasetExistsValidationError,
|
||||
DatasetInvalidError,
|
||||
DatasetNotFoundError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
|
||||
from superset.exceptions import SupersetErrorException
|
||||
from superset.extensions import db
|
||||
|
|
|
@ -24,9 +24,9 @@ import yaml
|
|||
|
||||
from superset.commands.export.models import ExportModelsCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.datasets.commands.exceptions import DatasetNotFoundError
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.utils.dict_import_export import EXPORT_VERSION
|
||||
from superset.utils.file import get_filename
|
||||
from superset.utils.ssh_tunnel import mask_password_info
|
||||
|
|
|
@ -21,11 +21,11 @@ from marshmallow import Schema
|
|||
from sqlalchemy.orm import Session
|
||||
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.databases.commands.importers.v1.utils import import_database
|
||||
from superset.databases.schemas import ImportV1DatabaseSchema
|
||||
from superset.datasets.commands.exceptions import DatasetImportError
|
||||
from superset.datasets.commands.importers.v1.utils import import_dataset
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.datasets.schemas import ImportV1DatasetSchema
|
||||
|
||||
|
||||
|
|
|
@ -22,12 +22,12 @@ from flask_appbuilder.models.sqla import Model
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatasetForbiddenError,
|
||||
DatasetNotFoundError,
|
||||
DatasetRefreshFailedError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -25,7 +25,8 @@ from marshmallow import ValidationError
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand, UpdateMixin
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.dao.exceptions import DAOUpdateFailedError
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAOUpdateFailedError
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatabaseChangeValidationError,
|
||||
DatasetColumnNotFoundValidationError,
|
||||
|
@ -41,7 +42,6 @@ from superset.datasets.commands.exceptions import (
|
|||
DatasetNotFoundError,
|
||||
DatasetUpdateFailedError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.utils.urls import is_safe_url
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@ from flask_appbuilder.models.sqla import Model
|
|||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.sqla.models import SqlMetric
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.datasets.metrics.commands.exceptions import (
|
||||
DatasetMetricDeleteFailedError,
|
||||
DatasetMetricForbiddenError,
|
||||
|
|
|
@ -19,8 +19,8 @@ import logging
|
|||
from flask_appbuilder.api import expose, protect, safe
|
||||
|
||||
from superset import app, db, event_logger
|
||||
from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
from superset.daos.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.superset_typing import FlaskResponse
|
||||
from superset.utils.core import apply_max_row_limit, DatasourceType
|
||||
|
|
|
@ -24,8 +24,8 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
|
|||
|
||||
from superset import is_feature_enabled
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.dashboard import EmbeddedDashboardDAO
|
||||
from superset.dashboards.schemas import EmbeddedDashboardResponseSchema
|
||||
from superset.embedded.dao import EmbeddedDAO
|
||||
from superset.embedded_dashboard.commands.exceptions import (
|
||||
EmbeddedDashboardNotFoundError,
|
||||
)
|
||||
|
@ -98,7 +98,7 @@ class EmbeddedDashboardRestApi(BaseSupersetModelRestApi):
|
|||
$ref: '#/components/responses/500'
|
||||
"""
|
||||
try:
|
||||
embedded = EmbeddedDAO.find_by_id(uuid)
|
||||
embedded = EmbeddedDashboardDAO.find_by_id(uuid)
|
||||
if not embedded:
|
||||
raise EmbeddedDashboardNotFoundError()
|
||||
result = self.embedded_response_schema.dump(embedded)
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.extensions import db
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.embedded_dashboard import EmbeddedDashboard
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class EmbeddedDAO(BaseDAO):
|
||||
model_cls = EmbeddedDashboard
|
||||
# There isn't really a regular scenario where we would rather get Embedded by id
|
||||
id_column_name = "uuid"
|
||||
|
||||
@staticmethod
|
||||
def upsert(dashboard: Dashboard, allowed_domains: list[str]) -> EmbeddedDashboard:
|
||||
"""
|
||||
Sets up a dashboard to be embeddable.
|
||||
Upsert is used to preserve the embedded_dashboard uuid across updates.
|
||||
"""
|
||||
embedded: EmbeddedDashboard = (
|
||||
dashboard.embedded[0] if dashboard.embedded else EmbeddedDashboard()
|
||||
)
|
||||
embedded.allow_domain_list = ",".join(allowed_domains)
|
||||
dashboard.embedded = [embedded]
|
||||
db.session.commit()
|
||||
return embedded
|
||||
|
||||
@classmethod
|
||||
def create(cls, properties: dict[str, Any], commit: bool = True) -> Any:
|
||||
"""
|
||||
Use EmbeddedDAO.upsert() instead.
|
||||
At least, until we are ok with more than one embedded instance per dashboard.
|
||||
"""
|
||||
raise NotImplementedError("Use EmbeddedDAO.upsert() instead.")
|
|
@ -23,7 +23,7 @@ from flask_login import AnonymousUserMixin, login_user
|
|||
from flask_wtf.csrf import same_origin
|
||||
|
||||
from superset import event_logger, is_feature_enabled
|
||||
from superset.embedded.dao import EmbeddedDAO
|
||||
from superset.daos.dashboard import EmbeddedDashboardDAO
|
||||
from superset.superset_typing import FlaskResponse
|
||||
from superset.utils import core as utils
|
||||
from superset.views.base import BaseSupersetView, common_bootstrap_payload
|
||||
|
@ -50,7 +50,7 @@ class EmbeddedView(BaseSupersetView):
|
|||
if not is_feature_enabled("EMBEDDED_SUPERSET"):
|
||||
abort(404)
|
||||
|
||||
embedded = EmbeddedDAO.find_by_id(uuid)
|
||||
embedded = EmbeddedDashboardDAO.find_by_id(uuid)
|
||||
|
||||
if not embedded:
|
||||
abort(404)
|
||||
|
|
|
@ -27,8 +27,8 @@ from superset import db
|
|||
from superset.commands.base import BaseCommand
|
||||
from superset.connectors.base.models import BaseDatasource
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.dao.exceptions import DatasourceNotFound
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
from superset.daos.exceptions import DatasourceNotFound
|
||||
from superset.exceptions import SupersetException
|
||||
from superset.explore.commands.parameters import CommandParameters
|
||||
from superset.explore.exceptions import WrongEndpointError
|
||||
|
|
|
@ -21,18 +21,18 @@ from superset.charts.commands.exceptions import (
|
|||
ChartAccessDeniedError,
|
||||
ChartNotFoundError,
|
||||
)
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.exceptions import (
|
||||
DatasourceNotFoundValidationError,
|
||||
DatasourceTypeInvalidError,
|
||||
QueryNotFoundValidationError,
|
||||
)
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
from superset.daos.query import QueryDAO
|
||||
from superset.datasets.commands.exceptions import (
|
||||
DatasetAccessDeniedError,
|
||||
DatasetNotFoundError,
|
||||
)
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.queries.dao import QueryDAO
|
||||
from superset.utils.core import DatasourceType
|
||||
|
||||
|
||||
|
|
|
@ -630,7 +630,7 @@ def dataset_macro(
|
|||
the user can also request metrics to be included, and columns to group by.
|
||||
"""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from superset.datasets.dao import DatasetDAO
|
||||
from superset.daos.dataset import DatasetDAO
|
||||
|
||||
dataset = DatasetDAO.find_by_id(dataset_id)
|
||||
if not dataset:
|
||||
|
|
|
@ -387,7 +387,7 @@ class Database(
|
|||
source: Optional[utils.QuerySource] = None,
|
||||
override_ssh_tunnel: Optional["SSHTunnel"] = None,
|
||||
) -> Engine:
|
||||
from superset.databases.dao import ( # pylint: disable=import-outside-toplevel
|
||||
from superset.daos.database import ( # pylint: disable=import-outside-toplevel
|
||||
DatabaseDAO,
|
||||
)
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ from sqlalchemy.sql.elements import BinaryExpression
|
|||
from superset import app, db, is_feature_enabled, security_manager
|
||||
from superset.connectors.base.models import BaseDatasource
|
||||
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
from superset.extensions import cache_manager
|
||||
from superset.models.filter_set import FilterSet
|
||||
from superset.models.helpers import AuditMixinNullable, ImportExportMixin
|
||||
|
|
|
@ -137,7 +137,7 @@ class Slice( # pylint: disable=too-many-public-methods
|
|||
@property
|
||||
def cls_model(self) -> type[BaseDatasource]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from superset.datasource.dao import DatasourceDAO
|
||||
from superset.daos.datasource import DatasourceDAO
|
||||
|
||||
return DatasourceDAO.sources[self.datasource_type]
|
||||
|
||||
|
|
|
@ -23,10 +23,10 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
|
|||
|
||||
from superset import db, event_logger
|
||||
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
|
||||
from superset.daos.query import QueryDAO
|
||||
from superset.databases.filters import DatabaseFilter
|
||||
from superset.exceptions import SupersetException
|
||||
from superset.models.sql_lab import Query
|
||||
from superset.queries.dao import QueryDAO
|
||||
from superset.queries.filters import QueryFilter
|
||||
from superset.queries.schemas import (
|
||||
openapi_spec_methods_override,
|
||||
|
|
|
@ -18,13 +18,13 @@ import logging
|
|||
from typing import Optional
|
||||
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.daos.query import SavedQueryDAO
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.queries.saved_queries.commands.exceptions import (
|
||||
SavedQueryBulkDeleteFailedError,
|
||||
SavedQueryNotFoundError,
|
||||
)
|
||||
from superset.queries.saved_queries.dao import SavedQueryDAO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ from werkzeug.utils import secure_filename
|
|||
from superset.commands.export.models import ExportModelsCommand
|
||||
from superset.models.sql_lab import SavedQuery
|
||||
from superset.queries.saved_queries.commands.exceptions import SavedQueryNotFoundError
|
||||
from superset.queries.saved_queries.dao import SavedQueryDAO
|
||||
from superset.daos.query import SavedQueryDAO
|
||||
from superset.utils.dict_import_export import EXPORT_VERSION
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -22,13 +22,13 @@ from sqlalchemy.orm import Session
|
|||
|
||||
from superset.commands.importers.v1 import ImportModelsCommand
|
||||
from superset.connectors.sqla.models import SqlaTable
|
||||
from superset.daos.query import SavedQueryDAO
|
||||
from superset.databases.commands.importers.v1.utils import import_database
|
||||
from superset.databases.schemas import ImportV1DatabaseSchema
|
||||
from superset.queries.saved_queries.commands.exceptions import SavedQueryImportError
|
||||
from superset.queries.saved_queries.commands.importers.v1.utils import (
|
||||
import_saved_query,
|
||||
)
|
||||
from superset.queries.saved_queries.dao import SavedQueryDAO
|
||||
from superset.queries.saved_queries.schemas import ImportV1SavedQuerySchema
|
||||
|
||||
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from superset.dao.base import BaseDAO
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.extensions import db
|
||||
from superset.models.sql_lab import SavedQuery
|
||||
from superset.queries.saved_queries.filters import SavedQueryFilter
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SavedQueryDAO(BaseDAO):
|
||||
model_cls = SavedQuery
|
||||
base_filter = SavedQueryFilter
|
||||
|
||||
@staticmethod
|
||||
def bulk_delete(models: Optional[list[SavedQuery]], commit: bool = True) -> None:
|
||||
item_ids = [model.id for model in models] if models else []
|
||||
try:
|
||||
db.session.query(SavedQuery).filter(SavedQuery.id.in_(item_ids)).delete(
|
||||
synchronize_session="fetch"
|
||||
)
|
||||
if commit:
|
||||
db.session.commit()
|
||||
except SQLAlchemyError as ex:
|
||||
db.session.rollback()
|
||||
raise DAODeleteFailedError() from ex
|
|
@ -19,9 +19,9 @@ from typing import Any
|
|||
|
||||
from marshmallow import ValidationError
|
||||
|
||||
from superset.charts.dao import ChartDAO
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dashboards.dao import DashboardDAO
|
||||
from superset.daos.chart import ChartDAO
|
||||
from superset.daos.dashboard import DashboardDAO
|
||||
from superset.reports.commands.exceptions import (
|
||||
ChartNotFoundValidationError,
|
||||
ChartNotSavedValidationError,
|
||||
|
|
|
@ -19,14 +19,14 @@ from typing import Optional
|
|||
|
||||
from superset import security_manager
|
||||
from superset.commands.base import BaseCommand
|
||||
from superset.dao.exceptions import DAODeleteFailedError
|
||||
from superset.daos.exceptions import DAODeleteFailedError
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.exceptions import SupersetSecurityException
|
||||
from superset.reports.commands.exceptions import (
|
||||
ReportScheduleBulkDeleteFailedError,
|
||||
ReportScheduleForbiddenError,
|
||||
ReportScheduleNotFoundError,
|
||||
)
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
from superset.reports.models import ReportSchedule
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
|
@ -22,8 +22,9 @@ from flask_babel import gettext as _
|
|||
from marshmallow import ValidationError
|
||||
|
||||
from superset.commands.base import CreateMixin
|
||||
from superset.dao.exceptions import DAOCreateFailedError
|
||||
from superset.databases.dao import DatabaseDAO
|
||||
from superset.daos.database import DatabaseDAO
|
||||
from superset.daos.exceptions import DAOCreateFailedError
|
||||
from superset.daos.report import ReportScheduleDAO
|
||||
from superset.reports.commands.base import BaseReportScheduleCommand
|
||||
from superset.reports.commands.exceptions import (
|
||||
DatabaseNotFoundValidationError,
|
||||
|
@ -34,7 +35,6 @@ from superset.reports.commands.exceptions import (
|
|||
ReportScheduleNameUniquenessValidationError,
|
||||
ReportScheduleRequiredTypeValidationError,
|
||||
)
|
||||
from superset.reports.dao import ReportScheduleDAO
|
||||
from superset.reports.models import (
|
||||
ReportCreationMethod,
|
||||
ReportSchedule,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue