diff --git a/ckan/lib/cli.py b/ckan/lib/cli.py index fe976ed6420..3dedb12808e 100644 --- a/ckan/lib/cli.py +++ b/ckan/lib/cli.py @@ -18,6 +18,7 @@ import paste.script from paste.registry import Registry from paste.script.util.logging_config import fileConfig +from sqlalchemy import or_, and_ #NB No CKAN imports are allowed until after the config file is loaded. # i.e. do the imports in methods, after _load_config is called. @@ -925,7 +926,16 @@ def purge(self, dataset_ref): name = dataset.name rev = model.repo.new_revision() + + # Purge membership to several groups + q_member = model.Session.query(model.Member).filter(and_( + model.Member.table_name == 'package', + model.Member.table_id == dataset_ref)) + for memb in q_member.all(): + memb.purge() + # Purge actual dataset dataset.purge() + model.repo.commit_and_remove() print '%s purged' % name diff --git a/ckan/model/group.py b/ckan/model/group.py index 0d2102375f2..98843e1d9ea 100644 --- a/ckan/model/group.py +++ b/ckan/model/group.py @@ -102,13 +102,14 @@ def related_packages(self): id=self.table_id).all() def __unicode__(self): - # refer to objects by name, not ID, to help debugging + # Try to refer to objects by name, not ID, to help debugging + # Note A referenced object may be already deleted into the same transaction if self.table_name == 'package': - table_info = 'package=%s' % meta.Session.query(_package.Package).\ - get(self.table_id).name + pkg = meta.Session.query(_package.Package).get(self.table_id) + table_info = 'package=%s' % (pkg.name if pkg else self.table_id) elif self.table_name == 'group': - table_info = 'group=%s' % meta.Session.query(Group).\ - get(self.table_id).name + grp = meta.Session.query(Group).get(self.table_id) + table_info = 'group=%s' % (grp.name if grp else self.table_id) else: table_info = 'table_name=%s table_id=%s' % (self.table_name, self.table_id)