diff --git a/ckan/logic/action/update.py b/ckan/logic/action/update.py index db451f5b887..69518fe1c93 100644 --- a/ckan/logic/action/update.py +++ b/ckan/logic/action/update.py @@ -510,8 +510,12 @@ def _group_or_org_update(context, data_dict, is_org=False): else: rev.message = _(u'REST API: Update object %s') % data.get("name") - group = model_save.group_dict_save(data, context, - prevent_packages_update=is_org) + contains_packages = 'packages' in data_dict + + group = model_save.group_dict_save( + data, context, + prevent_packages_update=is_org or not contains_packages + ) if is_org: plugin_type = plugins.IOrganizationController diff --git a/ckan/tests/logic/action/test_patch.py b/ckan/tests/logic/action/test_patch.py index 4de8a8765c5..0ab5ce6ca80 100644 --- a/ckan/tests/logic/action/test_patch.py +++ b/ckan/tests/logic/action/test_patch.py @@ -75,6 +75,37 @@ def test_group_patch_updating_single_field(self): assert_equals(group2['name'], 'economy') assert_equals(group2['description'], 'somethingnew') + def test_group_patch_preserve_datasets(self): + user = factories.User() + group = factories.Group( + name='economy', + description='some test now', + user=user) + factories.Dataset(groups=[{'name': group['name']}]) + + group2 = helpers.call_action('group_show', id=group['id']) + assert_equals(1, group2['package_count']) + + group = helpers.call_action( + 'group_patch', + id=group['id'], + context={'user': user['name']}) + + group3 = helpers.call_action('group_show', id=group['id']) + assert_equals(1, group3['package_count']) + + group = helpers.call_action( + 'group_patch', + id=group['id'], + packages=[], + context={'user': user['name']}) + + group4 = helpers.call_action( + 'group_show', id=group['id'], include_datasets=True + ) + assert_equals(0, group4['package_count']) + + def test_organization_patch_updating_single_field(self): user = factories.User() organization = factories.Organization(