From c544c6f24b2f9157f9bd0fcc4564dcd946882580 Mon Sep 17 00:00:00 2001 From: David Read Date: Fri, 12 Jul 2019 21:28:44 +0100 Subject: [PATCH] Trash page uses action We add in a call to 'dataset_purge' action to do the purge of the dataset, when previously this done as part of the model.repo.purge_revision() call, but will be deleted soon anyway with the remove-vdm branch. --- ckan/tests/controllers/test_admin.py | 31 ++++++++++++++++++++++++++++ ckan/views/admin.py | 8 +++++++ 2 files changed, 39 insertions(+) diff --git a/ckan/tests/controllers/test_admin.py b/ckan/tests/controllers/test_admin.py index ad292e315bc..f44458dbb1e 100644 --- a/ckan/tests/controllers/test_admin.py +++ b/ckan/tests/controllers/test_admin.py @@ -353,6 +353,37 @@ def test_trash_purge_deleted_datasets(self): pkgs_before_purge = model.Session.query(model.Package).count() assert_equal(pkgs_before_purge, 1) + def test_trash_purge_deleted_dataset_with_resources(self): + user = factories.Sysadmin() + dataset = factories.Dataset( + resources=[{'url': 'http://example.com/resource'}]) + helpers.call_action('package_delete', id=dataset['id']) + app = self._get_test_app() + + # how many datasets before purge + pkgs_before_purge = model.Session.query(model.Package).count() + resources_before_purge = model.Session.query(model.Resource).count() + assert_equal(pkgs_before_purge, 1) + assert_equal(resources_before_purge, 1) + + env = {'REMOTE_USER': user['name'].encode('ascii')} + trash_url = url_for(controller='admin', action='trash') + trash_response = app.get(trash_url, extra_environ=env, status=200) + + # submit the purge form + purge_form = trash_response.forms['form-purge-packages'] + purge_response = webtest_submit(purge_form, 'purge-packages', + status=302, extra_environ=env) + purge_response = purge_response.follow(extra_environ=env) + # redirected back to trash page + assert_true('Purge complete' in purge_response) + + # how many datasets after purge + pkgs_after_purge = model.Session.query(model.Package).count() + resources_after_purge = model.Session.query(model.Resource).count() + assert_equal(pkgs_after_purge, 0) + assert_equal(resources_after_purge, 0) + class TestAdminConfigUpdate(helpers.FunctionalTestBase): diff --git a/ckan/views/admin.py b/ckan/views/admin.py index defd3850f17..1edda8ce108 100644 --- a/ckan/views/admin.py +++ b/ckan/views/admin.py @@ -149,6 +149,7 @@ def get(self): return base.render(u'admin/trash.html', extra_vars=data) def post(self): + deleted_revisions = model.Session.query( model.Revision).filter_by(state=model.State.DELETED) # NB: we repeat retrieval of of revisions @@ -160,6 +161,13 @@ def post(self): if (u'purge-packages' in request.form) or ( u'purge-revisions' in request.form): if u'purge-packages' in request.form: + # Delete the packages first + for pkg in self.deleted_packages: + logic.get_action(u'dataset_purge')( + {u'user': g.user}, {u'id': pkg.id}) + model.Session.remove() + + # Delete associated revisions revs_to_purge = [] for pkg in self.deleted_packages: revisions = [x[0] for x in pkg.all_related_revisions]