diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index d43d07863902b..f370a9f64ce1d 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -152,6 +152,7 @@ def is_virtual(self) -> bool: def slices(self) -> RelationshipProperty: return relationship( "Slice", + overlaps="table", primaryjoin=lambda: and_( foreign(Slice.datasource_id) == self.id, foreign(Slice.datasource_type) == self.type, diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index fd3e9bb71acde..ad3ba6f19bf2e 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1611,6 +1611,9 @@ class RowLevelSecurityFilter(Model, AuditMixinNullable): backref="row_level_security_filters", ) tables = relationship( - SqlaTable, secondary=RLSFilterTables, backref="row_level_security_filters" + SqlaTable, + overlaps="table", + secondary=RLSFilterTables, + backref="row_level_security_filters", ) clause = Column(Text, nullable=False) diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py index 3adffd122dbc1..a23e25a1ab1d0 100644 --- a/superset/models/dashboard.py +++ b/superset/models/dashboard.py @@ -149,6 +149,7 @@ class Dashboard(Model, AuditMixinNullable, ImportExportMixin): owners = relationship(security_manager.user_model, secondary=dashboard_user) tags = relationship( "Tag", + overlaps="objects,tag,tags,tags", secondary="tagged_object", primaryjoin="and_(Dashboard.id == TaggedObject.object_id)", secondaryjoin="and_(TaggedObject.tag_id == Tag.id, " diff --git a/superset/models/slice.py b/superset/models/slice.py index eb48cc148a5a5..fc8174878ac35 100644 --- a/superset/models/slice.py +++ b/superset/models/slice.py @@ -99,6 +99,7 @@ class Slice( # pylint: disable=too-many-public-methods tags = relationship( "Tag", secondary="tagged_object", + overlaps="objects,tag,tags", primaryjoin="and_(Slice.id == TaggedObject.object_id)", secondaryjoin="and_(TaggedObject.tag_id == Tag.id, " "TaggedObject.object_type == 'chart')", @@ -106,6 +107,7 @@ class Slice( # pylint: disable=too-many-public-methods table = relationship( "SqlaTable", foreign_keys=[datasource_id], + overlaps="table", primaryjoin="and_(Slice.datasource_id == SqlaTable.id, " "Slice.datasource_type == 'table')", remote_side="SqlaTable.id", diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index aeb4ba39dfd67..fbadaaa2f488a 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -383,6 +383,7 @@ class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportExportMixin): tags = relationship( "Tag", secondary="tagged_object", + overlaps="tags", primaryjoin="and_(SavedQuery.id == TaggedObject.object_id)", secondaryjoin="and_(TaggedObject.tag_id == Tag.id, " "TaggedObject.object_type == 'query')", diff --git a/superset/tags/models.py b/superset/tags/models.py index bb845303ffd20..d7feb4f48c4b1 100644 --- a/superset/tags/models.py +++ b/superset/tags/models.py @@ -77,6 +77,10 @@ class Tag(Model, AuditMixinNullable): name = Column(String(250), unique=True) type = Column(Enum(TagTypes)) + objects = relationship( + "TaggedObject", back_populates="tag", overlaps="objects,tags" + ) + class TaggedObject(Model, AuditMixinNullable): @@ -93,7 +97,7 @@ class TaggedObject(Model, AuditMixinNullable): ) object_type = Column(Enum(ObjectTypes)) - tag = relationship("Tag", backref="objects") + tag = relationship("Tag", back_populates="objects", overlaps="tags") def get_tag(name: str, session: Session, type_: TagTypes) -> Tag: