From f2b8d6aef875cf69f472fb433557cff294f5e619 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Fri, 30 Oct 2020 09:11:56 -0700 Subject: [PATCH] chore: rename ImportMixin to ImportExportMixin (#11460) * Add UUID to saved_query * Reuse function from previous migration * Point to new head * feat: add backend to export saved queries using new format * Rename ImportMixin to ImportExportMixin --- superset/connectors/base/models.py | 10 +++++----- superset/connectors/druid/models.py | 23 +++++++++++------------ superset/models/core.py | 4 ++-- superset/models/dashboard.py | 4 ++-- superset/models/helpers.py | 3 +-- superset/models/schedules.py | 8 +++++--- superset/models/slice.py | 4 ++-- superset/models/sql_lab.py | 8 ++++++-- superset/views/base.py | 12 ++++++------ 9 files changed, 40 insertions(+), 36 deletions(-) diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index d780a5672e..1745da3ddc 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -25,7 +25,7 @@ from sqlalchemy.orm import foreign, Query, relationship, RelationshipProperty from superset import security_manager from superset.constants import NULL_STRING -from superset.models.helpers import AuditMixinNullable, ImportMixin, QueryResult +from superset.models.helpers import AuditMixinNullable, ImportExportMixin, QueryResult from superset.models.slice import Slice from superset.typing import FilterValue, FilterValues, QueryObjectDict from superset.utils import core as utils @@ -59,7 +59,7 @@ class DatasourceKind(str, Enum): class BaseDatasource( - AuditMixinNullable, ImportMixin + AuditMixinNullable, ImportExportMixin ): # pylint: disable=too-many-public-methods """A common interface to objects that are queryable (tables and datasources)""" @@ -482,7 +482,7 @@ class BaseDatasource( def get_extra_cache_keys( # pylint: disable=no-self-use self, query_obj: QueryObjectDict # pylint: disable=unused-argument ) -> List[Hashable]: - """ If a datasource needs to provide additional keys for calculation of + """If a datasource needs to provide additional keys for calculation of cache keys, those can be provided via this method :param query_obj: The dict representation of a query object @@ -508,7 +508,7 @@ class BaseDatasource( security_manager.raise_for_access(datasource=self) -class BaseColumn(AuditMixinNullable, ImportMixin): +class BaseColumn(AuditMixinNullable, ImportExportMixin): """Interface for column""" __tablename__: Optional[str] = None # {connector_name}_column @@ -580,7 +580,7 @@ class BaseColumn(AuditMixinNullable, ImportMixin): return {s: getattr(self, s) for s in attrs if hasattr(self, s)} -class BaseMetric(AuditMixinNullable, ImportMixin): +class BaseMetric(AuditMixinNullable, ImportExportMixin): """Interface for Metrics""" diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index f498ee6dc8..a8d00fd4a1 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -54,7 +54,7 @@ from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetr from superset.constants import NULL_STRING from superset.exceptions import SupersetException from superset.models.core import Database -from superset.models.helpers import AuditMixinNullable, ImportMixin, QueryResult +from superset.models.helpers import AuditMixinNullable, ImportExportMixin, QueryResult from superset.typing import FilterValues, Granularity, Metric, QueryObjectDict from superset.utils import core as utils, import_datasource @@ -121,7 +121,7 @@ def _fetch_metadata_for(datasource: "DruidDatasource") -> Optional[Dict[str, Any return datasource.latest_metadata() -class DruidCluster(Model, AuditMixinNullable, ImportMixin): +class DruidCluster(Model, AuditMixinNullable, ImportExportMixin): """ORM object referencing the Druid clusters""" @@ -616,9 +616,9 @@ class DruidDatasource(Model, BaseDatasource): ) -> int: """Imports the datasource from the object to the database. - Metrics and columns and datasource will be overridden if exists. - This function can be used to import/export dashboards between multiple - superset instances. Audit metadata isn't copies over. + Metrics and columns and datasource will be overridden if exists. + This function can be used to import/export dashboards between multiple + superset instances. Audit metadata isn't copies over. """ def lookup_datasource(d: DruidDatasource) -> Optional[DruidDatasource]: @@ -1082,12 +1082,12 @@ class DruidDatasource(Model, BaseDatasource): adhoc_metrics: Optional[List[Dict[str, Any]]] = None, ) -> "OrderedDict[str, Any]": """ - Returns a dictionary of aggregation metric names to aggregation json objects + Returns a dictionary of aggregation metric names to aggregation json objects - :param metrics_dict: dictionary of all the metrics - :param saved_metrics: list of saved metric names - :param adhoc_metrics: list of adhoc metric names - :raise SupersetException: if one or more metric names are not aggregations + :param metrics_dict: dictionary of all the metrics + :param saved_metrics: list of saved metric names + :param adhoc_metrics: list of adhoc metric names + :raise SupersetException: if one or more metric names are not aggregations """ if not adhoc_metrics: adhoc_metrics = [] @@ -1193,8 +1193,7 @@ class DruidDatasource(Model, BaseDatasource): client: Optional["PyDruid"] = None, order_desc: bool = True, ) -> str: - """Runs a query against Druid and returns a dataframe. - """ + """Runs a query against Druid and returns a dataframe.""" # TODO refactor into using a TBD Query object client = client or self.cluster.get_pydruid_client() row_limit = row_limit or conf.get("ROW_LIMIT") diff --git a/superset/models/core.py b/superset/models/core.py index e73b810c32..6d8a29cce2 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -54,7 +54,7 @@ from sqlalchemy_utils import EncryptedType from superset import app, db_engine_specs, is_feature_enabled, security_manager from superset.db_engine_specs.base import TimeGrain -from superset.models.helpers import AuditMixinNullable, ImportMixin +from superset.models.helpers import AuditMixinNullable, ImportExportMixin from superset.models.tags import FavStarUpdater from superset.result_set import SupersetResultSet from superset.utils import cache as cache_util, core as utils @@ -98,7 +98,7 @@ class CssTemplate(Model, AuditMixinNullable): class Database( - Model, AuditMixinNullable, ImportMixin + Model, AuditMixinNullable, ImportExportMixin ): # pylint: disable=too-many-public-methods """An ORM object that stores Database related information""" diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py index 777953880c..3ef50cde82 100644 --- a/superset/models/dashboard.py +++ b/superset/models/dashboard.py @@ -55,7 +55,7 @@ from superset import ( from superset.connectors.base.models import BaseDatasource from superset.connectors.druid.models import DruidColumn, DruidMetric from superset.connectors.sqla.models import SqlMetric, TableColumn -from superset.models.helpers import AuditMixinNullable, ImportMixin +from superset.models.helpers import AuditMixinNullable, ImportExportMixin from superset.models.slice import Slice from superset.models.tags import DashboardUpdater from superset.models.user_attributes import UserAttribute @@ -129,7 +129,7 @@ dashboard_user = Table( class Dashboard( # pylint: disable=too-many-instance-attributes - Model, AuditMixinNullable, ImportMixin + Model, AuditMixinNullable, ImportExportMixin ): """The dashboard object!""" diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 2d8b432db7..14cad2eb26 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -68,8 +68,7 @@ def convert_uuids(obj: Any) -> Any: return obj -# TODO (betodealmeida): rename to ImportExportMixin -class ImportMixin: +class ImportExportMixin: uuid = sa.Column( UUIDType(binary=True), primary_key=False, unique=True, default=uuid.uuid4 ) diff --git a/superset/models/schedules.py b/superset/models/schedules.py index 787d28b489..fdc90f00ae 100644 --- a/superset/models/schedules.py +++ b/superset/models/schedules.py @@ -25,7 +25,7 @@ from sqlalchemy.orm import relationship, RelationshipProperty from superset import security_manager from superset.models.alerts import Alert -from superset.models.helpers import AuditMixinNullable, ImportMixin +from superset.models.helpers import AuditMixinNullable, ImportExportMixin metadata = Model.metadata # pylint: disable=no-member @@ -74,7 +74,9 @@ class EmailSchedule: delivery_type = Column(Enum(EmailDeliveryType)) -class DashboardEmailSchedule(Model, AuditMixinNullable, ImportMixin, EmailSchedule): +class DashboardEmailSchedule( + Model, AuditMixinNullable, ImportExportMixin, EmailSchedule +): __tablename__ = "dashboard_email_schedules" dashboard_id = Column(Integer, ForeignKey("dashboards.id")) dashboard = relationship( @@ -82,7 +84,7 @@ class DashboardEmailSchedule(Model, AuditMixinNullable, ImportMixin, EmailSchedu ) -class SliceEmailSchedule(Model, AuditMixinNullable, ImportMixin, EmailSchedule): +class SliceEmailSchedule(Model, AuditMixinNullable, ImportExportMixin, EmailSchedule): __tablename__ = "slice_email_schedules" slice_id = Column(Integer, ForeignKey("slices.id")) slice = relationship("Slice", backref="email_schedules", foreign_keys=[slice_id]) diff --git a/superset/models/slice.py b/superset/models/slice.py index 87c140c2bf..4ed8ba41fb 100644 --- a/superset/models/slice.py +++ b/superset/models/slice.py @@ -30,7 +30,7 @@ from sqlalchemy.orm.mapper import Mapper from superset import ConnectorRegistry, db, is_feature_enabled, security_manager from superset.legacy import update_time_range -from superset.models.helpers import AuditMixinNullable, ImportMixin +from superset.models.helpers import AuditMixinNullable, ImportExportMixin from superset.models.tags import ChartUpdater from superset.tasks.thumbnails import cache_chart_thumbnail from superset.utils import core as utils @@ -56,7 +56,7 @@ logger = logging.getLogger(__name__) class Slice( - Model, AuditMixinNullable, ImportMixin + Model, AuditMixinNullable, ImportExportMixin ): # pylint: disable=too-many-public-methods """A slice is essentially a report or a view on data""" diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index aeec9c24d6..038836468c 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -39,7 +39,11 @@ from sqlalchemy.engine.url import URL from sqlalchemy.orm import backref, relationship from superset import security_manager -from superset.models.helpers import AuditMixinNullable, ExtraJSONMixin, ImportMixin +from superset.models.helpers import ( + AuditMixinNullable, + ExtraJSONMixin, + ImportExportMixin, +) from superset.models.tags import QueryUpdater from superset.sql_parse import CtasMethod, ParsedQuery, Table from superset.utils.core import QueryStatus, user_label @@ -162,7 +166,7 @@ class Query(Model, ExtraJSONMixin): security_manager.raise_for_access(query=self) -class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportMixin): +class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportExportMixin): """ORM model for SQL query""" __tablename__ = "saved_query" diff --git a/superset/views/base.py b/superset/views/base.py index 0b31afa5ca..3eb330cab6 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -53,7 +53,7 @@ from superset.exceptions import ( SupersetSecurityException, SupersetTimeoutException, ) -from superset.models.helpers import ImportMixin +from superset.models.helpers import ImportExportMixin from superset.translations.utils import get_language_pack from superset.typing import FlaskResponse from superset.utils import core as utils @@ -378,7 +378,7 @@ class YamlExportMixin: # pylint: disable=too-few-public-methods @action("yaml_export", __("Export to YAML"), __("Export to YAML?"), "fa-download") def yaml_export( - self, items: Union[ImportMixin, List[ImportMixin]] + self, items: Union[ImportExportMixin, List[ImportExportMixin]] ) -> FlaskResponse: if not isinstance(items, list): items = [items] @@ -395,11 +395,11 @@ class YamlExportMixin: # pylint: disable=too-few-public-methods class DeleteMixin: # pylint: disable=too-few-public-methods def _delete(self: BaseView, primary_key: int) -> None: """ - Delete function logic, override to implement diferent logic - deletes the record with primary_key = primary_key + Delete function logic, override to implement diferent logic + deletes the record with primary_key = primary_key - :param primary_key: - record primary key to delete + :param primary_key: + record primary key to delete """ item = self.datamodel.get(primary_key, self._base_filters) if not item: