Skip to content

Commit

Permalink
Fix: data source delete was broken
Browse files Browse the repository at this point in the history
  • Loading branch information
arikfr committed Dec 27, 2016
1 parent b3d0f70 commit f5e8fc8
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 8 deletions.
3 changes: 2 additions & 1 deletion redash/handlers/data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ def post(self, data_source_id):
@require_admin
def delete(self, data_source_id):
data_source = models.DataSource.get_by_id_and_org(data_source_id, self.current_org)
data_source.delete_instance(recursive=True)
models.db.session.delete(data_source)
models.db.session.commit()

return make_response('', 204)

Expand Down
6 changes: 3 additions & 3 deletions redash/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from sqlalchemy.inspection import inspect
from sqlalchemy.types import TypeDecorator
from sqlalchemy.ext.mutable import Mutable
from sqlalchemy.orm import object_session
from sqlalchemy.orm import object_session, backref
# noinspection PyUnresolvedReferences
from sqlalchemy.orm.exc import NoResultFound

Expand Down Expand Up @@ -549,7 +549,7 @@ class QueryResult(db.Model, BelongsToOrgMixin):
org_id = Column(db.Integer, db.ForeignKey('organizations.id'))
org = db.relationship(Organization)
data_source_id = Column(db.Integer, db.ForeignKey("data_sources.id"))
data_source = db.relationship(DataSource)
data_source = db.relationship(DataSource, backref=backref('query_results', cascade="all, delete-orphan"))
query_hash = Column(db.String(32), index=True)
query_text = Column('query', db.Text)
data = Column(db.Text)
Expand Down Expand Up @@ -657,7 +657,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model):
org_id = Column(db.Integer, db.ForeignKey('organizations.id'))
org = db.relationship(Organization, backref="queries")
data_source_id = Column(db.Integer, db.ForeignKey("data_sources.id"), nullable=True)
data_source = db.relationship(DataSource)
data_source = db.relationship(DataSource, backref='queries')
latest_query_data_id = Column(db.Integer, db.ForeignKey("query_results.id"), nullable=True)
latest_query_data = db.relationship(QueryResult)
name = Column(db.String(255))
Expand Down
41 changes: 37 additions & 4 deletions tests/handlers/test_data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from funcy import pairwise

from tests import BaseTestCase
from redash.models import DataSource
from redash.models import DataSource, Query


class TestDataSourceGetSchema(BaseTestCase):
Expand Down Expand Up @@ -45,9 +45,9 @@ def test_returns_403_for_non_admin(self):
self.assertEqual(rv.status_code, 403)


class TestDataSourceAPIPost(BaseTestCase):
class TestDataSourceResourcePost(BaseTestCase):
def setUp(self):
super(TestDataSourceAPIPost, self).setUp()
super(TestDataSourceResourcePost, self).setUp()
self.path = "/api/data_sources/{}".format(self.factory.data_source.id)

def test_returns_400_when_configuration_invalid(self):
Expand All @@ -72,7 +72,40 @@ def test_updates_data_source(self):
self.assertEqual(data_source.options.to_dict(), new_options)


class TestDataSourceListAPIPost(BaseTestCase):
class TestDataSourceResourceDelete(BaseTestCase):
def test_deletes_the_data_source(self):
data_source = self.factory.create_data_source()
admin = self.factory.create_admin()

rv = self.make_request('delete', '/api/data_sources/{}'.format(data_source.id), user=admin)

self.assertEqual(204, rv.status_code)
self.assertIsNone(DataSource.query.get(data_source.id))

def test_sets_queries_data_source_to_null(self):
data_source = self.factory.create_data_source()
admin = self.factory.create_admin()
query = self.factory.create_query(data_source=data_source)

rv = self.make_request('delete', '/api/data_sources/{}'.format(data_source.id), user=admin)

self.assertEqual(204, rv.status_code)
self.assertIsNone(DataSource.query.get(data_source.id))

self.assertIsNone(Query.query.get(query.id).data_source_id)

def test_deletes_child_models(self):
data_source = self.factory.create_data_source()
admin = self.factory.create_admin()
query_result = self.factory.create_query_result(data_source=data_source)

rv = self.make_request('delete', '/api/data_sources/{}'.format(data_source.id), user=admin)

self.assertEqual(204, rv.status_code)
self.assertIsNone(DataSource.query.get(data_source.id))


class TestDataSourceListResourcePost(BaseTestCase):
def test_returns_400_when_missing_fields(self):
admin = self.factory.create_admin()
rv = self.make_request('post', "/api/data_sources", user=admin)
Expand Down

0 comments on commit f5e8fc8

Please sign in to comment.