From 58a53e3470d82141c6abee7e22f805260336a50c Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 17 Feb 2019 10:30:23 +0200 Subject: [PATCH] Fix: remove widgets when deleting a visualization. (#3423) Closes #3257. --- redash/models/__init__.py | 2 +- tests/handlers/test_visualizations.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/redash/models/__init__.py b/redash/models/__init__.py index 69af5fcf44..032b0782a2 100644 --- a/redash/models/__init__.py +++ b/redash/models/__init__.py @@ -922,7 +922,7 @@ def copy(self): class Widget(TimestampMixin, BelongsToOrgMixin, db.Model): id = Column(db.Integer, primary_key=True) visualization_id = Column(db.Integer, db.ForeignKey('visualizations.id'), nullable=True) - visualization = db.relationship(Visualization, backref='widgets') + visualization = db.relationship(Visualization, backref=backref('widgets', cascade='delete')) text = Column(db.Text, nullable=True) width = Column(db.Integer) options = Column(db.Text) diff --git a/tests/handlers/test_visualizations.py b/tests/handlers/test_visualizations.py index cc266c7422..e508806dca 100644 --- a/tests/handlers/test_visualizations.py +++ b/tests/handlers/test_visualizations.py @@ -128,3 +128,11 @@ def test_only_owner_collaborator_or_admin_can_delete_visualization(self): rv = self.make_request('delete', path, user=admin_from_diff_org) self.assertEquals(rv.status_code, 404) + + def test_deleting_a_visualization_deletes_dashboard_widgets(self): + vis = self.factory.create_visualization() + widget = self.factory.create_widget(visualization=vis) + + rv = self.make_request('delete', '/api/visualizations/{}'.format(vis.id)) + + self.assertIsNone(models.Widget.query.filter(models.Widget.id == widget.id).first())