From 71dca5c07632cb784c388b7badfd075b308e17c5 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Tue, 7 Jan 2025 13:58:38 -0800 Subject: [PATCH] feat: add and use UUIDMixin for most models (#30398) --- ...2024-09-25_17-59_7b17aa722e30_uuidmixin.py | 47 +++++++++++++++++++ superset/models/core.py | 6 +-- superset/models/helpers.py | 8 +++- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 superset/migrations/versions/2024-09-25_17-59_7b17aa722e30_uuidmixin.py diff --git a/superset/migrations/versions/2024-09-25_17-59_7b17aa722e30_uuidmixin.py b/superset/migrations/versions/2024-09-25_17-59_7b17aa722e30_uuidmixin.py new file mode 100644 index 000000000..2366d3bf2 --- /dev/null +++ b/superset/migrations/versions/2024-09-25_17-59_7b17aa722e30_uuidmixin.py @@ -0,0 +1,47 @@ +# 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. +"""UUIDMixin + +Revision ID: 7b17aa722e30 +Revises: 48cbb571fa3a +Create Date: 2024-09-25 17:59:21.028426 + +""" + +import sqlalchemy as sa +import sqlalchemy_utils +from alembic import op + +# revision identifiers, used by Alembic. +revision = "7b17aa722e30" +down_revision = "48cbb571fa3a" + + +def upgrade(): + op.add_column( + "css_templates", + sa.Column("uuid", sqlalchemy_utils.types.uuid.UUIDType(), nullable=True), + ) + op.add_column( + "favstar", + sa.Column("uuid", sqlalchemy_utils.types.uuid.UUIDType(), nullable=True), + ) + + +def downgrade(): + op.drop_column("css_templates", "uuid") + op.drop_column("favstar", "uuid") diff --git a/superset/models/core.py b/superset/models/core.py index 3f9bd634f..afabea8f9 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -72,7 +72,7 @@ from superset.extensions import ( security_manager, ssh_manager_factory, ) -from superset.models.helpers import AuditMixinNullable, ImportExportMixin +from superset.models.helpers import AuditMixinNullable, ImportExportMixin, UUIDMixin from superset.result_set import SupersetResultSet from superset.sql_parse import Table from superset.superset_typing import ( @@ -107,7 +107,7 @@ class KeyValue(Model): # pylint: disable=too-few-public-methods value = Column(utils.MediumText(), nullable=False) -class CssTemplate(Model, AuditMixinNullable): +class CssTemplate(AuditMixinNullable, UUIDMixin, Model): """CSS templates for dashboards""" __tablename__ = "css_templates" @@ -1227,7 +1227,7 @@ class FavStarClassName(StrEnum): DASHBOARD = "Dashboard" -class FavStar(Model): # pylint: disable=too-few-public-methods +class FavStar(UUIDMixin, Model): __tablename__ = "favstar" id = Column(Integer, primary_key=True) diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 784d86d72..9587ec238 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -174,11 +174,17 @@ def convert_uuids(obj: Any) -> Any: return obj -class ImportExportMixin: +class UUIDMixin: # pylint: disable=too-few-public-methods uuid = sa.Column( UUIDType(binary=True), primary_key=False, unique=True, default=uuid.uuid4 ) + @property + def short_uuid(self) -> str: + return str(self.uuid)[:8] + + +class ImportExportMixin(UUIDMixin): export_parent: Optional[str] = None # The name of the attribute # with the SQL Alchemy back reference