diff --git a/ckan/logic/action/create.py b/ckan/logic/action/create.py index 653dcc801b7..e5dd055fade 100644 --- a/ckan/logic/action/create.py +++ b/ckan/logic/action/create.py @@ -180,11 +180,14 @@ def member_create(context, data_dict=None): obj_type = data_dict['object_type'] capacity = data_dict['capacity'] + if 'group' not in context: + context['group'] = group_id + # User must be able to update the group to add a member to it check_access('group_update', context, data_dict) # Look up existing, in case it exists - member = model.Session.Query(model.Member).\ + member = model.Session.query(model.Member).\ filter(model.Member.table_name == obj_type).\ filter(model.Member.table_id == obj_id).\ filter(model.Member.group_id == group_id).\ @@ -197,6 +200,7 @@ def member_create(context, data_dict=None): table_id = obj_id, group_id = group_id, capacity=capacity) + model.Session.add(member) model.repo.commit() diff --git a/ckan/logic/action/delete.py b/ckan/logic/action/delete.py index f1f26fc9318..b2d75458f47 100644 --- a/ckan/logic/action/delete.py +++ b/ckan/logic/action/delete.py @@ -87,20 +87,21 @@ def member_delete(context, data_dict=None): obj_id = data_dict['object'] obj_type = data_dict['object_type'] + if 'group' not in context: + context['group'] = group_id + # User must be able to update the group to remove a member from it check_access('group_update', context, data_dict) - member = model.Session.Query(model.Member).\ + member = model.Session.query(model.Member).\ filter(model.Member.table_name == obj_type).\ filter(model.Member.table_id == obj_id).\ filter(model.Member.group_id == group_id).\ filter(model.Member.state == "active").first() - if member: member.delete() model.repo.commit() - def group_delete(context, data_dict): model = context['model'] diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index dff5b685b9f..d39bac699f3 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -118,14 +118,16 @@ def member_list(context, data_dict=None): model = context['model'] user = context['user'] - # User must be able to update the group to remove a member from it - check_access('group_show', context, data_dict) - group_id = data_dict['group'] obj_type = data_dict.get('object_type', None) capacity = data_dict.get('capacity', None) - q = model.Session.Query(model.Member).\ + # User must be able to update the group to remove a member from it + if 'group' not in context: + context['group'] = group_id + check_access('group_show', context, data_dict) + + q = model.Session.query(model.Member).\ filter(model.Member.group_id == group_id).\ filter(model.Member.state == "active") diff --git a/ckan/tests/logic/test_member.py b/ckan/tests/logic/test_member.py new file mode 100644 index 00000000000..dcb6e8cba73 --- /dev/null +++ b/ckan/tests/logic/test_member.py @@ -0,0 +1,68 @@ +from ckan import model +from ckan.logic import get_action +from ckan.lib.create_test_data import CreateTestData + +class TestMemberLogic(object): + + @classmethod + def setup_class(cls): + cls.username = 'testsysadmin' + cls.groupname = 'david' + + model.Session.remove() + CreateTestData.create() + model.Session.remove() + model.repo.new_revision() + + @classmethod + def teardown_class(cls): + model.repo.rebuild_db() + + def _build_context( self, obj, obj_type, capacity='member'): + ctx = { 'model': model, + 'session': model.Session, + 'user':self.username} + dd = { + 'group': self.groupname, + 'object': obj, + 'object_type': obj_type, + 'capacity': capacity } + return ctx, dd + + def _add_member( self, obj, obj_type, capacity): + ctx, dd = self._build_context(obj,obj_type,capacity) + return get_action('member_create')(ctx,dd) + + def test_member_add(self): + res = self._add_member( 'warandpeace', 'package', 'member') + assert 'capacity' in res and res['capacity'] == u'member' + assert 'group_id' in res and res['group_id'] == u'david' + + def test_member_list(self): + _ = self._add_member( 'warandpeace', 'package', 'member') + _ = self._add_member( 'annakarenina', 'package', 'member') + ctx, dd = self._build_context('','package') + res = get_action('member_list')(ctx,dd) + assert res[0][0] == 'warandpeace', res + assert res[1][0] == 'annakarenina', res + + ctx, dd = self._build_context('','user', 'admin') + res = get_action('member_list')(ctx,dd) + assert len(res) == 0, res + + _ = self._add_member( self.username, 'user', 'admin') + ctx, dd = self._build_context('','user', 'admin') + res = get_action('member_list')(ctx,dd) + assert len(res) == 1, res + + + def test_member_delete(self): + _ = self._add_member( self.username, 'user', 'admin') + ctx, dd = self._build_context(self.username,'user', 'admin') + res = get_action('member_list')(ctx,dd) + assert len(res) == 1, res + + get_action('member_delete')(ctx,dd) + + res = get_action('member_list')(ctx,dd) + assert len(res) == 0, res