Skip to content
This repository was archived by the owner on Nov 3, 2023. It is now read-only.

Commit bb80cea

Browse files
authored
[dashboards] Fix, update dashboard owners not propagating to charts o… (apache#9484)
* [dashboards] Fix, update dashboard owners not propagating to charts owners * Add tests * Fix tests * better naming
1 parent ecfc1f1 commit bb80cea

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

superset/dashboards/commands/create.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def __init__(self, user: User, data: Dict):
4242
def run(self) -> Model:
4343
self.validate()
4444
try:
45-
dashboard = DashboardDAO.create(self._properties)
45+
dashboard = DashboardDAO.create(self._properties, commit=False)
46+
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=True)
4647
except DAOCreateFailedError as ex:
4748
logger.exception(ex.exception)
4849
raise DashboardCreateFailedError()

superset/dashboards/commands/update.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ def __init__(self, user: User, model_id: int, data: Dict):
4949
def run(self) -> Model:
5050
self.validate()
5151
try:
52-
dashboard = DashboardDAO.update(self._model, self._properties)
52+
dashboard = DashboardDAO.update(self._model, self._properties, commit=False)
53+
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=True)
5354
except DAOUpdateFailedError as ex:
5455
logger.exception(ex.exception)
5556
raise DashboardUpdateFailedError()

superset/dashboards/dao.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ def validate_update_slug_uniqueness(dashboard_id: int, slug: Optional[str]) -> b
4747
return not db.session.query(dashboard_query.exists()).scalar()
4848
return True
4949

50+
@staticmethod
51+
def update_charts_owners(model: Dashboard, commit: bool = True) -> Dashboard:
52+
owners = [owner for owner in model.owners]
53+
for slc in model.slices:
54+
slc.owners = list(set(owners) | set(slc.owners))
55+
if commit:
56+
db.session.commit()
57+
return model
58+
5059
@staticmethod
5160
def bulk_delete(models: Optional[List[Dashboard]], commit: bool = True) -> None:
5261
item_ids = [model.id for model in models] if models else []

tests/dashboards/api_tests.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,49 @@ def test_update_dashboard(self):
567567
db.session.delete(model)
568568
db.session.commit()
569569

570+
def test_update_dashboard_chart_owners(self):
571+
"""
572+
Dashboard API: Test update chart owners
573+
"""
574+
user_alpha1 = self.create_user(
575+
"alpha1", "password", "Alpha", email="[email protected]"
576+
)
577+
user_alpha2 = self.create_user(
578+
"alpha2", "password", "Alpha", email="[email protected]"
579+
)
580+
admin = self.get_user("admin")
581+
slices = []
582+
slices.append(
583+
db.session.query(Slice).filter_by(slice_name="Girl Name Cloud").first()
584+
)
585+
slices.append(db.session.query(Slice).filter_by(slice_name="Trends").first())
586+
slices.append(db.session.query(Slice).filter_by(slice_name="Boys").first())
587+
588+
dashboard = self.insert_dashboard("title1", "slug1", [admin.id], slices=slices,)
589+
self.login(username="admin")
590+
uri = f"api/v1/dashboard/{dashboard.id}"
591+
dashboard_data = {"owners": [user_alpha1.id, user_alpha2.id]}
592+
rv = self.client.put(uri, json=dashboard_data)
593+
self.assertEqual(rv.status_code, 200)
594+
595+
# verify slices owners include alpha1 and alpha2 users
596+
slices_ids = [slice.id for slice in slices]
597+
# Refetch Slices
598+
slices = db.session.query(Slice).filter(Slice.id.in_(slices_ids)).all()
599+
for slice in slices:
600+
self.assertIn(user_alpha1, slice.owners)
601+
self.assertIn(user_alpha2, slice.owners)
602+
self.assertIn(admin, slice.owners)
603+
# Revert owners on slice
604+
slice.owners = []
605+
db.session.commit()
606+
607+
# Rollback changes
608+
db.session.delete(dashboard)
609+
db.session.delete(user_alpha1)
610+
db.session.delete(user_alpha2)
611+
db.session.commit()
612+
570613
def test_update_partial_dashboard(self):
571614
"""
572615
Dashboard API: Test update partial

0 commit comments

Comments
 (0)