Skip to content

Commit

Permalink
[dashboards] Fix, update dashboard owners not propagating to charts o… (
Browse files Browse the repository at this point in the history
#9484)

* [dashboards] Fix, update dashboard owners not propagating to charts owners

* Add tests

* Fix tests

* better naming
  • Loading branch information
dpgaspar authored Apr 9, 2020
1 parent ecfc1f1 commit bb80cea
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 2 deletions.
3 changes: 2 additions & 1 deletion superset/dashboards/commands/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ def __init__(self, user: User, data: Dict):
def run(self) -> Model:
self.validate()
try:
dashboard = DashboardDAO.create(self._properties)
dashboard = DashboardDAO.create(self._properties, commit=False)
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=True)
except DAOCreateFailedError as ex:
logger.exception(ex.exception)
raise DashboardCreateFailedError()
Expand Down
3 changes: 2 additions & 1 deletion superset/dashboards/commands/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ def __init__(self, user: User, model_id: int, data: Dict):
def run(self) -> Model:
self.validate()
try:
dashboard = DashboardDAO.update(self._model, self._properties)
dashboard = DashboardDAO.update(self._model, self._properties, commit=False)
dashboard = DashboardDAO.update_charts_owners(dashboard, commit=True)
except DAOUpdateFailedError as ex:
logger.exception(ex.exception)
raise DashboardUpdateFailedError()
Expand Down
9 changes: 9 additions & 0 deletions superset/dashboards/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@ def validate_update_slug_uniqueness(dashboard_id: int, slug: Optional[str]) -> b
return not db.session.query(dashboard_query.exists()).scalar()
return True

@staticmethod
def update_charts_owners(model: Dashboard, commit: bool = True) -> Dashboard:
owners = [owner for owner in model.owners]
for slc in model.slices:
slc.owners = list(set(owners) | set(slc.owners))
if commit:
db.session.commit()
return model

@staticmethod
def bulk_delete(models: Optional[List[Dashboard]], commit: bool = True) -> None:
item_ids = [model.id for model in models] if models else []
Expand Down
43 changes: 43 additions & 0 deletions tests/dashboards/api_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,49 @@ def test_update_dashboard(self):
db.session.delete(model)
db.session.commit()

def test_update_dashboard_chart_owners(self):
"""
Dashboard API: Test update chart owners
"""
user_alpha1 = self.create_user(
"alpha1", "password", "Alpha", email="[email protected]"
)
user_alpha2 = self.create_user(
"alpha2", "password", "Alpha", email="[email protected]"
)
admin = self.get_user("admin")
slices = []
slices.append(
db.session.query(Slice).filter_by(slice_name="Girl Name Cloud").first()
)
slices.append(db.session.query(Slice).filter_by(slice_name="Trends").first())
slices.append(db.session.query(Slice).filter_by(slice_name="Boys").first())

dashboard = self.insert_dashboard("title1", "slug1", [admin.id], slices=slices,)
self.login(username="admin")
uri = f"api/v1/dashboard/{dashboard.id}"
dashboard_data = {"owners": [user_alpha1.id, user_alpha2.id]}
rv = self.client.put(uri, json=dashboard_data)
self.assertEqual(rv.status_code, 200)

# verify slices owners include alpha1 and alpha2 users
slices_ids = [slice.id for slice in slices]
# Refetch Slices
slices = db.session.query(Slice).filter(Slice.id.in_(slices_ids)).all()
for slice in slices:
self.assertIn(user_alpha1, slice.owners)
self.assertIn(user_alpha2, slice.owners)
self.assertIn(admin, slice.owners)
# Revert owners on slice
slice.owners = []
db.session.commit()

# Rollback changes
db.session.delete(dashboard)
db.session.delete(user_alpha1)
db.session.delete(user_alpha2)
db.session.commit()

def test_update_partial_dashboard(self):
"""
Dashboard API: Test update partial
Expand Down

0 comments on commit bb80cea

Please sign in to comment.