diff --git a/superset/datasets/commands/delete.py b/superset/datasets/commands/delete.py index 551d222dfbc..236fadd0055 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/superset/tasks/slack_util.py b/superset/tasks/slack_util.py index 64e992390da..865aa597824 100644 --- a/superset/tasks/slack_util.py +++ b/superset/tasks/slack_util.py @@ -26,7 +26,7 @@ from slack.web.slack_response import SlackResponse from superset import app # Globals -config = app.config +config = app.config # type: ignore logger = logging.getLogger("tasks.slack_util") diff --git a/tests/datasets/api_tests.py b/tests/datasets/api_tests.py index 68571c6a72f..a7795f962af 100644 --- a/tests/datasets/api_tests.py +++ b/tests/datasets/api_tests.py @@ -615,10 +615,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): """