From 69094fff3b7f2f582cfad7db8e541093c2426ae6 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Wed, 1 Feb 2017 14:14:12 +0200 Subject: [PATCH 1/3] Datastore deleted inside `after_delete` of IResourceController --- ckanext/datastore/plugin.py | 25 +++++++++++++++++++++++++ ckanext/datastore/tests/test_delete.py | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/ckanext/datastore/plugin.py b/ckanext/datastore/plugin.py index 073ffcee214..43db363c9b4 100644 --- a/ckanext/datastore/plugin.py +++ b/ckanext/datastore/plugin.py @@ -9,6 +9,7 @@ import ckan.plugins as p import ckan.logic as logic import ckan.model as model +from ckan.model.core import State from ckan.common import config import ckanext.datastore.logic.action as action import ckanext.datastore.logic.auth as auth @@ -251,6 +252,8 @@ def before_map(self, m): action='dump') return m + # IResourceController + def before_show(self, resource_dict): # Modify the resource url of datastore resources so that # they link to the datastore dumps. @@ -265,6 +268,28 @@ def before_show(self, resource_dict): return resource_dict + def after_delete(self, context, resources): + model = context['model'] + pkg = context['package'] + res_query = model.Session.query(model.Resource) + query = res_query.filter( + model.Resource.package_id == pkg.id, + model.Resource.state == State.DELETED + ) + deleted = [ + res for res in query.all() + if res.extras.get('datastore_active') is True] + + for res in deleted: + try: + logic.get_action('datastore_delete')( + context, {'resource_id': res.id, 'force': True}) + except logic.NotFound: + # resource was just deleted, so it's expected situation + res.extras['datastore_active'] = False + res_query.update( + {'extras': res.extras}, synchronize_session=False) + def datastore_validate(self, context, data_dict, fields_types): column_names = fields_types.keys() fields = data_dict.get('fields') diff --git a/ckanext/datastore/tests/test_delete.py b/ckanext/datastore/tests/test_delete.py index 53f9d487f06..7744790c299 100644 --- a/ckanext/datastore/tests/test_delete.py +++ b/ckanext/datastore/tests/test_delete.py @@ -11,10 +11,14 @@ import ckan.model as model import ckan.tests.legacy as tests from ckan.common import config +import ckan.tests.factories as factories +import ckan.tests.helpers as helpers +from ckan.logic import NotFound import ckanext.datastore.db as db from ckanext.datastore.tests.helpers import rebuild_all_dbs, set_url_type +assert_raises = nose.tools.assert_raises class TestDatastoreDelete(tests.WsgiAppCase): sysadmin_user = None @@ -99,6 +103,23 @@ def test_delete_basic(self): self.Session.remove() + def test_datastore_deleted_during_resource_deletion(self): + package = factories.Dataset() + data = { + 'resource': { + 'boo%k': 'crime', + 'author': ['tolstoy', 'dostoevsky'], + 'package_id': package['id'] + }, + } + result = helpers.call_action('datastore_create', **data) + resource_id = result['resource_id'] + helpers.call_action('resource_delete', id=resource_id) + + assert_raises( + NotFound, helpers.call_action, 'datastore_search', + resource_id=resource_id) + def test_delete_invalid_resource_id(self): postparams = '%s=1' % json.dumps({'resource_id': 'bad'}) auth = {'Authorization': str(self.sysadmin_user.apikey)} From 8202e191b6b5d16c3b13fd71a30e08f548e25852 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Wed, 1 Feb 2017 14:39:54 +0200 Subject: [PATCH 2/3] added blank line in tests --- ckanext/datastore/tests/test_delete.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ckanext/datastore/tests/test_delete.py b/ckanext/datastore/tests/test_delete.py index 7744790c299..f5c14fd4944 100644 --- a/ckanext/datastore/tests/test_delete.py +++ b/ckanext/datastore/tests/test_delete.py @@ -20,6 +20,7 @@ assert_raises = nose.tools.assert_raises + class TestDatastoreDelete(tests.WsgiAppCase): sysadmin_user = None normal_user = None From 88282291c50b675988e748e612a29ef167fdff8b Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Mon, 6 Feb 2017 14:19:41 +0200 Subject: [PATCH 3/3] Remove datastore directly --- ckanext/datastore/plugin.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ckanext/datastore/plugin.py b/ckanext/datastore/plugin.py index 43db363c9b4..e3dae30bb97 100644 --- a/ckanext/datastore/plugin.py +++ b/ckanext/datastore/plugin.py @@ -281,14 +281,13 @@ def after_delete(self, context, resources): if res.extras.get('datastore_active') is True] for res in deleted: - try: - logic.get_action('datastore_delete')( - context, {'resource_id': res.id, 'force': True}) - except logic.NotFound: - # resource was just deleted, so it's expected situation - res.extras['datastore_active'] = False - res_query.update( - {'extras': res.extras}, synchronize_session=False) + db.delete(context, { + 'resource_id': res.id, + 'connection_url': self.write_url + }) + res.extras['datastore_active'] = False + res_query.update( + {'extras': res.extras}, synchronize_session=False) def datastore_validate(self, context, data_dict, fields_types): column_names = fields_types.keys()