Skip to content

Commit

Permalink
[#3199] Update revisions on bulk operations
Browse files Browse the repository at this point in the history
`bulk_update_private`, `bulk_update_public` and ``bulk_update_delete`
changed the `package` table and the search index but not the revision
 table, which caused the changes to not be reflected everywhere.

This fixes the model query and adds a bunch of tests.

Conflicts:
	ckan/tests/logic/action/test_update.py
  • Loading branch information
amercader committed Aug 25, 2016
1 parent d3735ad commit 3fb6d91
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 5 deletions.
7 changes: 3 additions & 4 deletions ckan/logic/action/update.py
Expand Up @@ -1224,16 +1224,15 @@ def _bulk_update_dataset(context, data_dict, update_dict):
org_id = data_dict.get('org_id')

model = context['model']

model.Session.query(model.package_table) \
.filter(model.Package.id.in_(datasets)) \
.filter(model.Package.owner_org == org_id) \
.update(update_dict, synchronize_session=False)

# revisions
model.Session.query(model.package_table) \
.filter(model.Package.id.in_(datasets)) \
.filter(model.Package.owner_org == org_id) \
model.Session.query(model.package_revision_table) \
.filter(model.PackageRevision.id.in_(datasets)) \
.filter(model.PackageRevision.owner_org == org_id) \
.update(update_dict, synchronize_session=False)

model.Session.commit()
Expand Down
99 changes: 98 additions & 1 deletion ckan/tests/logic/action/test_update.py
Expand Up @@ -5,13 +5,14 @@
import mock
import pylons.config as config

import ckan.model as model
import ckan.logic as logic
import ckan.lib.app_globals as app_globals
import ckan.plugins as p
import ckan.tests.helpers as helpers
import ckan.tests.factories as factories

assert_equals = nose.tools.assert_equals
assert_equals = eq_ = nose.tools.assert_equals
assert_raises = nose.tools.assert_raises


Expand Down Expand Up @@ -748,3 +749,99 @@ def test_app_globals_set_if_defined(self):
assert hasattr(app_globals.app_globals, globals_key)

assert_equals(getattr(app_globals.app_globals, globals_key), value)


class TestBulkOperations(object):

@classmethod
def teardown_class(cls):
helpers.reset_db()

def setup(self):
helpers.reset_db()

def test_bulk_make_private(self):

org = factories.Organization()

dataset1 = factories.Dataset(owner_org=org['id'])
dataset2 = factories.Dataset(owner_org=org['id'])

helpers.call_action('bulk_update_private', {},
datasets=[dataset1['id'], dataset2['id']],
org_id=org['id'])

# Check search index
datasets = helpers.call_action('package_search', {},
q='owner_org:{0}'.format(org['id']))

for dataset in datasets['results']:
eq_(dataset['private'], True)

# Check DB
datasets = model.Session.query(model.Package) \
.filter(model.Package.owner_org == org['id']).all()
for dataset in datasets:
eq_(dataset.private, True)

revisions = model.Session.query(model.PackageRevision) \
.filter(model.PackageRevision.owner_org == org['id']).all()
for revision in revisions:
eq_(revision.private, True)

def test_bulk_make_public(self):

org = factories.Organization()

dataset1 = factories.Dataset(owner_org=org['id'], private=True)
dataset2 = factories.Dataset(owner_org=org['id'], private=True)

helpers.call_action('bulk_update_public', {},
datasets=[dataset1['id'], dataset2['id']],
org_id=org['id'])

# Check search index
datasets = helpers.call_action('package_search', {},
q='owner_org:{0}'.format(org['id']))

for dataset in datasets['results']:
eq_(dataset['private'], False)

# Check DB
datasets = model.Session.query(model.Package) \
.filter(model.Package.owner_org == org['id']).all()
for dataset in datasets:
eq_(dataset.private, False)

revisions = model.Session.query(model.PackageRevision) \
.filter(model.PackageRevision.owner_org == org['id']).all()
for revision in revisions:
eq_(revision.private, False)

def test_bulk_delete(self):

org = factories.Organization()

dataset1 = factories.Dataset(owner_org=org['id'])
dataset2 = factories.Dataset(owner_org=org['id'])

helpers.call_action('bulk_update_delete', {},
datasets=[dataset1['id'], dataset2['id']],
org_id=org['id'])

# Check search index
datasets = helpers.call_action('package_search', {},
q='owner_org:{0}'.format(org['id']))

eq_(datasets['results'], [])

# Check DB
datasets = model.Session.query(model.Package) \
.filter(model.Package.owner_org == org['id']).all()
for dataset in datasets:
eq_(dataset.state, 'deleted')

revisions = model.Session.query(model.PackageRevision) \
.filter(model.PackageRevision.owner_org == org['id']).all()
for revision in revisions:
eq_(revision.state, 'deleted')

0 comments on commit 3fb6d91

Please sign in to comment.