Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 53adf09

Browse files
committed
[#6439] Concurrent-safe resource updates
1 parent 7abd62c commit 53adf09

5 files changed

Lines changed: 47 additions & 4 deletions

File tree

ckan/logic/action/create.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,9 @@ def resource_create(context, data_dict):
289289
if not data_dict.get('url'):
290290
data_dict['url'] = ''
291291

292+
package_show_context = dict(context, for_update=True, return_type='dict')
292293
pkg_dict = _get_action('package_show')(
293-
dict(context, return_type='dict'),
294+
package_show_context,
294295
{'id': package_id})
295296

296297
_check_access('resource_create', context, data_dict)

ckan/logic/action/delete.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ def resource_delete(context, data_dict):
189189

190190
package_id = entity.get_package_id()
191191

192-
pkg_dict = _get_action('package_show')(context, {'id': package_id})
192+
package_show_context = dict(context, for_update=True)
193+
pkg_dict = _get_action('package_show')(package_show_context, {'id': package_id})
193194

194195
for plugin in plugins.PluginImplementations(plugins.IResourceController):
195196
plugin.before_delete(context, data_dict,

ckan/logic/action/patch.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def package_patch(context, data_dict):
3939
'user': context['user'],
4040
'auth_user_obj': context['auth_user_obj'],
4141
'ignore_auth': context.get('ignore_auth', False),
42+
'for_update': True,
4243
}
4344

4445
package_dict = _get_action('package_show')(
@@ -69,6 +70,7 @@ def resource_patch(context, data_dict):
6970
'session': context['session'],
7071
'user': context['user'],
7172
'auth_user_obj': context['auth_user_obj'],
73+
'for_update': True,
7274
}
7375

7476
resource_dict = _get_action('resource_show')(

ckan/logic/action/update.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ def resource_update(context, data_dict):
8282
del context["resource"]
8383

8484
package_id = resource.package.id
85-
pkg_dict = _get_action('package_show')(dict(context, return_type='dict'),
85+
package_show_context = dict(context, for_update=True, return_type='dict')
86+
pkg_dict = _get_action('package_show')(package_show_context,
8687
{'id': package_id})
8788

8889
for n, p in enumerate(pkg_dict['resources']):
@@ -547,7 +548,8 @@ def package_resource_reorder(context, data_dict):
547548
if len(set(order)) != len(order):
548549
raise ValidationError({'order': 'Must supply unique resource_ids'})
549550

550-
package_dict = _get_action('package_show')(context, {'id': id})
551+
package_show_context = dict(context, for_update=True, return_type='dict')
552+
package_dict = _get_action('package_show')(package_show_context, {'id': id})
551553
existing_resources = package_dict.get('resources', [])
552554
ordered_resources = []
553555

ckan/tests/logic/action/test_patch.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# encoding: utf-8
22
"""Unit tests for ckan/logic/action/patch.py."""
33
import pytest
4+
import mock
45

56
from ckan.tests import helpers, factories
7+
from ckan.logic.action.get import package_show as core_package_show
68

79

810
@pytest.mark.usefixtures("clean_db", "with_request_context")
@@ -171,3 +173,38 @@ def test_organization_patch_updating_single_field_when_public_user_details_is_fa
171173
assert organization2["description"] == "somethingnew"
172174
assert len(organization2["users"]) == 1
173175
assert organization2["users"][0]["name"] == user["name"]
176+
177+
def test_package_patch_for_update(self):
178+
179+
dataset = factories.Dataset()
180+
181+
mock_package_show = mock.MagicMock()
182+
mock_package_show.side_effect = lambda context, data_dict: core_package_show(context, data_dict)
183+
184+
with mock.patch.dict('ckan.logic._actions', {'package_show': mock_package_show}):
185+
helpers.call_action('package_patch', id=dataset['id'], notes='hey')
186+
assert mock_package_show.call_args_list[0][0][0].get('for_update') is True
187+
188+
def test_resource_patch_for_update(self):
189+
190+
dataset = factories.Dataset()
191+
resource = factories.Resource(package_id=dataset['id'])
192+
193+
mock_package_show = mock.MagicMock()
194+
mock_package_show.side_effect = lambda context, data_dict: core_package_show(context, data_dict)
195+
196+
with mock.patch.dict('ckan.logic._actions', {'package_show': mock_package_show}):
197+
helpers.call_action('resource_patch', id=resource['id'], description='hey')
198+
assert mock_package_show.call_args_list[0][0][0].get('for_update') is True
199+
200+
def test_resource_update_for_update(self):
201+
202+
dataset = factories.Dataset()
203+
resource = factories.Resource(package_id=dataset['id'])
204+
205+
mock_package_show = mock.MagicMock()
206+
mock_package_show.side_effect = lambda context, data_dict: core_package_show(context, data_dict)
207+
208+
with mock.patch.dict('ckan.logic._actions', {'package_show': mock_package_show}):
209+
helpers.call_action('resource_update', id=resource['id'], description='hey')
210+
assert mock_package_show.call_args_list[0][0][0].get('for_update') is True

0 commit comments

Comments
 (0)