From d36226b443f30cad4b70f6b8a881cb0066945b6b Mon Sep 17 00:00:00 2001 From: Martin Burchell Date: Mon, 13 Jun 2016 17:48:44 +0100 Subject: [PATCH] Purge dataset relationships --- ckan/logic/action/delete.py | 7 +++++++ ckan/tests/logic/action/test_delete.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/ckan/logic/action/delete.py b/ckan/logic/action/delete.py index 87f9050a4d1..fe4300a2ef7 100644 --- a/ckan/logic/action/delete.py +++ b/ckan/logic/action/delete.py @@ -117,6 +117,8 @@ def dataset_purge(context, data_dict): :type id: string ''' + from sqlalchemy import or_ + model = context['model'] id = _get_or_bust(data_dict, 'id') @@ -134,6 +136,11 @@ def dataset_purge(context, data_dict): for m in members.all(): m.purge() + for r in model.Session.query(model.PackageRelationship).filter( + or_(model.PackageRelationship.subject_package_id == pkg.id, + model.PackageRelationship.object_package_id == pkg.id)).all(): + r.purge() + pkg = model.Package.get(id) # no new_revision() needed since there are no object_revisions created # during purge diff --git a/ckan/tests/logic/action/test_delete.py b/ckan/tests/logic/action/test_delete.py index 94b750a8ff2..ad9eba3ab90 100644 --- a/ckan/tests/logic/action/test_delete.py +++ b/ckan/tests/logic/action/test_delete.py @@ -451,6 +451,30 @@ def test_purged_dataset_leaves_no_trace_in_the_model(self): # No Revision objects were purged or created assert_equals(num_revisions_after - num_revisions_before, 0) + def test_purged_dataset_removed_from_relationships(self): + child = factories.Dataset() + parent = factories.Dataset() + grandparent = factories.Dataset() + + helpers.call_action('package_relationship_create', + subject=child['id'], + type='child_of', + object=parent['id']) + + helpers.call_action('package_relationship_create', + subject=parent['id'], + type='child_of', + object=grandparent['id']) + + assert_equals(len( + model.Session.query(model.PackageRelationship).all()), 2) + + helpers.call_action('dataset_purge', + context={'ignore_auth': True}, + id=parent['name']) + + assert_equals(model.Session.query(model.PackageRelationship).all(), []) + def test_missing_id_returns_error(self): assert_raises(logic.ValidationError, helpers.call_action, 'dataset_purge')