This is an automated email from the ASF dual-hosted git repository.
villebro 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 103fedaf92 fix: use role_model from security manager (#32873)
103fedaf92 is described below
commit 103fedaf922292567d7082f3febe24d46b1516d3
Author: Luke Hart <[email protected]>
AuthorDate: Fri Mar 28 06:01:14 2025 +1300
fix: use role_model from security manager (#32873)
---
superset/security/manager.py | 4 +-
tests/unit_tests/commands/dashboard/__init__.py | 16 ++++
tests/unit_tests/commands/dashboard/create_test.py | 98 ++++++++++++++++++++++
3 files changed, 117 insertions(+), 1 deletion(-)
diff --git a/superset/security/manager.py b/superset/security/manager.py
index 80a1fb957d..d11e0f3e41 100644
--- a/superset/security/manager.py
+++ b/superset/security/manager.py
@@ -1126,7 +1126,9 @@ class SupersetSecurityManager( # pylint:
disable=too-many-public-methods
"""
Find a List of models by a list of ids, if defined applies
`base_filter`
"""
- query = self.get_session.query(Role).filter(Role.id.in_(role_ids))
+ query = self.get_session.query(self.role_model).filter(
+ self.role_model.id.in_(role_ids)
+ )
return query.all()
def copy_role(
diff --git a/tests/unit_tests/commands/dashboard/__init__.py
b/tests/unit_tests/commands/dashboard/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/unit_tests/commands/dashboard/__init__.py
@@ -0,0 +1,16 @@
+# 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.
diff --git a/tests/unit_tests/commands/dashboard/create_test.py
b/tests/unit_tests/commands/dashboard/create_test.py
new file mode 100644
index 0000000000..9bb0cff9ab
--- /dev/null
+++ b/tests/unit_tests/commands/dashboard/create_test.py
@@ -0,0 +1,98 @@
+# 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.
+from __future__ import annotations
+
+import pytest
+from flask_appbuilder.security.sqla.models import Role, User
+from pytest_mock import MockerFixture
+
+from superset.commands.dashboard.create import CreateDashboardCommand
+from superset.extensions import security_manager
+from tests.unit_tests.fixtures.common import admin_user, after_each # noqa:
F401
+
+
+def test_validate_custom_role_class(
+ mocker: MockerFixture,
+ monkeypatch: pytest.MonkeyPatch,
+ admin_user: User, # noqa: F811
+ after_each: None, # noqa: F811
+) -> None:
+ class CustomRoleModel(Role):
+ __tablename__ = "ab_role"
+
+ monkeypatch.setattr(security_manager, "role_model", CustomRoleModel)
+ mocker.patch.object(security_manager, "is_admin", return_value=True)
+
+ owner_ids = [admin_user.id]
+ role_ids = [role.id for role in admin_user.roles]
+
+ command = CreateDashboardCommand(data={"owners": owner_ids, "roles":
role_ids})
+ command.validate()
+
+ for role in command._properties["roles"]:
+ assert isinstance(role, CustomRoleModel)
+
+
+def test_validate_custom_user_class(
+ mocker: MockerFixture,
+ monkeypatch: pytest.MonkeyPatch,
+ admin_user: User, # noqa: F811
+ after_each: None, # noqa: F811
+) -> None:
+ class CustomUserModel(User):
+ __tablename__ = "ab_user"
+
+ monkeypatch.setattr(security_manager, "user_model", CustomUserModel)
+ mocker.patch.object(security_manager, "is_admin", return_value=True)
+
+ owner_ids = [admin_user.id]
+ role_ids = [role.id for role in admin_user.roles]
+
+ command = CreateDashboardCommand(data={"owners": owner_ids, "roles":
role_ids})
+ command.validate()
+
+ for owner in command._properties["owners"]:
+ assert isinstance(owner, CustomUserModel)
+
+
+def test_validate_custom_role_and_user_class(
+ mocker: MockerFixture,
+ monkeypatch: pytest.MonkeyPatch,
+ admin_user: User, # noqa: F811
+ after_each: None, # noqa: F811
+) -> None:
+ class CustomRoleModel(Role):
+ __tablename__ = "ab_role"
+
+ class CustomUserModel(User):
+ __tablename__ = "ab_user"
+
+ monkeypatch.setattr(security_manager, "role_model", CustomRoleModel)
+ monkeypatch.setattr(security_manager, "user_model", CustomUserModel)
+ mocker.patch.object(security_manager, "is_admin", return_value=True)
+
+ owner_ids = [admin_user.id]
+ role_ids = [role.id for role in admin_user.roles]
+
+ command = CreateDashboardCommand(data={"owners": owner_ids, "roles":
role_ids})
+ command.validate()
+
+ for role in command._properties["roles"]:
+ assert isinstance(role, CustomRoleModel)
+
+ for owner in command._properties["owners"]:
+ assert isinstance(owner, CustomUserModel)