fix(dashboard): Stop updating chart owners for charts removed from dashboard (#21720)

Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com>
This commit is contained in:
Cody Leff 2023-02-09 09:50:06 -08:00 committed by GitHub
parent 5e64211bdb
commit 684b8888b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 1 deletions

View File

@ -50,13 +50,13 @@ class UpdateDashboardCommand(UpdateMixin, BaseCommand):
self.validate()
try:
dashboard = DashboardDAO.update(self._model, self._properties, commit=False)
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=False)
if self._properties.get("json_metadata"):
dashboard = DashboardDAO.set_dash_metadata(
dashboard,
data=json.loads(self._properties.get("json_metadata", "{}")),
commit=False,
)
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=False)
db.session.commit()
except DAOUpdateFailedError as ex:
logger.exception(ex.exception)

View File

@ -1347,6 +1347,65 @@ class TestDashboardApi(SupersetTestCase, ApiOwnersTestCaseMixin, InsertChartMixi
db.session.delete(user_alpha2)
db.session.commit()
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
def test_update_dashboard_chart_owners_propagation(self):
"""
Dashboard API: Test update chart owners propagation
"""
user_alpha1 = self.create_user(
"alpha1",
"password",
"Alpha",
email="alpha1@superset.org",
first_name="alpha1",
)
admin = self.get_user("admin")
slices = []
slices.append(db.session.query(Slice).filter_by(slice_name="Trends").one())
slices.append(db.session.query(Slice).filter_by(slice_name="Boys").one())
# Insert dashboard with admin as owner
dashboard = self.insert_dashboard(
"title1",
"slug1",
[admin.id],
slices=slices,
)
# Updates dashboard without Boys in json_metadata positions
# and user_alpha1 as owner
dashboard_data = {
"owners": [user_alpha1.id],
"json_metadata": json.dumps(
{
"positions": {
f"{slices[0].id}": {
"type": "CHART",
"meta": {"chartId": slices[0].id},
},
}
}
),
}
self.login(username="admin")
uri = f"api/v1/dashboard/{dashboard.id}"
rv = self.client.put(uri, json=dashboard_data)
self.assertEqual(rv.status_code, 200)
# Check that chart named Boys does not contain alpha 1 in its owners
boys = db.session.query(Slice).filter_by(slice_name="Boys").one()
self.assertNotIn(user_alpha1, boys.owners)
# Revert owners on slice
for slice in slices:
slice.owners = []
db.session.commit()
# Rollback changes
db.session.delete(dashboard)
db.session.delete(user_alpha1)
db.session.commit()
def test_update_partial_dashboard(self):
"""
Dashboard API: Test update partial