diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index be48545df3a..0001d3dc60e 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -162,6 +162,17 @@ def package_dictize(pkg, context): return result_dict +def _get_members(context, group, member_type): + + model = context['model'] + Entity = getattr(model, member_type[:-1].capitalize()) + return model.Session.query(Entity).\ + join(model.Member, model.Member.table_id == Entity.id).\ + filter(model.Member.group_id == group.id).\ + filter(model.Member.state == 'active').\ + filter(model.Member.table_name == member_type[:-1]).all() + + def group_dictize(group, context): model = context['model'] result_dict = table_dictize(group, context) @@ -171,16 +182,33 @@ def group_dictize(group, context): result_dict['extras'] = extras_dict_dictize( group._extras, context) - packages = model.Session.query(model.Package).\ - join(model.Member, model.Member.table_id == model.Package.id).\ - filter(model.Member.group_id == group.id).\ - filter(model.Member.state == 'active').all() - result_dict['packages'] = obj_list_dictize( - packages, context) + _get_members(context, group, 'packages'), + context) + + result_dict['tags'] = tag_list_dictize( + _get_members(context, group, 'tags'), + context) + + result_dict['groups'] = group_list_dictize( + _get_members(context, group, 'groups'), + context) + + result_dict['users'] = user_list_dictize( + _get_members(context, group, 'users'), + context) + return result_dict +def tag_list_dictize(tag_list, context): + + result_list = [] + for tag in tag_list: + result_list.append(table_dictize(tag, context)) + + return result_list + def tag_dictize(tag, context): result_dict = table_dictize(tag, context) @@ -190,6 +218,18 @@ def tag_dictize(tag, context): return result_dict +def user_list_dictize(obj_list, context, + sort_key=lambda x:x['name'], reverse=False): + + result_list = [] + + for obj in obj_list: + user_dict = user_dictize(obj, context) + user_dict.pop('apikey') + result_list.append(user_dict) + return sorted(result_list, key=sort_key, reverse=reverse) + + def user_dictize(user, context): result_dict = table_dictize(user, context) diff --git a/ckan/lib/dictization/model_save.py b/ckan/lib/dictization/model_save.py index 429d065682f..fd690a3072f 100644 --- a/ckan/lib/dictization/model_save.py +++ b/ckan/lib/dictization/model_save.py @@ -335,7 +335,6 @@ def group_dict_save(group_dict, context): group_member_save(context, group_dict, 'packages') group_member_save(context, group_dict, 'users') group_member_save(context, group_dict, 'groups') - group_member_save(context, group_dict, 'resources') group_member_save(context, group_dict, 'tags') extras = group_extras_save(group_dict.get("extras", {}), context) diff --git a/ckan/tests/lib/test_dictization.py b/ckan/tests/lib/test_dictization.py index e13dd598db1..869b11209d4 100644 --- a/ckan/tests/lib/test_dictization.py +++ b/ckan/tests/lib/test_dictization.py @@ -818,26 +818,60 @@ def test_16_group_dictized(self): pkg = model.Session.query(model.Package).filter_by(name='annakarenina3').first() + simple_group_dict = {'name': 'simple', + 'title': 'simple', + 'type': 'publisher', + } + model.repo.new_revision() + group_dict_save(simple_group_dict, context) + model.Session.commit() + model.Session.remove() + + context = {"model": model, + "session": model.Session} + group_dict = {'name': 'help', 'title': 'help', 'extras': [{'key': 'genre', 'value': u'"horror"'}, {'key': 'media', 'value': u'"dvd"'}], - 'packages':[{'name': 'annakarenina2'}, {'id': pkg.id}] + 'packages':[{'name': 'annakarenina2'}, {'id': pkg.id}], + 'users':[{'name': 'annafan'}], + 'groups':[{'name': 'simple'}], + 'tags':[{'name': 'russian'}] } - model.repo.new_revision() group_dict_save(group_dict, context) model.Session.commit() model.Session.remove() - + group = model.Session.query(model.Group).filter_by(name=u'help').one() + context = {"model": model, + "session": model.Session} + group_dictized = group_dictize(group, context) expected = {'description': u'', 'extras': [{'key': u'genre', 'state': u'active', 'value': u'"horror"'}, {'key': u'media', 'state': u'active', 'value': u'"dvd"'}], + 'tags': [{'name': u'russian'}], + 'groups': [{'description': u'', + 'display_name': u'simple', + 'name': u'simple', + 'packages': 0, + 'state': u'active', + 'title': u'simple', + 'type': u'publisher'}], + 'users': [{'about': u'I love reading Annakarenina. My site: anna.com', + 'display_name': u'annafan', + 'email': None, + 'email_hash': 'd41d8cd98f00b204e9800998ecf8427e', + 'fullname': None, + 'name': u'annafan', + 'number_administered_packages': 1L, + 'number_of_edits': 0L, + 'reset_key': None}], 'name': u'help', 'display_name': u'help', 'packages': [{'author': None,