Skip to content

Commit

Permalink
[release-1.6.1][#2266]: Deleting resources over REST interface fixed.
Browse files Browse the repository at this point in the history
  • Loading branch information
David Read committed Mar 28, 2012
1 parent 6d3db93 commit ed2772b
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 11 deletions.
2 changes: 1 addition & 1 deletion ckan/lib/dictization/model_save.py
Expand Up @@ -69,7 +69,7 @@ def package_resource_list_save(res_dicts, package, context):
resource_list[:] = obj_list

for resource in set(old_list) - set(obj_list):
if pending and resource.state <> 'deleted':
if pending and resource.state != 'deleted':
resource.state = 'pending-deleted'
else:
resource.state = 'deleted'
Expand Down
2 changes: 1 addition & 1 deletion ckan/logic/action/update.py
Expand Up @@ -525,7 +525,7 @@ def package_update_rest(context, data_dict):
raise ValidationError(error_dict)

context["package"] = pkg
context["allow_partial_update"] = True
context["allow_partial_update"] = False
dictized_package = model_save.package_api_to_dict(data_dict, context)

check_access('package_update_rest', context, dictized_package)
Expand Down
60 changes: 51 additions & 9 deletions ckan/tests/functional/api/model/test_package.py
Expand Up @@ -380,7 +380,9 @@ def test_09_update_package_entity_not_found(self):
status=self.STATUS_404_NOT_FOUND,
extra_environ=self.extra_environ)

def create_package_roles_revision(self, package_data):
def create_package_with_admin_user(self, package_data):
'''Creates a package with self.user as admin and provided package_data.
'''
self.create_package(admins=[self.user], data=package_data)

def assert_package_update_ok(self, package_ref_attribute,
Expand Down Expand Up @@ -420,7 +422,7 @@ def assert_package_update_ok(self, package_ref_attribute,
},
'tags': [u'tag 1.1', u'tag2', u'tag 4', u'tag5.'],
}
self.create_package_roles_revision(old_fixture_data)
self.create_package_with_admin_user(old_fixture_data)
pkg = self.get_package_by_name(old_fixture_data['name'])
# This is the one occasion where we reference package explicitly
# by name or ID, rather than use the value from self.ref_package_by
Expand Down Expand Up @@ -517,7 +519,7 @@ def test_package_update_invalid(self):
u'last_modified':u'123', # INVALID
}],
}
self.create_package_roles_revision(old_fixture_data)
self.create_package_with_admin_user(old_fixture_data)
pkg = self.get_package_by_name(old_fixture_data['name'])
offset = self.offset('/rest/dataset/%s' % pkg.name)
params = '%s=1' % self.dumps(new_fixture_data)
Expand All @@ -542,7 +544,7 @@ def test_package_update_delete_last_extra(self):
u'key1': None,
},
}
self.create_package_roles_revision(old_fixture_data)
self.create_package_with_admin_user(old_fixture_data)
offset = self.package_offset(old_fixture_data['name'])
params = '%s=1' % self.dumps(new_fixture_data)
res = self.app.post(offset, params=params, status=self.STATUS_200_OK,
Expand Down Expand Up @@ -576,7 +578,7 @@ def test_package_update_do_not_delete_last_extra(self):
'extras': {}, # no extras specified, but existing
# ones should be left alone
}
self.create_package_roles_revision(old_fixture_data)
self.create_package_with_admin_user(old_fixture_data)
offset = self.package_offset(old_fixture_data['name'])
params = '%s=1' % self.dumps(new_fixture_data)
res = self.app.post(offset, params=params, status=self.STATUS_200_OK,
Expand Down Expand Up @@ -607,7 +609,7 @@ def test_entity_update_readd_tag(self):
'name': name,
'tags': ['tag 1.']
}
self.create_package_roles_revision(old_fixture_data)
self.create_package_with_admin_user(old_fixture_data)
offset = self.package_offset(name)
params = '%s=1' % self.dumps(new_fixture_data)
res = self.app.post(offset, params=params, status=self.STATUS_200_OK,
Expand All @@ -631,10 +633,10 @@ def test_entity_update_readd_tag(self):
def test_entity_update_conflict(self):
package1_name = self.package_fixture_data['name']
package1_data = {'name': package1_name}
package1 = self.create_package_roles_revision(package1_data)
package1 = self.create_package_with_admin_user(package1_data)
package2_name = u'somethingnew'
package2_data = {'name': package2_name}
package2 = self.create_package_roles_revision(package2_data)
package2 = self.create_package_with_admin_user(package2_data)
try:
package1_offset = self.package_offset(package1_name)
# trying to rename package 1 to package 2's name
Expand All @@ -645,7 +647,7 @@ def test_entity_update_conflict(self):
def test_entity_update_empty(self):
package1_name = self.package_fixture_data['name']
package1_data = {'name': package1_name}
package1 = self.create_package_roles_revision(package1_data)
package1 = self.create_package_with_admin_user(package1_data)
package2_data = '' # this is the error
package1_offset = self.package_offset(package1_name)
self.app.put(package1_offset, package2_data,
Expand All @@ -668,6 +670,46 @@ def test_entity_update_indexerror(self):
plugins.unload('synchronous_search')
SolrSettings.init(original_settings)

def test_package_update_delete_resource(self):
old_fixture_data = {
'name': self.package_fixture_data['name'],
'resources': [{
u'url':u'http://blah.com/file2.xml',
u'format':u'xml',
u'description':u'Appendix 1',
u'hash':u'def123',
u'alt_url':u'alt123',
},{
u'url':u'http://blah.com/file3.xml',
u'format':u'xml',
u'description':u'Appenddic 2',
u'hash':u'ghi123',
u'alt_url':u'alt123',
}],
}
new_fixture_data = {
'name':u'somethingnew',
'resources': [],
}
self.create_package_with_admin_user(old_fixture_data)
offset = self.package_offset(old_fixture_data['name'])
params = '%s=1' % self.dumps(new_fixture_data)
res = self.app.post(offset, params=params, status=self.STATUS_200_OK,
extra_environ=self.extra_environ)

try:
# Check the returned package is as expected
pkg = self.loads(res.body)
assert_equal(pkg['name'], new_fixture_data['name'])
assert_equal(pkg['resources'], [])

# Check resources were deleted
model.Session.remove()
package = self.get_package_by_name(new_fixture_data['name'])
self.assert_equal(len(package.resources), 0)
finally:
self.purge_package_by_name(new_fixture_data['name'])

def test_entity_delete_ok(self):
# create a package with package_fixture_data
if not self.get_package_by_name(self.package_fixture_data['name']):
Expand Down

0 comments on commit ed2772b

Please sign in to comment.