mirror of
https://github.com/apache/superset.git
synced 2026-04-19 16:14:52 +00:00
[dashboards] New, API for Bulk delete (#8972)
* [dashboards] New, API for Bulk delete * [dashboards] Tests * [dashboards] Fix not found on multiple delete * [dashboards] Bulk delete partial deletes on not owned dashes * [dashboards] Improve OpenAPI spec and tests * [dashboards] Test for bad request * [dashboards] i18n * [dashboards] black * [dashboard] make bulk all or nothing * [dashboard] Log on sqlalchemy error * [dashboard] Log on sqlalchemy error
This commit is contained in:
committed by
Maxime Beauchemin
parent
74158694c5
commit
d02cf2f509
@@ -78,6 +78,44 @@ class DashboardApiTests(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
model = db.session.query(models.Dashboard).get(dashboard_id)
|
||||
self.assertEqual(model, None)
|
||||
|
||||
def test_delete_bulk_dashboards(self):
|
||||
"""
|
||||
Dashboard API: Test delete bulk
|
||||
"""
|
||||
admin_id = self.get_user("admin").id
|
||||
dashboard_count = 4
|
||||
dashboard_ids = list()
|
||||
for dashboard_name_index in range(dashboard_count):
|
||||
dashboard_ids.append(
|
||||
self.insert_dashboard(
|
||||
f"title{dashboard_name_index}",
|
||||
f"slug{dashboard_name_index}",
|
||||
[admin_id],
|
||||
).id
|
||||
)
|
||||
self.login(username="admin")
|
||||
argument = dashboard_ids
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(argument)}"
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 200)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
expected_response = {"message": f"Deleted {dashboard_count} dashboards"}
|
||||
self.assertEqual(response, expected_response)
|
||||
for dashboard_id in dashboard_ids:
|
||||
model = db.session.query(models.Dashboard).get(dashboard_id)
|
||||
self.assertEqual(model, None)
|
||||
|
||||
def test_delete_bulk_dashboards_bad_request(self):
|
||||
"""
|
||||
Dashboard API: Test delete bulk bad request
|
||||
"""
|
||||
dashboard_ids = [1, "a"]
|
||||
self.login(username="admin")
|
||||
argument = dashboard_ids
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(argument)}"
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 400)
|
||||
|
||||
def test_delete_not_found_dashboard(self):
|
||||
"""
|
||||
Dashboard API: Test not found delete
|
||||
@@ -88,6 +126,17 @@ class DashboardApiTests(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 404)
|
||||
|
||||
def test_delete_bulk_dashboards_not_found(self):
|
||||
"""
|
||||
Dashboard API: Test delete bulk not found
|
||||
"""
|
||||
dashboard_ids = [1001, 1002]
|
||||
self.login(username="admin")
|
||||
argument = dashboard_ids
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(argument)}"
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 404)
|
||||
|
||||
def test_delete_dashboard_admin_not_owned(self):
|
||||
"""
|
||||
Dashboard API: Test admin delete not owned
|
||||
@@ -102,6 +151,35 @@ class DashboardApiTests(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
model = db.session.query(models.Dashboard).get(dashboard_id)
|
||||
self.assertEqual(model, None)
|
||||
|
||||
def test_delete_bulk_dashboard_admin_not_owned(self):
|
||||
"""
|
||||
Dashboard API: Test admin delete bulk not owned
|
||||
"""
|
||||
gamma_id = self.get_user("gamma").id
|
||||
dashboard_count = 4
|
||||
dashboard_ids = list()
|
||||
for dashboard_name_index in range(dashboard_count):
|
||||
dashboard_ids.append(
|
||||
self.insert_dashboard(
|
||||
f"title{dashboard_name_index}",
|
||||
f"slug{dashboard_name_index}",
|
||||
[gamma_id],
|
||||
).id
|
||||
)
|
||||
|
||||
self.login(username="admin")
|
||||
argument = dashboard_ids
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(argument)}"
|
||||
rv = self.client.delete(uri)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
self.assertEqual(rv.status_code, 200)
|
||||
expected_response = {"message": f"Deleted {dashboard_count} dashboards"}
|
||||
self.assertEqual(response, expected_response)
|
||||
|
||||
for dashboard_id in dashboard_ids:
|
||||
model = db.session.query(models.Dashboard).get(dashboard_id)
|
||||
self.assertEqual(model, None)
|
||||
|
||||
def test_delete_dashboard_not_owned(self):
|
||||
"""
|
||||
Dashboard API: Test delete try not owned
|
||||
@@ -127,6 +205,68 @@ class DashboardApiTests(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
db.session.delete(user_alpha2)
|
||||
db.session.commit()
|
||||
|
||||
def test_delete_bulk_dashboard_not_owned(self):
|
||||
"""
|
||||
Dashboard API: Test delete bulk try not owned
|
||||
"""
|
||||
user_alpha1 = self.create_user(
|
||||
"alpha1", "password", "Alpha", email="alpha1@superset.org"
|
||||
)
|
||||
user_alpha2 = self.create_user(
|
||||
"alpha2", "password", "Alpha", email="alpha2@superset.org"
|
||||
)
|
||||
existing_slice = (
|
||||
db.session.query(Slice).filter_by(slice_name="Girl Name Cloud").first()
|
||||
)
|
||||
|
||||
dashboard_count = 4
|
||||
dashboards = list()
|
||||
for dashboard_name_index in range(dashboard_count):
|
||||
dashboards.append(
|
||||
self.insert_dashboard(
|
||||
f"title{dashboard_name_index}",
|
||||
f"slug{dashboard_name_index}",
|
||||
[user_alpha1.id],
|
||||
slices=[existing_slice],
|
||||
published=True,
|
||||
)
|
||||
)
|
||||
|
||||
owned_dashboard = self.insert_dashboard(
|
||||
"title_owned",
|
||||
"slug_owned",
|
||||
[user_alpha2.id],
|
||||
slices=[existing_slice],
|
||||
published=True,
|
||||
)
|
||||
|
||||
self.login(username="alpha2", password="password")
|
||||
|
||||
# verify we can't delete not owned dashboards
|
||||
arguments = [dashboard.id for dashboard in dashboards]
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(arguments)}"
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 403)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
expected_response = {"message": "No dashboards deleted"}
|
||||
self.assertEqual(response, expected_response)
|
||||
|
||||
# nothing is delete in bulk with a list of owned and not owned dashboards
|
||||
arguments = [dashboard.id for dashboard in dashboards] + [owned_dashboard.id]
|
||||
uri = f"api/v1/dashboard/?q={prison.dumps(arguments)}"
|
||||
rv = self.client.delete(uri)
|
||||
self.assertEqual(rv.status_code, 403)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
expected_response = {"message": "No dashboards deleted"}
|
||||
self.assertEqual(response, expected_response)
|
||||
|
||||
for dashboard in dashboards:
|
||||
db.session.delete(dashboard)
|
||||
db.session.delete(owned_dashboard)
|
||||
db.session.delete(user_alpha1)
|
||||
db.session.delete(user_alpha2)
|
||||
db.session.commit()
|
||||
|
||||
def test_create_dashboard(self):
|
||||
"""
|
||||
Dashboard API: Test create dashboard
|
||||
|
||||
Reference in New Issue
Block a user