This is an automated email from the ASF dual-hosted git repository. villebro pushed a commit to branch 0.37 in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 003161ebe57ad03aab454c8a115a514c7068d34b Author: Daniel Vaz Gaspar <danielvazgas...@gmail.com> AuthorDate: Thu Aug 13 10:18:13 2020 +0100 fix: dataset delete and perm delete (#10578) --- superset/datasets/commands/delete.py | 23 ++++++++++++++++++++--- tests/datasets/api_tests.py | 7 +++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/superset/datasets/commands/delete.py b/superset/datasets/commands/delete.py index 551d222..236fadd 100644 --- a/superset/datasets/commands/delete.py +++ b/superset/datasets/commands/delete.py @@ -46,10 +46,27 @@ class DeleteDatasetCommand(BaseCommand): def run(self) -> Model: self.validate() try: - dataset = DatasetDAO.delete(self._model, commit=False) - security_manager.del_permission_view_menu( - "datasource_access", dataset.get_perm() + view_menu = ( + security_manager.find_view_menu(self._model.get_perm()) + if self._model + else None + ) + if not view_menu: + logger.error( + "Could not find the data access permission for the dataset" + ) + raise DatasetDeleteFailedError() + permission_views = ( + db.session.query(security_manager.permissionview_model) + .filter_by(view_menu=view_menu) + .all() ) + dataset = DatasetDAO.delete(self._model, commit=False) + + for permission_view in permission_views: + db.session.delete(permission_view) + if view_menu: + db.session.delete(view_menu) db.session.commit() except (SQLAlchemyError, DAODeleteFailedError) as ex: logger.exception(ex) diff --git a/tests/datasets/api_tests.py b/tests/datasets/api_tests.py index bd634ea..d230b2b 100644 --- a/tests/datasets/api_tests.py +++ b/tests/datasets/api_tests.py @@ -602,10 +602,17 @@ class TestDatasetApi(SupersetTestCase): Dataset API: Test delete dataset item """ dataset = self.insert_default_dataset() + view_menu = security_manager.find_view_menu(dataset.get_perm()) + self.assertIsNotNone(view_menu) + view_menu_id = view_menu.id self.login(username="admin") uri = f"api/v1/dataset/{dataset.id}" rv = self.client.delete(uri) self.assertEqual(rv.status_code, 200) + non_view_menu = db.session.query(security_manager.viewmenu_model).get( + view_menu_id + ) + self.assertIsNone(non_view_menu) def test_delete_item_dataset_not_owned(self): """