You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by jo...@apache.org on 2023/06/19 01:32:40 UTC
[superset] branch master updated: chore(dao): Organize DAOs according to SIP-92 (#24331)
This is an automated email from the ASF dual-hosted git repository.
johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 3e76736874 chore(dao): Organize DAOs according to SIP-92 (#24331)
3e76736874 is described below
commit 3e76736874f5a7b1ca35a9f3b13cbb4bc3791f69
Author: John Bodley <45...@users.noreply.github.com>
AuthorDate: Sun Jun 18 18:32:32 2023 -0700
chore(dao): Organize DAOs according to SIP-92 (#24331)
Co-authored-by: JUST.in DO IT <ju...@airbnb.com>
---
.../annotations/commands/bulk_delete.py | 4 +-
.../annotations/commands/create.py | 5 +-
.../annotations/commands/delete.py | 4 +-
.../annotations/commands/update.py | 5 +-
superset/annotation_layers/annotations/dao.py | 64 --------------------
superset/annotation_layers/commands/bulk_delete.py | 4 +-
superset/annotation_layers/commands/create.py | 4 +-
superset/annotation_layers/commands/delete.py | 4 +-
superset/annotation_layers/commands/update.py | 4 +-
superset/charts/api.py | 2 +-
superset/charts/commands/bulk_delete.py | 4 +-
superset/charts/commands/create.py | 6 +-
superset/charts/commands/delete.py | 6 +-
superset/charts/commands/export.py | 2 +-
superset/charts/commands/importers/v1/__init__.py | 2 +-
superset/charts/commands/update.py | 6 +-
superset/charts/data/api.py | 2 +-
superset/commands/export/models.py | 2 +-
superset/commands/importers/v1/__init__.py | 2 +-
superset/commands/importers/v1/examples.py | 2 +-
superset/commands/utils.py | 4 +-
superset/common/query_context_factory.py | 4 +-
superset/common/query_context_processor.py | 4 +-
superset/common/query_object_factory.py | 2 +-
superset/connectors/sqla/models.py | 2 +-
superset/css_templates/commands/bulk_delete.py | 4 +-
superset/{dao => daos}/__init__.py | 0
.../dao.py => daos/annotation.py} | 41 ++++++++++++-
superset/{dao => daos}/base.py | 2 +-
superset/{charts/dao.py => daos/chart.py} | 2 +-
superset/{css_templates/dao.py => daos/css.py} | 4 +-
superset/{dashboards/dao.py => daos/dashboard.py} | 70 +++++++++++++++++++++-
superset/{databases/dao.py => daos/database.py} | 28 ++++++++-
superset/{datasets/dao.py => daos/dataset.py} | 2 +-
superset/{datasource/dao.py => daos/datasource.py} | 4 +-
superset/{dao => daos}/exceptions.py | 0
superset/{views/log/dao.py => daos/log.py} | 2 +-
superset/{queries/dao.py => daos/query.py} | 26 +++++++-
superset/{reports/dao.py => daos/report.py} | 4 +-
.../dao.py => daos/security.py} | 2 +-
superset/{tags/dao.py => daos/tag.py} | 4 +-
superset/dashboards/api.py | 5 +-
superset/dashboards/commands/bulk_delete.py | 4 +-
superset/dashboards/commands/create.py | 4 +-
superset/dashboards/commands/delete.py | 6 +-
superset/dashboards/commands/export.py | 4 +-
.../dashboards/commands/importers/v1/__init__.py | 2 +-
superset/dashboards/commands/update.py | 4 +-
superset/dashboards/filter_sets/api.py | 2 +-
superset/dashboards/filter_sets/commands/base.py | 2 +-
superset/dashboards/filter_sets/commands/create.py | 2 +-
superset/dashboards/filter_sets/commands/delete.py | 4 +-
superset/dashboards/filter_sets/commands/update.py | 4 +-
superset/dashboards/filter_sets/dao.py | 64 --------------------
superset/dashboards/filter_state/commands/utils.py | 2 +-
superset/dashboards/permalink/commands/create.py | 2 +-
superset/dashboards/permalink/commands/get.py | 2 +-
superset/databases/api.py | 2 +-
superset/databases/commands/create.py | 4 +-
superset/databases/commands/delete.py | 6 +-
superset/databases/commands/export.py | 2 +-
.../databases/commands/importers/v1/__init__.py | 2 +-
superset/databases/commands/tables.py | 2 +-
superset/databases/commands/test_connection.py | 3 +-
superset/databases/commands/update.py | 4 +-
superset/databases/commands/validate.py | 2 +-
superset/databases/commands/validate_sql.py | 2 +-
superset/databases/ssh_tunnel/commands/create.py | 4 +-
superset/databases/ssh_tunnel/commands/delete.py | 4 +-
superset/databases/ssh_tunnel/commands/update.py | 4 +-
superset/databases/ssh_tunnel/dao.py | 49 ---------------
superset/datasets/api.py | 2 +-
superset/datasets/columns/commands/delete.py | 4 +-
superset/datasets/commands/bulk_delete.py | 2 +-
superset/datasets/commands/create.py | 4 +-
superset/datasets/commands/delete.py | 4 +-
superset/datasets/commands/duplicate.py | 4 +-
superset/datasets/commands/export.py | 4 +-
.../datasets/commands/importers/v1/__init__.py | 2 +-
superset/datasets/commands/refresh.py | 2 +-
superset/datasets/commands/update.py | 4 +-
superset/datasets/metrics/commands/delete.py | 4 +-
superset/datasource/api.py | 4 +-
superset/embedded/api.py | 4 +-
superset/embedded/dao.py | 53 ----------------
superset/embedded/view.py | 4 +-
superset/explore/commands/get.py | 4 +-
superset/explore/utils.py | 6 +-
superset/jinja_context.py | 2 +-
superset/models/core.py | 2 +-
superset/models/dashboard.py | 2 +-
superset/models/slice.py | 2 +-
superset/queries/api.py | 2 +-
.../queries/saved_queries/commands/bulk_delete.py | 4 +-
superset/queries/saved_queries/commands/export.py | 2 +-
.../commands/importers/v1/__init__.py | 2 +-
superset/queries/saved_queries/dao.py | 46 --------------
superset/reports/commands/base.py | 4 +-
superset/reports/commands/bulk_delete.py | 4 +-
superset/reports/commands/create.py | 6 +-
superset/reports/commands/delete.py | 4 +-
superset/reports/commands/execute.py | 8 +--
superset/reports/commands/log_prune.py | 4 +-
superset/reports/commands/update.py | 6 +-
superset/row_level_security/api.py | 2 +-
.../row_level_security/commands/bulk_delete.py | 4 +-
superset/row_level_security/commands/create.py | 4 +-
superset/row_level_security/commands/update.py | 4 +-
superset/security/manager.py | 4 +-
superset/sqllab/api.py | 4 +-
superset/sqllab/commands/execute.py | 6 +-
superset/sqllab/sql_json_executer.py | 2 +-
superset/tags/api.py | 2 +-
superset/tags/commands/create.py | 4 +-
superset/tags/commands/delete.py | 4 +-
superset/tasks/scheduler.py | 2 +-
superset/views/core.py | 6 +-
superset/views/datasource/utils.py | 2 +-
superset/views/datasource/views.py | 2 +-
superset/views/log/api.py | 2 +-
superset/views/utils.py | 2 +-
tests/integration_tests/dashboards/dao_tests.py | 8 +--
.../dashboards/security/security_dataset_tests.py | 2 +-
.../integration_tests/databases/commands_tests.py | 16 ++---
tests/integration_tests/datasets/api_tests.py | 12 ++--
tests/integration_tests/datasource/api_tests.py | 2 +-
tests/integration_tests/datasource_tests.py | 6 +-
tests/integration_tests/embedded/api_tests.py | 4 +-
tests/integration_tests/embedded/dao_tests.py | 12 ++--
tests/integration_tests/embedded/test_view.py | 6 +-
tests/integration_tests/explore/api_tests.py | 2 +-
tests/integration_tests/query_context_tests.py | 2 +-
tests/integration_tests/reports/commands_tests.py | 2 +-
tests/integration_tests/security/api_tests.py | 4 +-
.../security/guest_token_security_tests.py | 4 +-
tests/integration_tests/security_tests.py | 2 +-
tests/integration_tests/tags/dao_tests.py | 6 +-
tests/unit_tests/charts/dao/dao_tests.py | 8 +--
tests/unit_tests/dao/queries_test.py | 12 ++--
tests/unit_tests/dashboards/dao_tests.py | 4 +-
tests/unit_tests/databases/api_test.py | 4 +-
tests/unit_tests/databases/dao/dao_tests.py | 4 +-
.../databases/ssh_tunnel/commands/delete_test.py | 2 +-
.../databases/ssh_tunnel/commands/update_test.py | 4 +-
tests/unit_tests/databases/ssh_tunnel/dao_tests.py | 3 +-
tests/unit_tests/datasets/dao/dao_tests.py | 8 +--
tests/unit_tests/datasource/dao_tests.py | 16 ++---
tests/unit_tests/explore/utils_test.py | 6 +-
tests/unit_tests/jinja_context_test.py | 4 +-
149 files changed, 426 insertions(+), 554 deletions(-)
diff --git a/superset/annotation_layers/annotations/commands/bulk_delete.py b/superset/annotation_layers/annotations/commands/bulk_delete.py
index dd47047788..2e0c53808f 100644
--- a/superset/annotation_layers/annotations/commands/bulk_delete.py
+++ b/superset/annotation_layers/annotations/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/annotation_layers/annotations/commands/create.py b/superset/annotation_layers/annotations/commands/create.py
index 986b564291..ed4e76cee6 100644
--- a/superset/annotation_layers/annotations/commands/create.py
+++ b/superset/annotation_layers/annotations/commands/create.py
@@ -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__)
diff --git a/superset/annotation_layers/annotations/commands/delete.py b/superset/annotation_layers/annotations/commands/delete.py
index 915f7f80ce..b86ae997a4 100644
--- a/superset/annotation_layers/annotations/commands/delete.py
+++ b/superset/annotation_layers/annotations/commands/delete.py
@@ -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__)
diff --git a/superset/annotation_layers/annotations/commands/update.py b/superset/annotation_layers/annotations/commands/update.py
index 99ab209165..03797a555b 100644
--- a/superset/annotation_layers/annotations/commands/update.py
+++ b/superset/annotation_layers/annotations/commands/update.py
@@ -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__)
diff --git a/superset/annotation_layers/annotations/dao.py b/superset/annotation_layers/annotations/dao.py
deleted file mode 100644
index da69e576e5..0000000000
--- a/superset/annotation_layers/annotations/dao.py
+++ /dev/null
@@ -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()
diff --git a/superset/annotation_layers/commands/bulk_delete.py b/superset/annotation_layers/commands/bulk_delete.py
index 4910dc4275..e4696065a6 100644
--- a/superset/annotation_layers/commands/bulk_delete.py
+++ b/superset/annotation_layers/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/annotation_layers/commands/create.py b/superset/annotation_layers/commands/create.py
index 86b0cb3b85..08ef4ad10d 100644
--- a/superset/annotation_layers/commands/create.py
+++ b/superset/annotation_layers/commands/create.py
@@ -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__)
diff --git a/superset/annotation_layers/commands/delete.py b/superset/annotation_layers/commands/delete.py
index 3dbd7a574f..0692d4dd83 100644
--- a/superset/annotation_layers/commands/delete.py
+++ b/superset/annotation_layers/commands/delete.py
@@ -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__)
diff --git a/superset/annotation_layers/commands/update.py b/superset/annotation_layers/commands/update.py
index 67d869c005..ca3a288413 100644
--- a/superset/annotation_layers/commands/update.py
+++ b/superset/annotation_layers/commands/update.py
@@ -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__)
diff --git a/superset/charts/api.py b/superset/charts/api.py
index b52ccf84bd..39b0c2dbf8 100644
--- a/superset/charts/api.py
+++ b/superset/charts/api.py
@@ -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
diff --git a/superset/charts/commands/bulk_delete.py b/superset/charts/commands/bulk_delete.py
index ac801b7421..964c40d812 100644
--- a/superset/charts/commands/bulk_delete.py
+++ b/superset/charts/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/charts/commands/create.py b/superset/charts/commands/create.py
index 78706b3a66..3eb0001bb9 100644
--- a/superset/charts/commands/create.py
+++ b/superset/charts/commands/create.py
@@ -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__)
diff --git a/superset/charts/commands/delete.py b/superset/charts/commands/delete.py
index 11f6e59257..184e9f8e1a 100644
--- a/superset/charts/commands/delete.py
+++ b/superset/charts/commands/delete.py
@@ -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__)
diff --git a/superset/charts/commands/export.py b/superset/charts/commands/export.py
index 22310ade99..d1183a999c 100644
--- a/superset/charts/commands/export.py
+++ b/superset/charts/commands/export.py
@@ -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
diff --git a/superset/charts/commands/importers/v1/__init__.py b/superset/charts/commands/importers/v1/__init__.py
index 132df21b08..2a9c691159 100644
--- a/superset/charts/commands/importers/v1/__init__.py
+++ b/superset/charts/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/charts/commands/update.py b/superset/charts/commands/update.py
index a4265d0835..9a5b4e1f29 100644
--- a/superset/charts/commands/update.py
+++ b/superset/charts/commands/update.py
@@ -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
diff --git a/superset/charts/data/api.py b/superset/charts/data/api.py
index 552044ebfa..effad0e010 100644
--- a/superset/charts/data/api.py
+++ b/superset/charts/data/api.py
@@ -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
diff --git a/superset/commands/export/models.py b/superset/commands/export/models.py
index 3f21f29281..27f4572af3 100644
--- a/superset/commands/export/models.py
+++ b/superset/commands/export/models.py
@@ -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"
diff --git a/superset/commands/importers/v1/__init__.py b/superset/commands/importers/v1/__init__.py
index 09830bf3cf..38d6568af4 100644
--- a/superset/commands/importers/v1/__init__.py
+++ b/superset/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/commands/importers/v1/examples.py b/superset/commands/importers/v1/examples.py
index 4c20e93ff7..501e993e96 100644
--- a/superset/commands/importers/v1/examples.py
+++ b/superset/commands/importers/v1/examples.py
@@ -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,
diff --git a/superset/commands/utils.py b/superset/commands/utils.py
index 7bb13984f8..02b6b5f383 100644
--- a/superset/commands/utils.py
+++ b/superset/commands/utils.py
@@ -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
diff --git a/superset/common/query_context_factory.py b/superset/common/query_context_factory.py
index 62018def8d..a6fe549894 100644
--- a/superset/common/query_context_factory.py
+++ b/superset/common/query_context_factory.py
@@ -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
diff --git a/superset/common/query_context_processor.py b/superset/common/query_context_processor.py
index 6553c19807..58e9022736 100644
--- a/superset/common/query_context_processor.py
+++ b/superset/common/query_context_processor.py
@@ -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,
diff --git a/superset/common/query_object_factory.py b/superset/common/query_object_factory.py
index 5676dc9eda..ae85912cdf 100644
--- a/superset/common/query_object_factory.py
+++ b/superset/common/query_object_factory.py
@@ -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
diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index ad3ba6f19b..c44b79062b 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -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
diff --git a/superset/css_templates/commands/bulk_delete.py b/superset/css_templates/commands/bulk_delete.py
index 57612d9048..c676e9eed8 100644
--- a/superset/css_templates/commands/bulk_delete.py
+++ b/superset/css_templates/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/dao/__init__.py b/superset/daos/__init__.py
similarity index 100%
rename from superset/dao/__init__.py
rename to superset/daos/__init__.py
diff --git a/superset/annotation_layers/dao.py b/superset/daos/annotation.py
similarity index 65%
rename from superset/annotation_layers/dao.py
rename to superset/daos/annotation.py
index 67efc19f88..171a708fa4 100644
--- a/superset/annotation_layers/dao.py
+++ b/superset/daos/annotation.py
@@ -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
diff --git a/superset/dao/base.py b/superset/daos/base.py
similarity index 99%
rename from superset/dao/base.py
rename to superset/daos/base.py
index 539dbab2d5..6465e5b177 100644
--- a/superset/dao/base.py
+++ b/superset/daos/base.py
@@ -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,
diff --git a/superset/charts/dao.py b/superset/daos/chart.py
similarity index 98%
rename from superset/charts/dao.py
rename to superset/daos/chart.py
index 9c6b2c26ef..838d93abdf 100644
--- a/superset/charts/dao.py
+++ b/superset/daos/chart.py
@@ -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
diff --git a/superset/css_templates/dao.py b/superset/daos/css.py
similarity index 94%
rename from superset/css_templates/dao.py
rename to superset/daos/css.py
index bc1a796269..224277a40a 100644
--- a/superset/css_templates/dao.py
+++ b/superset/daos/css.py
@@ -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
diff --git a/superset/dashboards/dao.py b/superset/daos/dashboard.py
similarity index 84%
rename from superset/dashboards/dao.py
rename to superset/daos/dashboard.py
index 9de94f9493..1e31591e1f 100644
--- a/superset/dashboards/dao.py
+++ b/superset/daos/dashboard.py
@@ -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
diff --git a/superset/databases/dao.py b/superset/daos/database.py
similarity index 84%
rename from superset/databases/dao.py
rename to superset/daos/database.py
index 9ce3b5e73e..569568472a 100644
--- a/superset/databases/dao.py
+++ b/superset/daos/database.py
@@ -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)
diff --git a/superset/datasets/dao.py b/superset/daos/dataset.py
similarity index 99%
rename from superset/datasets/dao.py
rename to superset/daos/dataset.py
index f4d46be109..3937e6c312 100644
--- a/superset/datasets/dao.py
+++ b/superset/daos/dataset.py
@@ -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
diff --git a/superset/datasource/dao.py b/superset/daos/datasource.py
similarity index 94%
rename from superset/datasource/dao.py
rename to superset/daos/datasource.py
index 4682f070e2..684106161c 100644
--- a/superset/datasource/dao.py
+++ b/superset/daos/datasource.py
@@ -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
diff --git a/superset/dao/exceptions.py b/superset/daos/exceptions.py
similarity index 100%
rename from superset/dao/exceptions.py
rename to superset/daos/exceptions.py
diff --git a/superset/views/log/dao.py b/superset/daos/log.py
similarity index 99%
rename from superset/views/log/dao.py
rename to superset/daos/log.py
index ab2961ade6..81767a48cb 100644
--- a/superset/views/log/dao.py
+++ b/superset/daos/log.py
@@ -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
diff --git a/superset/queries/dao.py b/superset/daos/query.py
similarity index 80%
rename from superset/queries/dao.py
rename to superset/daos/query.py
index e9fe15cac5..8aca1a4e25 100644
--- a/superset/queries/dao.py
+++ b/superset/daos/query.py
@@ -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
diff --git a/superset/reports/dao.py b/superset/daos/report.py
similarity index 98%
rename from superset/reports/dao.py
rename to superset/daos/report.py
index 64777e959a..4f8d914adc 100644
--- a/superset/reports/dao.py
+++ b/superset/daos/report.py
@@ -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 (
diff --git a/superset/row_level_security/dao.py b/superset/daos/security.py
similarity index 95%
rename from superset/row_level_security/dao.py
rename to superset/daos/security.py
index 1226e4d549..a435f224a6 100644
--- a/superset/row_level_security/dao.py
+++ b/superset/daos/security.py
@@ -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):
diff --git a/superset/tags/dao.py b/superset/daos/tag.py
similarity index 98%
rename from superset/tags/dao.py
rename to superset/daos/tag.py
index 9ea61f5c90..ec991edb13 100644
--- a/superset/tags/dao.py
+++ b/superset/daos/tag.py
@@ -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
diff --git a/superset/dashboards/api.py b/superset/dashboards/api.py
index 2c03c81fb6..3b8b70e167 100644
--- a/superset/dashboards/api.py
+++ b/superset/dashboards/api.py
@@ -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:
diff --git a/superset/dashboards/commands/bulk_delete.py b/superset/dashboards/commands/bulk_delete.py
index 385f1fbc6d..4802c9f101 100644
--- a/superset/dashboards/commands/bulk_delete.py
+++ b/superset/dashboards/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/dashboards/commands/create.py b/superset/dashboards/commands/create.py
index 58acc379ba..98ecd6eb78 100644
--- a/superset/dashboards/commands/create.py
+++ b/superset/dashboards/commands/create.py
@@ -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__)
diff --git a/superset/dashboards/commands/delete.py b/superset/dashboards/commands/delete.py
index 8ce7cb0cbf..f774b92a51 100644
--- a/superset/dashboards/commands/delete.py
+++ b/superset/dashboards/commands/delete.py
@@ -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__)
diff --git a/superset/dashboards/commands/export.py b/superset/dashboards/commands/export.py
index 2e70e29bb0..4e25e5c1fc 100644
--- a/superset/dashboards/commands/export.py
+++ b/superset/dashboards/commands/export.py
@@ -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
diff --git a/superset/dashboards/commands/importers/v1/__init__.py b/superset/dashboards/commands/importers/v1/__init__.py
index 597adba6d9..e86bddec9f 100644
--- a/superset/dashboards/commands/importers/v1/__init__.py
+++ b/superset/dashboards/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/dashboards/commands/update.py b/superset/dashboards/commands/update.py
index fefa65e3f6..cd9c07e0fd 100644
--- a/superset/dashboards/commands/update.py
+++ b/superset/dashboards/commands/update.py
@@ -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
diff --git a/superset/dashboards/filter_sets/api.py b/superset/dashboards/filter_sets/api.py
index d236b16d9c..11291b91cc 100644
--- a/superset/dashboards/filter_sets/api.py
+++ b/superset/dashboards/filter_sets/api.py
@@ -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 (
diff --git a/superset/dashboards/filter_sets/commands/base.py b/superset/dashboards/filter_sets/commands/base.py
index a7897eca8e..8c53e8a818 100644
--- a/superset/dashboards/filter_sets/commands/base.py
+++ b/superset/dashboards/filter_sets/commands/base.py
@@ -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,
diff --git a/superset/dashboards/filter_sets/commands/create.py b/superset/dashboards/filter_sets/commands/create.py
index 63c4534786..127cd9e2c3 100644
--- a/superset/dashboards/filter_sets/commands/create.py
+++ b/superset/dashboards/filter_sets/commands/create.py
@@ -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__)
diff --git a/superset/dashboards/filter_sets/commands/delete.py b/superset/dashboards/filter_sets/commands/delete.py
index c416252794..93f4383399 100644
--- a/superset/dashboards/filter_sets/commands/delete.py
+++ b/superset/dashboards/filter_sets/commands/delete.py
@@ -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__)
diff --git a/superset/dashboards/filter_sets/commands/update.py b/superset/dashboards/filter_sets/commands/update.py
index 722672d668..eecaa34aeb 100644
--- a/superset/dashboards/filter_sets/commands/update.py
+++ b/superset/dashboards/filter_sets/commands/update.py
@@ -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__)
diff --git a/superset/dashboards/filter_sets/dao.py b/superset/dashboards/filter_sets/dao.py
deleted file mode 100644
index 5f2b0ba418..0000000000
--- a/superset/dashboards/filter_sets/dao.py
+++ /dev/null
@@ -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
diff --git a/superset/dashboards/filter_state/commands/utils.py b/superset/dashboards/filter_state/commands/utils.py
index 35f940f434..7e52518249 100644
--- a/superset/dashboards/filter_state/commands/utils.py
+++ b/superset/dashboards/filter_state/commands/utils.py
@@ -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,
diff --git a/superset/dashboards/permalink/commands/create.py b/superset/dashboards/permalink/commands/create.py
index f0cf3e71cb..320003ff3d 100644
--- a/superset/dashboards/permalink/commands/create.py
+++ b/superset/dashboards/permalink/commands/create.py
@@ -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
diff --git a/superset/dashboards/permalink/commands/get.py b/superset/dashboards/permalink/commands/get.py
index da54ae0b66..6b32a459a5 100644
--- a/superset/dashboards/permalink/commands/get.py
+++ b/superset/dashboards/permalink/commands/get.py
@@ -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
diff --git a/superset/databases/api.py b/superset/databases/api.py
index c214065a27..8f7569af92 100644
--- a/superset/databases/api.py
+++ b/superset/databases/api.py
@@ -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 (
diff --git a/superset/databases/commands/create.py b/superset/databases/commands/create.py
index e3fd667130..a8681c5048 100644
--- a/superset/databases/commands/create.py
+++ b/superset/databases/commands/create.py
@@ -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,
diff --git a/superset/databases/commands/delete.py b/superset/databases/commands/delete.py
index 825b126218..b8eb3f6e5e 100644
--- a/superset/databases/commands/delete.py
+++ b/superset/databases/commands/delete.py
@@ -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__)
diff --git a/superset/databases/commands/export.py b/superset/databases/commands/export.py
index 889cb86c8f..71dc55a026 100644
--- a/superset/databases/commands/export.py
+++ b/superset/databases/commands/export.py
@@ -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
diff --git a/superset/databases/commands/importers/v1/__init__.py b/superset/databases/commands/importers/v1/__init__.py
index ba119beaaa..585c2d54ca 100644
--- a/superset/databases/commands/importers/v1/__init__.py
+++ b/superset/databases/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/databases/commands/tables.py b/superset/databases/commands/tables.py
index 4f262225a4..6232470ece 100644
--- a/superset/databases/commands/tables.py
+++ b/superset/databases/commands/tables.py
@@ -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
diff --git a/superset/databases/commands/test_connection.py b/superset/databases/commands/test_connection.py
index 2680c5e8c1..49c5340dd2 100644
--- a/superset/databases/commands/test_connection.py
+++ b/superset/databases/commands/test_connection.py
@@ -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
diff --git a/superset/databases/commands/update.py b/superset/databases/commands/update.py
index f12706fa1d..ea49801aac 100644
--- a/superset/databases/commands/update.py
+++ b/superset/databases/commands/update.py
@@ -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,
diff --git a/superset/databases/commands/validate.py b/superset/databases/commands/validate.py
index d97ad33af9..6ea412b490 100644
--- a/superset/databases/commands/validate.py
+++ b/superset/databases/commands/validate.py
@@ -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
diff --git a/superset/databases/commands/validate_sql.py b/superset/databases/commands/validate_sql.py
index 40d88af745..1ac378a03c 100644
--- a/superset/databases/commands/validate_sql.py
+++ b/superset/databases/commands/validate_sql.py
@@ -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
diff --git a/superset/databases/ssh_tunnel/commands/create.py b/superset/databases/ssh_tunnel/commands/create.py
index 9c41b83392..6fb8a92f4f 100644
--- a/superset/databases/ssh_tunnel/commands/create.py
+++ b/superset/databases/ssh_tunnel/commands/create.py
@@ -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__)
diff --git a/superset/databases/ssh_tunnel/commands/delete.py b/superset/databases/ssh_tunnel/commands/delete.py
index 235ceb697b..910df35a19 100644
--- a/superset/databases/ssh_tunnel/commands/delete.py
+++ b/superset/databases/ssh_tunnel/commands/delete.py
@@ -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__)
diff --git a/superset/databases/ssh_tunnel/commands/update.py b/superset/databases/ssh_tunnel/commands/update.py
index 37fd4a94b9..4e4edcb664 100644
--- a/superset/databases/ssh_tunnel/commands/update.py
+++ b/superset/databases/ssh_tunnel/commands/update.py
@@ -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__)
diff --git a/superset/databases/ssh_tunnel/dao.py b/superset/databases/ssh_tunnel/dao.py
deleted file mode 100644
index 731f9183b3..0000000000
--- a/superset/databases/ssh_tunnel/dao.py
+++ /dev/null
@@ -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)
diff --git a/superset/datasets/api.py b/superset/datasets/api.py
index c043efc682..b2457b066a 100644
--- a/superset/datasets/api.py
+++ b/superset/datasets/api.py
@@ -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,
diff --git a/superset/datasets/columns/commands/delete.py b/superset/datasets/columns/commands/delete.py
index 8fb27f9386..6ff8c21d7d 100644
--- a/superset/datasets/columns/commands/delete.py
+++ b/superset/datasets/columns/commands/delete.py
@@ -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__)
diff --git a/superset/datasets/commands/bulk_delete.py b/superset/datasets/commands/bulk_delete.py
index fd13351809..9733aa21e8 100644
--- a/superset/datasets/commands/bulk_delete.py
+++ b/superset/datasets/commands/bulk_delete.py
@@ -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
diff --git a/superset/datasets/commands/create.py b/superset/datasets/commands/create.py
index 1c864ad196..28b0250ab3 100644
--- a/superset/datasets/commands/create.py
+++ b/superset/datasets/commands/create.py
@@ -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__)
diff --git a/superset/datasets/commands/delete.py b/superset/datasets/commands/delete.py
index 1487f1028b..7078f09c37 100644
--- a/superset/datasets/commands/delete.py
+++ b/superset/datasets/commands/delete.py
@@ -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
diff --git a/superset/datasets/commands/duplicate.py b/superset/datasets/commands/duplicate.py
index 5a4a84fdf9..dc3ccb85d4 100644
--- a/superset/datasets/commands/duplicate.py
+++ b/superset/datasets/commands/duplicate.py
@@ -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
diff --git a/superset/datasets/commands/export.py b/superset/datasets/commands/export.py
index 8c02a23f29..3922652322 100644
--- a/superset/datasets/commands/export.py
+++ b/superset/datasets/commands/export.py
@@ -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
diff --git a/superset/datasets/commands/importers/v1/__init__.py b/superset/datasets/commands/importers/v1/__init__.py
index e753138ab8..f46c137b7e 100644
--- a/superset/datasets/commands/importers/v1/__init__.py
+++ b/superset/datasets/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/datasets/commands/refresh.py b/superset/datasets/commands/refresh.py
index 5277c27771..a25609636d 100644
--- a/superset/datasets/commands/refresh.py
+++ b/superset/datasets/commands/refresh.py
@@ -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__)
diff --git a/superset/datasets/commands/update.py b/superset/datasets/commands/update.py
index be9625709f..1636805567 100644
--- a/superset/datasets/commands/update.py
+++ b/superset/datasets/commands/update.py
@@ -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
diff --git a/superset/datasets/metrics/commands/delete.py b/superset/datasets/metrics/commands/delete.py
index d57e7fa359..5e7b2144c0 100644
--- a/superset/datasets/metrics/commands/delete.py
+++ b/superset/datasets/metrics/commands/delete.py
@@ -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,
diff --git a/superset/datasource/api.py b/superset/datasource/api.py
index 471077ff70..6399d197e0 100644
--- a/superset/datasource/api.py
+++ b/superset/datasource/api.py
@@ -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
diff --git a/superset/embedded/api.py b/superset/embedded/api.py
index def5bf9128..229ecc81c9 100644
--- a/superset/embedded/api.py
+++ b/superset/embedded/api.py
@@ -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)
diff --git a/superset/embedded/dao.py b/superset/embedded/dao.py
deleted file mode 100644
index 27ca338502..0000000000
--- a/superset/embedded/dao.py
+++ /dev/null
@@ -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.")
diff --git a/superset/embedded/view.py b/superset/embedded/view.py
index b7062c0b5e..e59a6ced90 100644
--- a/superset/embedded/view.py
+++ b/superset/embedded/view.py
@@ -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)
diff --git a/superset/explore/commands/get.py b/superset/explore/commands/get.py
index 4543136020..148ad2a3f5 100644
--- a/superset/explore/commands/get.py
+++ b/superset/explore/commands/get.py
@@ -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
diff --git a/superset/explore/utils.py b/superset/explore/utils.py
index 01f63f53f2..ca73cb39fb 100644
--- a/superset/explore/utils.py
+++ b/superset/explore/utils.py
@@ -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
diff --git a/superset/jinja_context.py b/superset/jinja_context.py
index f096b65cd1..4bb0b91a4e 100644
--- a/superset/jinja_context.py
+++ b/superset/jinja_context.py
@@ -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:
diff --git a/superset/models/core.py b/superset/models/core.py
index 3a52367242..92e6f2dbb5 100755
--- a/superset/models/core.py
+++ b/superset/models/core.py
@@ -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,
)
diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py
index a23e25a1ab..649c5a499d 100644
--- a/superset/models/dashboard.py
+++ b/superset/models/dashboard.py
@@ -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
diff --git a/superset/models/slice.py b/superset/models/slice.py
index fc8174878a..a6ffb22a08 100644
--- a/superset/models/slice.py
+++ b/superset/models/slice.py
@@ -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]
diff --git a/superset/queries/api.py b/superset/queries/api.py
index bc60742024..2b0173ec16 100644
--- a/superset/queries/api.py
+++ b/superset/queries/api.py
@@ -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,
diff --git a/superset/queries/saved_queries/commands/bulk_delete.py b/superset/queries/saved_queries/commands/bulk_delete.py
index fb230180c8..ba01bd456a 100644
--- a/superset/queries/saved_queries/commands/bulk_delete.py
+++ b/superset/queries/saved_queries/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/queries/saved_queries/commands/export.py b/superset/queries/saved_queries/commands/export.py
index 323256306a..1b85cda796 100644
--- a/superset/queries/saved_queries/commands/export.py
+++ b/superset/queries/saved_queries/commands/export.py
@@ -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__)
diff --git a/superset/queries/saved_queries/commands/importers/v1/__init__.py b/superset/queries/saved_queries/commands/importers/v1/__init__.py
index 79ec04f54b..c8a159c7f5 100644
--- a/superset/queries/saved_queries/commands/importers/v1/__init__.py
+++ b/superset/queries/saved_queries/commands/importers/v1/__init__.py
@@ -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
diff --git a/superset/queries/saved_queries/dao.py b/superset/queries/saved_queries/dao.py
deleted file mode 100644
index daae1de8f5..0000000000
--- a/superset/queries/saved_queries/dao.py
+++ /dev/null
@@ -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
diff --git a/superset/reports/commands/base.py b/superset/reports/commands/base.py
index 598370576b..da871ef17c 100644
--- a/superset/reports/commands/base.py
+++ b/superset/reports/commands/base.py
@@ -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,
diff --git a/superset/reports/commands/bulk_delete.py b/superset/reports/commands/bulk_delete.py
index 7d6e1ed791..a3644d9fb4 100644
--- a/superset/reports/commands/bulk_delete.py
+++ b/superset/reports/commands/bulk_delete.py
@@ -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__)
diff --git a/superset/reports/commands/create.py b/superset/reports/commands/create.py
index 04cf6ef43f..d8bdb03a57 100644
--- a/superset/reports/commands/create.py
+++ b/superset/reports/commands/create.py
@@ -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,
diff --git a/superset/reports/commands/delete.py b/superset/reports/commands/delete.py
index 4adf17683a..3f7e4e5d23 100644
--- a/superset/reports/commands/delete.py
+++ b/superset/reports/commands/delete.py
@@ -21,14 +21,14 @@ from flask_appbuilder.models.sqla import Model
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 (
ReportScheduleDeleteFailedError,
ReportScheduleForbiddenError,
ReportScheduleNotFoundError,
)
-from superset.reports.dao import ReportScheduleDAO
from superset.reports.models import ReportSchedule
logger = logging.getLogger(__name__)
diff --git a/superset/reports/commands/execute.py b/superset/reports/commands/execute.py
index 608b2564a2..bb7c53ed5e 100644
--- a/superset/reports/commands/execute.py
+++ b/superset/reports/commands/execute.py
@@ -28,6 +28,10 @@ from superset import app, security_manager
from superset.commands.base import BaseCommand
from superset.commands.exceptions import CommandException
from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType
+from superset.daos.report import (
+ REPORT_SCHEDULE_ERROR_NOTIFICATION_MARKER,
+ ReportScheduleDAO,
+)
from superset.dashboards.permalink.commands.create import (
CreateDashboardPermalinkCommand,
)
@@ -52,10 +56,6 @@ from superset.reports.commands.exceptions import (
ReportScheduleUnexpectedError,
ReportScheduleWorkingTimeoutError,
)
-from superset.reports.dao import (
- REPORT_SCHEDULE_ERROR_NOTIFICATION_MARKER,
- ReportScheduleDAO,
-)
from superset.reports.models import (
ReportDataFormat,
ReportExecutionLog,
diff --git a/superset/reports/commands/log_prune.py b/superset/reports/commands/log_prune.py
index badd267ecf..09d9995414 100644
--- a/superset/reports/commands/log_prune.py
+++ b/superset/reports/commands/log_prune.py
@@ -18,9 +18,9 @@ import logging
from datetime import datetime, timedelta
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.reports.commands.exceptions import ReportSchedulePruneLogError
-from superset.reports.dao import ReportScheduleDAO
from superset.reports.models import ReportSchedule
from superset.utils.celery import session_scope
diff --git a/superset/reports/commands/update.py b/superset/reports/commands/update.py
index 5ca3ac849a..4985165f66 100644
--- a/superset/reports/commands/update.py
+++ b/superset/reports/commands/update.py
@@ -23,8 +23,9 @@ from marshmallow import ValidationError
from superset import security_manager
from superset.commands.base import UpdateMixin
-from superset.dao.exceptions import DAOUpdateFailedError
-from superset.databases.dao import DatabaseDAO
+from superset.daos.database import DatabaseDAO
+from superset.daos.exceptions import DAOUpdateFailedError
+from superset.daos.report import ReportScheduleDAO
from superset.exceptions import SupersetSecurityException
from superset.reports.commands.base import BaseReportScheduleCommand
from superset.reports.commands.exceptions import (
@@ -35,7 +36,6 @@ from superset.reports.commands.exceptions import (
ReportScheduleNotFoundError,
ReportScheduleUpdateFailedError,
)
-from superset.reports.dao import ReportScheduleDAO
from superset.reports.models import ReportSchedule, ReportScheduleType, ReportState
logger = logging.getLogger(__name__)
diff --git a/superset/row_level_security/api.py b/superset/row_level_security/api.py
index 05a6dddf04..43912689fb 100644
--- a/superset/row_level_security/api.py
+++ b/superset/row_level_security/api.py
@@ -30,7 +30,7 @@ from superset.commands.exceptions import (
)
from superset.connectors.sqla.models import RowLevelSecurityFilter
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
-from superset.dao.exceptions import DAOCreateFailedError, DAOUpdateFailedError
+from superset.daos.exceptions import DAOCreateFailedError, DAOUpdateFailedError
from superset.extensions import event_logger
from superset.row_level_security.commands.bulk_delete import BulkDeleteRLSRuleCommand
from superset.row_level_security.commands.create import CreateRLSRuleCommand
diff --git a/superset/row_level_security/commands/bulk_delete.py b/superset/row_level_security/commands/bulk_delete.py
index a3703346cc..f180d0b2b8 100644
--- a/superset/row_level_security/commands/bulk_delete.py
+++ b/superset/row_level_security/commands/bulk_delete.py
@@ -18,13 +18,13 @@
import logging
from superset.commands.base import BaseCommand
-from superset.dao.exceptions import DAODeleteFailedError
+from superset.daos.exceptions import DAODeleteFailedError
+from superset.daos.security import RLSDAO
from superset.reports.models import ReportSchedule
from superset.row_level_security.commands.exceptions import (
RLSRuleNotFoundError,
RuleBulkDeleteFailedError,
)
-from superset.row_level_security.dao import RLSDAO
logger = logging.getLogger(__name__)
diff --git a/superset/row_level_security/commands/create.py b/superset/row_level_security/commands/create.py
index 5552feeda0..a26fdb7b12 100644
--- a/superset/row_level_security/commands/create.py
+++ b/superset/row_level_security/commands/create.py
@@ -23,9 +23,9 @@ from superset.commands.base import BaseCommand
from superset.commands.exceptions import DatasourceNotFoundValidationError
from superset.commands.utils import populate_roles
from superset.connectors.sqla.models import SqlaTable
-from superset.dao.exceptions import DAOCreateFailedError
+from superset.daos.exceptions import DAOCreateFailedError
+from superset.daos.security import RLSDAO
from superset.extensions import db
-from superset.row_level_security.dao import RLSDAO
logger = logging.getLogger(__name__)
diff --git a/superset/row_level_security/commands/update.py b/superset/row_level_security/commands/update.py
index a206fc3a39..d44aa3efaf 100644
--- a/superset/row_level_security/commands/update.py
+++ b/superset/row_level_security/commands/update.py
@@ -23,10 +23,10 @@ from superset.commands.base import BaseCommand
from superset.commands.exceptions import DatasourceNotFoundValidationError
from superset.commands.utils import populate_roles
from superset.connectors.sqla.models import RowLevelSecurityFilter, SqlaTable
-from superset.dao.exceptions import DAOUpdateFailedError
+from superset.daos.exceptions import DAOUpdateFailedError
+from superset.daos.security import RLSDAO
from superset.extensions import db
from superset.row_level_security.commands.exceptions import RLSRuleNotFoundError
-from superset.row_level_security.dao import RLSDAO
logger = logging.getLogger(__name__)
diff --git a/superset/security/manager.py b/superset/security/manager.py
index 99c15726f5..942ed66776 100644
--- a/superset/security/manager.py
+++ b/superset/security/manager.py
@@ -2071,7 +2071,7 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods
@staticmethod
def validate_guest_token_resources(resources: GuestTokenResources) -> None:
# pylint: disable=import-outside-toplevel
- from superset.embedded.dao import EmbeddedDAO
+ from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.embedded_dashboard.commands.exceptions import (
EmbeddedDashboardNotFoundError,
)
@@ -2082,7 +2082,7 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods
# TODO (embedded): remove this check once uuids are rolled out
dashboard = Dashboard.get(str(resource["id"]))
if not dashboard:
- embedded = EmbeddedDAO.find_by_id(str(resource["id"]))
+ embedded = EmbeddedDashboardDAO.find_by_id(str(resource["id"]))
if not embedded:
raise EmbeddedDashboardNotFoundError()
diff --git a/superset/sqllab/api.py b/superset/sqllab/api.py
index 35d110d8fc..72d1558c04 100644
--- a/superset/sqllab/api.py
+++ b/superset/sqllab/api.py
@@ -25,11 +25,11 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
from marshmallow import ValidationError
from superset import app, is_feature_enabled
-from superset.databases.dao import DatabaseDAO
+from superset.daos.database import DatabaseDAO
+from superset.daos.query import QueryDAO
from superset.extensions import event_logger
from superset.jinja_context import get_template_processor
from superset.models.sql_lab import Query
-from superset.queries.dao import QueryDAO
from superset.sql_lab import get_sql_results
from superset.sqllab.command_status import SqlJsonExecutionStatus
from superset.sqllab.commands.estimate import QueryEstimationCommand
diff --git a/superset/sqllab/commands/execute.py b/superset/sqllab/commands/execute.py
index 09b0769ce2..8b854d4971 100644
--- a/superset/sqllab/commands/execute.py
+++ b/superset/sqllab/commands/execute.py
@@ -25,7 +25,7 @@ from flask_babel import gettext as __
from superset.commands.base import BaseCommand
from superset.common.db_query_status import QueryStatus
-from superset.dao.exceptions import DAOCreateFailedError
+from superset.daos.exceptions import DAOCreateFailedError
from superset.errors import SupersetErrorType
from superset.exceptions import (
SupersetErrorException,
@@ -43,8 +43,8 @@ from superset.sqllab.execution_context_convertor import ExecutionContextConverto
from superset.sqllab.limiting_factor import LimitingFactor
if TYPE_CHECKING:
- from superset.databases.dao import DatabaseDAO
- from superset.queries.dao import QueryDAO
+ from superset.daos.database import DatabaseDAO
+ from superset.daos.query import QueryDAO
from superset.sqllab.sql_json_executer import SqlJsonExecutor
from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext
diff --git a/superset/sqllab/sql_json_executer.py b/superset/sqllab/sql_json_executer.py
index 124f477e96..a25b39ad0b 100644
--- a/superset/sqllab/sql_json_executer.py
+++ b/superset/sqllab/sql_json_executer.py
@@ -37,7 +37,7 @@ from superset.utils.core import get_username
from superset.utils.dates import now_as_float
if TYPE_CHECKING:
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext
QueryStatus = utils.QueryStatus
diff --git a/superset/tags/api.py b/superset/tags/api.py
index 859acdb537..f9aa7f7be9 100644
--- a/superset/tags/api.py
+++ b/superset/tags/api.py
@@ -22,6 +22,7 @@ from flask_appbuilder.api import expose, protect, rison, safe
from flask_appbuilder.models.sqla.interface import SQLAInterface
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod
+from superset.daos.tag import TagDAO
from superset.extensions import event_logger
from superset.tags.commands.create import CreateCustomTagCommand
from superset.tags.commands.delete import DeleteTaggedObjectCommand, DeleteTagsCommand
@@ -33,7 +34,6 @@ from superset.tags.commands.exceptions import (
TagInvalidError,
TagNotFoundError,
)
-from superset.tags.dao import TagDAO
from superset.tags.models import ObjectTypes, Tag
from superset.tags.schemas import (
delete_tags_schema,
diff --git a/superset/tags/commands/create.py b/superset/tags/commands/create.py
index 20327b54f0..7e9f040015 100644
--- a/superset/tags/commands/create.py
+++ b/superset/tags/commands/create.py
@@ -17,10 +17,10 @@
import logging
from superset.commands.base import BaseCommand, CreateMixin
-from superset.dao.exceptions import DAOCreateFailedError
+from superset.daos.exceptions import DAOCreateFailedError
+from superset.daos.tag import TagDAO
from superset.tags.commands.exceptions import TagCreateFailedError, TagInvalidError
from superset.tags.commands.utils import to_object_type
-from superset.tags.dao import TagDAO
from superset.tags.models import ObjectTypes
logger = logging.getLogger(__name__)
diff --git a/superset/tags/commands/delete.py b/superset/tags/commands/delete.py
index 08189b5ac5..4b92e40ff5 100644
--- a/superset/tags/commands/delete.py
+++ b/superset/tags/commands/delete.py
@@ -17,7 +17,8 @@
import logging
from superset.commands.base import BaseCommand
-from superset.dao.exceptions import DAODeleteFailedError
+from superset.daos.exceptions import DAODeleteFailedError
+from superset.daos.tag import TagDAO
from superset.tags.commands.exceptions import (
TagDeleteFailedError,
TaggedObjectDeleteFailedError,
@@ -26,7 +27,6 @@ from superset.tags.commands.exceptions import (
TagNotFoundError,
)
from superset.tags.commands.utils import to_object_type
-from superset.tags.dao import TagDAO
from superset.tags.models import ObjectTypes
from superset.views.base import DeleteMixin
diff --git a/superset/tasks/scheduler.py b/superset/tasks/scheduler.py
index b3efa240fa..7e0422b001 100644
--- a/superset/tasks/scheduler.py
+++ b/superset/tasks/scheduler.py
@@ -22,11 +22,11 @@ from dateutil import parser
from superset import app, is_feature_enabled
from superset.commands.exceptions import CommandException
+from superset.daos.report import ReportScheduleDAO
from superset.extensions import celery_app
from superset.reports.commands.exceptions import ReportScheduleUnexpectedError
from superset.reports.commands.execute import AsyncExecuteReportScheduleCommand
from superset.reports.commands.log_prune import AsyncPruneReportScheduleLogCommand
-from superset.reports.dao import ReportScheduleDAO
from superset.tasks.cron_util import cron_schedule_window
from superset.utils.celery import session_scope
from superset.utils.core import LoggerLevel
diff --git a/superset/views/core.py b/superset/views/core.py
index f75a8f77e1..f584901316 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -43,17 +43,17 @@ from superset import (
security_manager,
)
from superset.charts.commands.exceptions import ChartNotFoundError
-from superset.charts.dao import ChartDAO
from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType
from superset.connectors.base.models import BaseDatasource
from superset.connectors.sqla.models import SqlaTable
+from superset.daos.chart import ChartDAO
+from superset.daos.database import DatabaseDAO
+from superset.daos.datasource import DatasourceDAO
from superset.dashboards.commands.exceptions import DashboardAccessDeniedError
from superset.dashboards.commands.importers.v0 import ImportDashboardsCommand
from superset.dashboards.permalink.commands.get import GetDashboardPermalinkCommand
from superset.dashboards.permalink.exceptions import DashboardPermalinkGetFailedError
-from superset.databases.dao import DatabaseDAO
from superset.datasets.commands.exceptions import DatasetNotFoundError
-from superset.datasource.dao import DatasourceDAO
from superset.exceptions import CacheLoadError, DatabaseNotFound, SupersetException
from superset.explore.form_data.commands.create import CreateFormDataCommand
from superset.explore.form_data.commands.get import GetFormDataCommand
diff --git a/superset/views/datasource/utils.py b/superset/views/datasource/utils.py
index a4cf0c5e90..65b19c3493 100644
--- a/superset/views/datasource/utils.py
+++ b/superset/views/datasource/utils.py
@@ -21,8 +21,8 @@ from superset.common.chart_data import ChartDataResultType
from superset.common.query_context_factory import QueryContextFactory
from superset.common.utils.query_cache_manager import QueryCacheManager
from superset.constants import CacheRegion
+from superset.daos.datasource import DatasourceDAO
from superset.datasets.commands.exceptions import DatasetSamplesFailedError
-from superset.datasource.dao import DatasourceDAO
from superset.utils.core import QueryStatus
from superset.views.datasource.schemas import SamplesPayloadSchema
diff --git a/superset/views/datasource/views.py b/superset/views/datasource/views.py
index ba5a05b9cf..f1086acd47 100644
--- a/superset/views/datasource/views.py
+++ b/superset/views/datasource/views.py
@@ -31,11 +31,11 @@ from superset import db, event_logger, security_manager
from superset.commands.utils import populate_owners
from superset.connectors.sqla.models import SqlaTable
from superset.connectors.sqla.utils import get_physical_table_metadata
+from superset.daos.datasource import DatasourceDAO
from superset.datasets.commands.exceptions import (
DatasetForbiddenError,
DatasetNotFoundError,
)
-from superset.datasource.dao import DatasourceDAO
from superset.exceptions import SupersetException, SupersetSecurityException
from superset.models.core import Database
from superset.superset_typing import FlaskResponse
diff --git a/superset/views/log/api.py b/superset/views/log/api.py
index eefa45b5fd..d3699e3885 100644
--- a/superset/views/log/api.py
+++ b/superset/views/log/api.py
@@ -24,11 +24,11 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface
import superset.models.core as models
from superset import event_logger, security_manager
from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP
+from superset.daos.log import LogDAO
from superset.exceptions import SupersetSecurityException
from superset.superset_typing import FlaskResponse
from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics
from superset.views.log import LogMixin
-from superset.views.log.dao import LogDAO
from superset.views.log.schemas import (
get_recent_activity_schema,
RecentActivityResponseSchema,
diff --git a/superset/views/utils.py b/superset/views/utils.py
index 1f3b3930eb..29f5a4c7e4 100644
--- a/superset/views/utils.py
+++ b/superset/views/utils.py
@@ -33,7 +33,7 @@ from werkzeug.wrappers.response import Response
import superset.models.core as models
from superset import app, dataframe, db, result_set, viz
from superset.common.db_query_status import QueryStatus
-from superset.datasource.dao import DatasourceDAO
+from superset.daos.datasource import DatasourceDAO
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
from superset.exceptions import (
CacheLoadError,
diff --git a/tests/integration_tests/dashboards/dao_tests.py b/tests/integration_tests/dashboards/dao_tests.py
index e62b28a3d7..91e27af3b6 100644
--- a/tests/integration_tests/dashboards/dao_tests.py
+++ b/tests/integration_tests/dashboards/dao_tests.py
@@ -23,7 +23,7 @@ import pytest
import tests.integration_tests.test_app # pylint: disable=unused-import
from superset import db, security_manager
-from superset.dashboards.dao import DashboardDAO
+from superset.daos.dashboard import DashboardDAO
from superset.models.dashboard import Dashboard
from tests.integration_tests.base_tests import SupersetTestCase
from tests.integration_tests.fixtures.world_bank_dashboard import (
@@ -129,7 +129,7 @@ class TestDashboardDAO(SupersetTestCase):
db.session.commit()
@pytest.mark.usefixtures("load_world_bank_dashboard_with_slices")
- @patch("superset.dashboards.dao.g")
+ @patch("superset.daos.dashboard.g")
def test_copy_dashboard(self, mock_g):
mock_g.user = security_manager.find_user("admin")
original_dash = (
@@ -155,7 +155,7 @@ class TestDashboardDAO(SupersetTestCase):
db.session.commit()
@pytest.mark.usefixtures("load_world_bank_dashboard_with_slices")
- @patch("superset.dashboards.dao.g")
+ @patch("superset.daos.dashboard.g")
def test_copy_dashboard_copies_native_filters(self, mock_g):
mock_g.user = security_manager.find_user("admin")
original_dash = (
@@ -183,7 +183,7 @@ class TestDashboardDAO(SupersetTestCase):
db.session.commit()
@pytest.mark.usefixtures("load_world_bank_dashboard_with_slices")
- @patch("superset.dashboards.dao.g")
+ @patch("superset.daos.dashboard.g")
def test_copy_dashboard_duplicate_slices(self, mock_g):
mock_g.user = security_manager.find_user("admin")
original_dash = (
diff --git a/tests/integration_tests/dashboards/security/security_dataset_tests.py b/tests/integration_tests/dashboards/security/security_dataset_tests.py
index 875eb9145e..dffab61a7a 100644
--- a/tests/integration_tests/dashboards/security/security_dataset_tests.py
+++ b/tests/integration_tests/dashboards/security/security_dataset_tests.py
@@ -22,7 +22,7 @@ import pytest
from flask import escape
from superset import app
-from superset.dashboards.dao import DashboardDAO
+from superset.daos.dashboard import DashboardDAO
from superset.models import core as models
from tests.integration_tests.dashboards.base_case import DashboardTestCase
from tests.integration_tests.dashboards.consts import *
diff --git a/tests/integration_tests/databases/commands_tests.py b/tests/integration_tests/databases/commands_tests.py
index b47d3d89fe..8ffb31b782 100644
--- a/tests/integration_tests/databases/commands_tests.py
+++ b/tests/integration_tests/databases/commands_tests.py
@@ -859,7 +859,7 @@ class TestImportDatabasesCommand(SupersetTestCase):
class TestTestConnectionDatabaseCommand(SupersetTestCase):
- @patch("superset.databases.dao.Database._get_sqla_engine")
+ @patch("superset.daos.database.Database._get_sqla_engine")
@patch("superset.databases.commands.test_connection.event_logger.log_with_context")
@patch("superset.utils.core.g")
def test_connection_db_exception(
@@ -880,7 +880,7 @@ class TestTestConnectionDatabaseCommand(SupersetTestCase):
)
mock_event_logger.assert_called()
- @patch("superset.databases.dao.Database._get_sqla_engine")
+ @patch("superset.daos.database.Database._get_sqla_engine")
@patch("superset.databases.commands.test_connection.event_logger.log_with_context")
@patch("superset.utils.core.g")
def test_connection_do_ping_exception(
@@ -925,7 +925,7 @@ class TestTestConnectionDatabaseCommand(SupersetTestCase):
== SupersetErrorType.CONNECTION_DATABASE_TIMEOUT
)
- @patch("superset.databases.dao.Database._get_sqla_engine")
+ @patch("superset.daos.database.Database._get_sqla_engine")
@patch("superset.databases.commands.test_connection.event_logger.log_with_context")
@patch("superset.utils.core.g")
def test_connection_superset_security_connection(
@@ -948,7 +948,7 @@ class TestTestConnectionDatabaseCommand(SupersetTestCase):
mock_event_logger.assert_called()
- @patch("superset.databases.dao.Database._get_sqla_engine")
+ @patch("superset.daos.database.Database._get_sqla_engine")
@patch("superset.databases.commands.test_connection.event_logger.log_with_context")
@patch("superset.utils.core.g")
def test_connection_db_api_exc(
@@ -1093,7 +1093,7 @@ def test_validate_partial_invalid_hostname(is_hostname_valid, app_context):
class TestTablesDatabaseCommand(SupersetTestCase):
- @patch("superset.databases.dao.DatabaseDAO.find_by_id")
+ @patch("superset.daos.database.DatabaseDAO.find_by_id")
def test_database_tables_list_with_unknown_database(self, mock_find_by_id):
mock_find_by_id.return_value = None
command = TablesDatabaseCommand(1, "test", False)
@@ -1102,7 +1102,7 @@ class TestTablesDatabaseCommand(SupersetTestCase):
command.run()
assert str(excinfo.value) == ("Database not found.")
- @patch("superset.databases.dao.DatabaseDAO.find_by_id")
+ @patch("superset.daos.database.DatabaseDAO.find_by_id")
@patch("superset.security.manager.SupersetSecurityManager.can_access_database")
@patch("superset.utils.core.g")
def test_database_tables_superset_exception(
@@ -1121,7 +1121,7 @@ class TestTablesDatabaseCommand(SupersetTestCase):
command.run()
assert str(excinfo.value) == "Test Error"
- @patch("superset.databases.dao.DatabaseDAO.find_by_id")
+ @patch("superset.daos.database.DatabaseDAO.find_by_id")
@patch("superset.security.manager.SupersetSecurityManager.can_access_database")
@patch("superset.utils.core.g")
def test_database_tables_exception(
@@ -1140,7 +1140,7 @@ class TestTablesDatabaseCommand(SupersetTestCase):
== "Unexpected error occurred, please check your logs for details"
)
- @patch("superset.databases.dao.DatabaseDAO.find_by_id")
+ @patch("superset.daos.database.DatabaseDAO.find_by_id")
@patch("superset.security.manager.SupersetSecurityManager.can_access_database")
@patch("superset.utils.core.g")
def test_database_tables_list_tables(
diff --git a/tests/integration_tests/datasets/api_tests.py b/tests/integration_tests/datasets/api_tests.py
index 02ef23f0b8..55fda1af65 100644
--- a/tests/integration_tests/datasets/api_tests.py
+++ b/tests/integration_tests/datasets/api_tests.py
@@ -30,7 +30,7 @@ from sqlalchemy.sql import func
from superset import app
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
-from superset.dao.exceptions import (
+from superset.daos.exceptions import (
DAOCreateFailedError,
DAODeleteFailedError,
DAOUpdateFailedError,
@@ -827,7 +827,7 @@ class TestDatasetApi(SupersetTestCase):
rv = self.client.delete(uri)
assert rv.status_code == 200
- @patch("superset.datasets.dao.DatasetDAO.create")
+ @patch("superset.daos.dataset.DatasetDAO.create")
def test_create_dataset_sqlalchemy_error(self, mock_dao_create):
"""
Dataset API: Test create dataset sqlalchemy error
@@ -1440,7 +1440,7 @@ class TestDatasetApi(SupersetTestCase):
db.session.delete(dataset)
db.session.commit()
- @patch("superset.datasets.dao.DatasetDAO.update")
+ @patch("superset.daos.dataset.DatasetDAO.update")
def test_update_dataset_sqlalchemy_error(self, mock_dao_update):
"""
Dataset API: Test update dataset sqlalchemy error
@@ -1512,7 +1512,7 @@ class TestDatasetApi(SupersetTestCase):
db.session.delete(dataset)
db.session.commit()
- @patch("superset.datasets.dao.DatasetDAO.delete")
+ @patch("superset.daos.dataset.DatasetDAO.delete")
def test_delete_dataset_sqlalchemy_error(self, mock_dao_delete):
"""
Dataset API: Test delete dataset sqlalchemy error
@@ -1589,7 +1589,7 @@ class TestDatasetApi(SupersetTestCase):
assert rv.status_code == 403
@pytest.mark.usefixtures("create_datasets")
- @patch("superset.datasets.dao.DatasetDAO.delete")
+ @patch("superset.daos.dataset.DatasetDAO.delete")
def test_delete_dataset_column_fail(self, mock_dao_delete):
"""
Dataset API: Test delete dataset column
@@ -1669,7 +1669,7 @@ class TestDatasetApi(SupersetTestCase):
assert rv.status_code == 403
@pytest.mark.usefixtures("create_datasets")
- @patch("superset.datasets.dao.DatasetDAO.delete")
+ @patch("superset.daos.dataset.DatasetDAO.delete")
def test_delete_dataset_metric_fail(self, mock_dao_delete):
"""
Dataset API: Test delete dataset metric
diff --git a/tests/integration_tests/datasource/api_tests.py b/tests/integration_tests/datasource/api_tests.py
index 522aa33383..b6a6af105d 100644
--- a/tests/integration_tests/datasource/api_tests.py
+++ b/tests/integration_tests/datasource/api_tests.py
@@ -21,7 +21,7 @@ import pytest
from superset import db, security_manager
from superset.connectors.sqla.models import SqlaTable
-from superset.dao.exceptions import DatasourceTypeNotSupportedError
+from superset.daos.exceptions import DatasourceTypeNotSupportedError
from tests.integration_tests.base_tests import SupersetTestCase
diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py
index 2e42c32c8b..b73acc2681 100644
--- a/tests/integration_tests/datasource_tests.py
+++ b/tests/integration_tests/datasource_tests.py
@@ -26,7 +26,7 @@ from superset import app, db
from superset.common.utils.query_cache_manager import QueryCacheManager
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
from superset.constants import CacheRegion
-from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
+from superset.daos.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError
from superset.datasets.commands.exceptions import DatasetNotFoundError
from superset.exceptions import SupersetGenericDBErrorException
from superset.models.core import Database
@@ -433,7 +433,7 @@ class TestDatasource(SupersetTestCase):
app.config["DATASET_HEALTH_CHECK"] = None
def test_get_datasource_failed(self):
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
pytest.raises(
DatasourceNotFound,
@@ -445,7 +445,7 @@ class TestDatasource(SupersetTestCase):
self.assertEqual(resp.get("error"), "Datasource does not exist")
def test_get_datasource_invalid_datasource_failed(self):
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
pytest.raises(
DatasourceTypeNotSupportedError,
diff --git a/tests/integration_tests/embedded/api_tests.py b/tests/integration_tests/embedded/api_tests.py
index 8f3950fcf5..113d38166e 100644
--- a/tests/integration_tests/embedded/api_tests.py
+++ b/tests/integration_tests/embedded/api_tests.py
@@ -21,7 +21,7 @@ from unittest import mock
import pytest
from superset import db
-from superset.embedded.dao import EmbeddedDAO
+from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.models.dashboard import Dashboard
from tests.integration_tests.base_tests import SupersetTestCase
from tests.integration_tests.fixtures.birth_names_dashboard import (
@@ -41,7 +41,7 @@ class TestEmbeddedDashboardApi(SupersetTestCase):
def test_get_embedded_dashboard(self):
self.login("admin")
self.dash = db.session.query(Dashboard).filter_by(slug="births").first()
- self.embedded = EmbeddedDAO.upsert(self.dash, [])
+ self.embedded = EmbeddedDashboardDAO.upsert(self.dash, [])
uri = f"api/v1/{self.resource_name}/{self.embedded.uuid}"
response = self.client.get(uri)
self.assert200(response)
diff --git a/tests/integration_tests/embedded/dao_tests.py b/tests/integration_tests/embedded/dao_tests.py
index 8160144a25..8d62fc0f6d 100644
--- a/tests/integration_tests/embedded/dao_tests.py
+++ b/tests/integration_tests/embedded/dao_tests.py
@@ -19,7 +19,7 @@ import pytest
import tests.integration_tests.test_app # pylint: disable=unused-import
from superset import db
-from superset.embedded.dao import EmbeddedDAO
+from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.models.dashboard import Dashboard
from tests.integration_tests.base_tests import SupersetTestCase
from tests.integration_tests.fixtures.world_bank_dashboard import (
@@ -28,24 +28,24 @@ from tests.integration_tests.fixtures.world_bank_dashboard import (
)
-class TestEmbeddedDAO(SupersetTestCase):
+class TestEmbeddedDashboardDAO(SupersetTestCase):
@pytest.mark.usefixtures("load_world_bank_dashboard_with_slices")
def test_upsert(self):
dash = db.session.query(Dashboard).filter_by(slug="world_health").first()
assert not dash.embedded
- EmbeddedDAO.upsert(dash, ["test.example.com"])
+ EmbeddedDashboardDAO.upsert(dash, ["test.example.com"])
assert dash.embedded
self.assertEqual(dash.embedded[0].allowed_domains, ["test.example.com"])
original_uuid = dash.embedded[0].uuid
self.assertIsNotNone(original_uuid)
- EmbeddedDAO.upsert(dash, [])
+ EmbeddedDashboardDAO.upsert(dash, [])
self.assertEqual(dash.embedded[0].allowed_domains, [])
self.assertEqual(dash.embedded[0].uuid, original_uuid)
@pytest.mark.usefixtures("load_world_bank_dashboard_with_slices")
def test_get_by_uuid(self):
dash = db.session.query(Dashboard).filter_by(slug="world_health").first()
- uuid = str(EmbeddedDAO.upsert(dash, ["test.example.com"]).uuid)
+ uuid = str(EmbeddedDashboardDAO.upsert(dash, ["test.example.com"]).uuid)
db.session.expire_all()
- embedded = EmbeddedDAO.find_by_id(uuid)
+ embedded = EmbeddedDashboardDAO.find_by_id(uuid)
self.assertIsNotNone(embedded)
diff --git a/tests/integration_tests/embedded/test_view.py b/tests/integration_tests/embedded/test_view.py
index 9f524e9c09..1b3248883f 100644
--- a/tests/integration_tests/embedded/test_view.py
+++ b/tests/integration_tests/embedded/test_view.py
@@ -22,7 +22,7 @@ from unittest import mock
import pytest
from superset import db
-from superset.embedded.dao import EmbeddedDAO
+from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.models.dashboard import Dashboard
from tests.integration_tests.fixtures.birth_names_dashboard import (
load_birth_names_dashboard_with_slices,
@@ -43,7 +43,7 @@ if TYPE_CHECKING:
)
def test_get_embedded_dashboard(client: FlaskClient[Any]):
dash = db.session.query(Dashboard).filter_by(slug="births").first()
- embedded = EmbeddedDAO.upsert(dash, [])
+ embedded = EmbeddedDashboardDAO.upsert(dash, [])
uri = f"embedded/{embedded.uuid}"
response = client.get(uri)
assert response.status_code == 200
@@ -56,7 +56,7 @@ def test_get_embedded_dashboard(client: FlaskClient[Any]):
)
def test_get_embedded_dashboard_referrer_not_allowed(client: FlaskClient[Any]):
dash = db.session.query(Dashboard).filter_by(slug="births").first()
- embedded = EmbeddedDAO.upsert(dash, ["test.example.com"])
+ embedded = EmbeddedDashboardDAO.upsert(dash, ["test.example.com"])
uri = f"embedded/{embedded.uuid}"
response = client.get(uri)
assert response.status_code == 403
diff --git a/tests/integration_tests/explore/api_tests.py b/tests/integration_tests/explore/api_tests.py
index af5bd88137..50606257c2 100644
--- a/tests/integration_tests/explore/api_tests.py
+++ b/tests/integration_tests/explore/api_tests.py
@@ -216,7 +216,7 @@ def test_get_dataset_access_denied(
assert data["message"] == message
-@patch("superset.datasource.dao.DatasourceDAO.get_datasource")
+@patch("superset.daos.datasource.DatasourceDAO.get_datasource")
def test_wrong_endpoint(mock_get_datasource, test_client, login_as_admin, dataset):
dataset.default_endpoint = "another_endpoint"
mock_get_datasource.return_value = dataset
diff --git a/tests/integration_tests/query_context_tests.py b/tests/integration_tests/query_context_tests.py
index 7a3d4e4a1e..8c2082d1c4 100644
--- a/tests/integration_tests/query_context_tests.py
+++ b/tests/integration_tests/query_context_tests.py
@@ -30,7 +30,7 @@ from superset.common.query_context import QueryContext
from superset.common.query_context_factory import QueryContextFactory
from superset.common.query_object import QueryObject
from superset.connectors.sqla.models import SqlMetric
-from superset.datasource.dao import DatasourceDAO
+from superset.daos.datasource import DatasourceDAO
from superset.extensions import cache_manager
from superset.superset_typing import AdhocColumn
from superset.utils.core import (
diff --git a/tests/integration_tests/reports/commands_tests.py b/tests/integration_tests/reports/commands_tests.py
index db80079d77..120559f8fd 100644
--- a/tests/integration_tests/reports/commands_tests.py
+++ b/tests/integration_tests/reports/commands_tests.py
@@ -1955,7 +1955,7 @@ def test_grace_period_error_flap(
@pytest.mark.usefixtures(
"load_birth_names_dashboard_with_slices", "create_report_email_dashboard"
)
-@patch("superset.reports.dao.ReportScheduleDAO.bulk_delete_logs")
+@patch("superset.daos.report.ReportScheduleDAO.bulk_delete_logs")
def test_prune_log_soft_time_out(bulk_delete_logs, create_report_email_dashboard):
from celery.exceptions import SoftTimeLimitExceeded
diff --git a/tests/integration_tests/security/api_tests.py b/tests/integration_tests/security/api_tests.py
index 9a5a085c81..2462803f21 100644
--- a/tests/integration_tests/security/api_tests.py
+++ b/tests/integration_tests/security/api_tests.py
@@ -23,7 +23,7 @@ import pytest
from flask_wtf.csrf import generate_csrf
from superset import db
-from superset.embedded.dao import EmbeddedDAO
+from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.models.dashboard import Dashboard
from superset.utils.urls import get_url_host
from tests.integration_tests.base_tests import SupersetTestCase
@@ -89,7 +89,7 @@ class TestSecurityGuestTokenApi(SupersetTestCase):
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
def test_post_guest_token_authorized(self):
self.dash = db.session.query(Dashboard).filter_by(slug="births").first()
- self.embedded = EmbeddedDAO.upsert(self.dash, [])
+ self.embedded = EmbeddedDashboardDAO.upsert(self.dash, [])
self.login(username="admin")
user = {"username": "bob", "first_name": "Bob", "last_name": "Also Bob"}
resource = {"type": "dashboard", "id": str(self.embedded.uuid)}
diff --git a/tests/integration_tests/security/guest_token_security_tests.py b/tests/integration_tests/security/guest_token_security_tests.py
index 78bd8bde86..86d02975d0 100644
--- a/tests/integration_tests/security/guest_token_security_tests.py
+++ b/tests/integration_tests/security/guest_token_security_tests.py
@@ -21,8 +21,8 @@ import pytest
from flask import g
from superset import db, security_manager
+from superset.daos.dashboard import EmbeddedDashboardDAO
from superset.dashboards.commands.exceptions import DashboardAccessDeniedError
-from superset.embedded.dao import EmbeddedDAO
from superset.exceptions import SupersetSecurityException
from superset.models.dashboard import Dashboard
from superset.security.guest_token import GuestTokenResourceType
@@ -100,7 +100,7 @@ class TestGuestUserSecurity(SupersetTestCase):
class TestGuestUserDashboardAccess(SupersetTestCase):
def setUp(self) -> None:
self.dash = db.session.query(Dashboard).filter_by(slug="births").first()
- self.embedded = EmbeddedDAO.upsert(self.dash, [])
+ self.embedded = EmbeddedDashboardDAO.upsert(self.dash, [])
self.authorized_guest = security_manager.get_guest_user_from_token(
{
"user": {},
diff --git a/tests/integration_tests/security_tests.py b/tests/integration_tests/security_tests.py
index 17a6a78548..fe19944387 100644
--- a/tests/integration_tests/security_tests.py
+++ b/tests/integration_tests/security_tests.py
@@ -29,7 +29,7 @@ import pytest
from flask import current_app
from flask_appbuilder.security.sqla.models import Role
-from superset.datasource.dao import DatasourceDAO
+from superset.daos.datasource import DatasourceDAO
from superset.models.dashboard import Dashboard
from superset import app, appbuilder, db, security_manager, viz
from superset.connectors.sqla.models import SqlaTable
diff --git a/tests/integration_tests/tags/dao_tests.py b/tests/integration_tests/tags/dao_tests.py
index 49b22d260b..8acaa353e9 100644
--- a/tests/integration_tests/tags/dao_tests.py
+++ b/tests/integration_tests/tags/dao_tests.py
@@ -18,17 +18,17 @@
from operator import and_
from unittest.mock import patch
import pytest
-from superset.dao.exceptions import DAOCreateFailedError, DAOException
+from superset.daos.exceptions import DAOCreateFailedError, DAOException
from superset.models.slice import Slice
from superset.models.sql_lab import SavedQuery
-from superset.tags.dao import TagDAO
+from superset.daos.tag import TagDAO
from superset.tags.exceptions import InvalidTagNameError
from superset.tags.models import ObjectTypes, Tag, TaggedObject
from tests.integration_tests.tags.api_tests import TAGS_FIXTURE_COUNT
import tests.integration_tests.test_app # pylint: disable=unused-import
from superset import db, security_manager
-from superset.dashboards.dao import DashboardDAO
+from superset.daos.dashboard import DashboardDAO
from superset.models.dashboard import Dashboard
from tests.integration_tests.base_tests import SupersetTestCase
from tests.integration_tests.fixtures.world_bank_dashboard import (
diff --git a/tests/unit_tests/charts/dao/dao_tests.py b/tests/unit_tests/charts/dao/dao_tests.py
index b1d5cc6488..e8c58b5600 100644
--- a/tests/unit_tests/charts/dao/dao_tests.py
+++ b/tests/unit_tests/charts/dao/dao_tests.py
@@ -45,7 +45,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_slice_find_by_id_skip_base_filter(session_with_data: Session) -> None:
- from superset.charts.dao import ChartDAO
+ from superset.daos.chart import ChartDAO
from superset.models.slice import Slice
result = ChartDAO.find_by_id(1, session=session_with_data, skip_base_filter=True)
@@ -59,7 +59,7 @@ def test_slice_find_by_id_skip_base_filter(session_with_data: Session) -> None:
def test_datasource_find_by_id_skip_base_filter_not_found(
session_with_data: Session,
) -> None:
- from superset.charts.dao import ChartDAO
+ from superset.daos.chart import ChartDAO
result = ChartDAO.find_by_id(
125326326, session=session_with_data, skip_base_filter=True
@@ -68,7 +68,7 @@ def test_datasource_find_by_id_skip_base_filter_not_found(
def test_add_favorite(session_with_data: Session) -> None:
- from superset.charts.dao import ChartDAO
+ from superset.daos.chart import ChartDAO
chart = ChartDAO.find_by_id(1, session=session_with_data, skip_base_filter=True)
if not chart:
@@ -83,7 +83,7 @@ def test_add_favorite(session_with_data: Session) -> None:
def test_remove_favorite(session_with_data: Session) -> None:
- from superset.charts.dao import ChartDAO
+ from superset.daos.chart import ChartDAO
chart = ChartDAO.find_by_id(1, session=session_with_data, skip_base_filter=True)
if not chart:
diff --git a/tests/unit_tests/dao/queries_test.py b/tests/unit_tests/dao/queries_test.py
index d0ab3ec8a5..65e9bbfbfb 100644
--- a/tests/unit_tests/dao/queries_test.py
+++ b/tests/unit_tests/dao/queries_test.py
@@ -51,7 +51,7 @@ def test_query_dao_save_metadata(session: Session) -> None:
session.add(db)
session.add(query_obj)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
query = session.query(Query).one()
QueryDAO.save_metadata(query=query, payload={"columns": []})
@@ -105,7 +105,7 @@ def test_query_dao_get_queries_changed_after(session: Session) -> None:
session.add(old_query_obj)
session.add(updated_query_obj)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
timestamp = datetime.timestamp(now - timedelta(days=2)) * 1000
result = QueryDAO.get_queries_changed_after(timestamp)
@@ -146,7 +146,7 @@ def test_query_dao_stop_query_not_found(
mocker.patch("superset.sql_lab.cancel_query", return_value=False)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
with pytest.raises(QueryNotFoundException):
QueryDAO.stop_query("foo2")
@@ -186,7 +186,7 @@ def test_query_dao_stop_query_not_running(
session.add(db)
session.add(query_obj)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
QueryDAO.stop_query(query_obj.client_id)
query = session.query(Query).one()
@@ -226,7 +226,7 @@ def test_query_dao_stop_query_failed(
mocker.patch("superset.sql_lab.cancel_query", return_value=False)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
with pytest.raises(SupersetCancelQueryException):
QueryDAO.stop_query(query_obj.client_id)
@@ -266,7 +266,7 @@ def test_query_dao_stop_query(mocker: MockFixture, app: Any, session: Session) -
mocker.patch("superset.sql_lab.cancel_query", return_value=True)
- from superset.queries.dao import QueryDAO
+ from superset.daos.query import QueryDAO
QueryDAO.stop_query(query_obj.client_id)
query = session.query(Query).one()
diff --git a/tests/unit_tests/dashboards/dao_tests.py b/tests/unit_tests/dashboards/dao_tests.py
index c94d2ab157..3bf4038f16 100644
--- a/tests/unit_tests/dashboards/dao_tests.py
+++ b/tests/unit_tests/dashboards/dao_tests.py
@@ -43,7 +43,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_add_favorite(session_with_data: Session) -> None:
- from superset.dashboards.dao import DashboardDAO
+ from superset.daos.dashboard import DashboardDAO
dashboard = DashboardDAO.find_by_id(
100, session=session_with_data, skip_base_filter=True
@@ -60,7 +60,7 @@ def test_add_favorite(session_with_data: Session) -> None:
def test_remove_favorite(session_with_data: Session) -> None:
- from superset.dashboards.dao import DashboardDAO
+ from superset.daos.dashboard import DashboardDAO
dashboard = DashboardDAO.find_by_id(
100, session=session_with_data, skip_base_filter=True
diff --git a/tests/unit_tests/databases/api_test.py b/tests/unit_tests/databases/api_test.py
index 342920bd17..24fde88369 100644
--- a/tests/unit_tests/databases/api_test.py
+++ b/tests/unit_tests/databases/api_test.py
@@ -356,8 +356,8 @@ def test_delete_ssh_tunnel(
Test that we can delete SSH Tunnel
"""
with app.app_context():
+ from superset.daos.database import DatabaseDAO
from superset.databases.api import DatabaseRestApi
- from superset.databases.dao import DatabaseDAO
from superset.databases.ssh_tunnel.models import SSHTunnel
from superset.models.core import Database
@@ -432,8 +432,8 @@ def test_delete_ssh_tunnel_not_found(
Test that we cannot delete a tunnel that does not exist
"""
with app.app_context():
+ from superset.daos.database import DatabaseDAO
from superset.databases.api import DatabaseRestApi
- from superset.databases.dao import DatabaseDAO
from superset.databases.ssh_tunnel.models import SSHTunnel
from superset.models.core import Database
diff --git a/tests/unit_tests/databases/dao/dao_tests.py b/tests/unit_tests/databases/dao/dao_tests.py
index f085cb53c7..b792a65336 100644
--- a/tests/unit_tests/databases/dao/dao_tests.py
+++ b/tests/unit_tests/databases/dao/dao_tests.py
@@ -51,7 +51,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_database_get_ssh_tunnel(session_with_data: Session) -> None:
- from superset.databases.dao import DatabaseDAO
+ from superset.daos.database import DatabaseDAO
from superset.databases.ssh_tunnel.models import SSHTunnel
result = DatabaseDAO.get_ssh_tunnel(1)
@@ -62,7 +62,7 @@ def test_database_get_ssh_tunnel(session_with_data: Session) -> None:
def test_database_get_ssh_tunnel_not_found(session_with_data: Session) -> None:
- from superset.databases.dao import DatabaseDAO
+ from superset.daos.database import DatabaseDAO
result = DatabaseDAO.get_ssh_tunnel(2)
diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py b/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py
index de0b70db9c..641e34d347 100644
--- a/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py
+++ b/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py
@@ -54,7 +54,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_delete_ssh_tunnel_command(
mocker: MockFixture, session_with_data: Session
) -> None:
- from superset.databases.dao import DatabaseDAO
+ from superset.daos.database import DatabaseDAO
from superset.databases.ssh_tunnel.commands.delete import DeleteSSHTunnelCommand
from superset.databases.ssh_tunnel.models import SSHTunnel
diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py b/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py
index 544cf3434a..d4a5faba8b 100644
--- a/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py
+++ b/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py
@@ -50,7 +50,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_update_shh_tunnel_command(session_with_data: Session) -> None:
- from superset.databases.dao import DatabaseDAO
+ from superset.daos.database import DatabaseDAO
from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand
from superset.databases.ssh_tunnel.models import SSHTunnel
@@ -72,7 +72,7 @@ def test_update_shh_tunnel_command(session_with_data: Session) -> None:
def test_update_shh_tunnel_invalid_params(session_with_data: Session) -> None:
- from superset.databases.dao import DatabaseDAO
+ from superset.daos.database import DatabaseDAO
from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand
from superset.databases.ssh_tunnel.models import SSHTunnel
diff --git a/tests/unit_tests/databases/ssh_tunnel/dao_tests.py b/tests/unit_tests/databases/ssh_tunnel/dao_tests.py
index 27f9c3b8ad..af0b1ac001 100644
--- a/tests/unit_tests/databases/ssh_tunnel/dao_tests.py
+++ b/tests/unit_tests/databases/ssh_tunnel/dao_tests.py
@@ -21,8 +21,7 @@ from sqlalchemy.orm.session import Session
def test_create_ssh_tunnel():
- from superset.databases.dao import DatabaseDAO
- from superset.databases.ssh_tunnel.dao import SSHTunnelDAO
+ from superset.daos.database import DatabaseDAO, SSHTunnelDAO
from superset.databases.ssh_tunnel.models import SSHTunnel
from superset.models.core import Database
diff --git a/tests/unit_tests/datasets/dao/dao_tests.py b/tests/unit_tests/datasets/dao/dao_tests.py
index 4eb43cd9de..3302f2dc04 100644
--- a/tests/unit_tests/datasets/dao/dao_tests.py
+++ b/tests/unit_tests/datasets/dao/dao_tests.py
@@ -46,7 +46,7 @@ def session_with_data(session: Session) -> Iterator[Session]:
def test_datasource_find_by_id_skip_base_filter(session_with_data: Session) -> None:
from superset.connectors.sqla.models import SqlaTable
- from superset.datasets.dao import DatasetDAO
+ from superset.daos.dataset import DatasetDAO
result = DatasetDAO.find_by_id(
1,
@@ -63,7 +63,7 @@ def test_datasource_find_by_id_skip_base_filter(session_with_data: Session) -> N
def test_datasource_find_by_id_skip_base_filter_not_found(
session_with_data: Session,
) -> None:
- from superset.datasets.dao import DatasetDAO
+ from superset.daos.dataset import DatasetDAO
result = DatasetDAO.find_by_id(
125326326,
@@ -75,7 +75,7 @@ def test_datasource_find_by_id_skip_base_filter_not_found(
def test_datasource_find_by_ids_skip_base_filter(session_with_data: Session) -> None:
from superset.connectors.sqla.models import SqlaTable
- from superset.datasets.dao import DatasetDAO
+ from superset.daos.dataset import DatasetDAO
result = DatasetDAO.find_by_ids(
[1, 125326326],
@@ -92,7 +92,7 @@ def test_datasource_find_by_ids_skip_base_filter(session_with_data: Session) ->
def test_datasource_find_by_ids_skip_base_filter_not_found(
session_with_data: Session,
) -> None:
- from superset.datasets.dao import DatasetDAO
+ from superset.daos.dataset import DatasetDAO
result = DatasetDAO.find_by_ids(
[125326326, 125326326125326326],
diff --git a/tests/unit_tests/datasource/dao_tests.py b/tests/unit_tests/datasource/dao_tests.py
index 99a4850301..0af2cbf020 100644
--- a/tests/unit_tests/datasource/dao_tests.py
+++ b/tests/unit_tests/datasource/dao_tests.py
@@ -101,7 +101,7 @@ FROM my_catalog.my_schema.my_table
def test_get_datasource_sqlatable(session_with_data: Session) -> None:
from superset.connectors.sqla.models import SqlaTable
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
result = DatasourceDAO.get_datasource(
datasource_type=DatasourceType.TABLE,
@@ -115,7 +115,7 @@ def test_get_datasource_sqlatable(session_with_data: Session) -> None:
def test_get_datasource_query(session_with_data: Session) -> None:
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
from superset.models.sql_lab import Query
result = DatasourceDAO.get_datasource(
@@ -127,7 +127,7 @@ def test_get_datasource_query(session_with_data: Session) -> None:
def test_get_datasource_saved_query(session_with_data: Session) -> None:
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
from superset.models.sql_lab import SavedQuery
result = DatasourceDAO.get_datasource(
@@ -141,7 +141,7 @@ def test_get_datasource_saved_query(session_with_data: Session) -> None:
def test_get_datasource_sl_table(session_with_data: Session) -> None:
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
from superset.tables.models import Table
result = DatasourceDAO.get_datasource(
@@ -155,8 +155,8 @@ def test_get_datasource_sl_table(session_with_data: Session) -> None:
def test_get_datasource_sl_dataset(session_with_data: Session) -> None:
+ from superset.daos.datasource import DatasourceDAO
from superset.datasets.models import Dataset
- from superset.datasource.dao import DatasourceDAO
result = DatasourceDAO.get_datasource(
datasource_type=DatasourceType.DATASET,
@@ -170,8 +170,8 @@ def test_get_datasource_sl_dataset(session_with_data: Session) -> None:
def test_get_datasource_w_str_param(session_with_data: Session) -> None:
from superset.connectors.sqla.models import SqlaTable
+ from superset.daos.datasource import DatasourceDAO
from superset.datasets.models import Dataset
- from superset.datasource.dao import DatasourceDAO
from superset.tables.models import Table
assert isinstance(
@@ -201,8 +201,8 @@ def test_get_all_datasources(session_with_data: Session) -> None:
def test_not_found_datasource(session_with_data: Session) -> None:
- from superset.dao.exceptions import DatasourceNotFound
- from superset.datasource.dao import DatasourceDAO
+ from superset.daos.datasource import DatasourceDAO
+ from superset.daos.exceptions import DatasourceNotFound
with pytest.raises(DatasourceNotFound):
DatasourceDAO.get_datasource(
diff --git a/tests/unit_tests/explore/utils_test.py b/tests/unit_tests/explore/utils_test.py
index b2989b1244..de39187ec7 100644
--- a/tests/unit_tests/explore/utils_test.py
+++ b/tests/unit_tests/explore/utils_test.py
@@ -35,9 +35,9 @@ from superset.datasets.commands.exceptions import (
from superset.exceptions import SupersetSecurityException
from superset.utils.core import DatasourceType, override_user
-dataset_find_by_id = "superset.datasets.dao.DatasetDAO.find_by_id"
-query_find_by_id = "superset.queries.dao.QueryDAO.find_by_id"
-chart_find_by_id = "superset.charts.dao.ChartDAO.find_by_id"
+dataset_find_by_id = "superset.daos.dataset.DatasetDAO.find_by_id"
+query_find_by_id = "superset.daos.query.QueryDAO.find_by_id"
+chart_find_by_id = "superset.daos.chart.ChartDAO.find_by_id"
is_admin = "superset.security.SupersetSecurityManager.is_admin"
is_owner = "superset.security.SupersetSecurityManager.is_owner"
can_access_datasource = (
diff --git a/tests/unit_tests/jinja_context_test.py b/tests/unit_tests/jinja_context_test.py
index 3478a9e3f0..fe4b144d2f 100644
--- a/tests/unit_tests/jinja_context_test.py
+++ b/tests/unit_tests/jinja_context_test.py
@@ -83,7 +83,7 @@ def test_dataset_macro(mocker: MockFixture) -> None:
schema_perm=None,
extra=json.dumps({"warning_markdown": "*WARNING*"}),
)
- DatasetDAO = mocker.patch("superset.datasets.dao.DatasetDAO")
+ DatasetDAO = mocker.patch("superset.daos.dataset.DatasetDAO")
DatasetDAO.find_by_id.return_value = dataset
assert (
@@ -143,7 +143,7 @@ def test_dataset_macro_mutator_with_comments(mocker: MockFixture) -> None:
"""
return f"-- begin\n{sql}\n-- end"
- DatasetDAO = mocker.patch("superset.datasets.dao.DatasetDAO")
+ DatasetDAO = mocker.patch("superset.daos.dataset.DatasetDAO")
DatasetDAO.find_by_id().get_query_str_extended().sql = mutator("SELECT 1")
assert (
dataset_macro(1)