From b6971f9dbcc11775c074d1606cee050bc4490390 Mon Sep 17 00:00:00 2001 From: kindly Date: Tue, 3 Jan 2012 14:21:52 +0000 Subject: [PATCH] [#1531] fix so capacities get output on dictization --- ckan/lib/dictization/__init__.py | 11 +++++++++-- ckan/lib/dictization/model_dictize.py | 24 ++++++++++++++++++++---- ckan/tests/lib/test_dictization.py | 9 +++++++-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/ckan/lib/dictization/__init__.py b/ckan/lib/dictization/__init__.py index 571da459edc..66d4abf6dec 100644 --- a/ckan/lib/dictization/__init__.py +++ b/ckan/lib/dictization/__init__.py @@ -9,7 +9,7 @@ # these functions. Copy code from here as needed. -def table_dictize(obj, context): +def table_dictize(obj, context, **kw): '''Get any model object and represent it as a dict''' result_dict = {} @@ -44,6 +44,8 @@ def table_dictize(obj, context): else: result_dict[name] = unicode(value) + result_dict.update(kw) + return result_dict @@ -54,9 +56,14 @@ def obj_list_dictize(obj_list, context, sort_key=lambda x:x): active = context.get('active', True) for obj in obj_list: + if context.get('with_capacity'): + obj, capacity = obj + dictized = table_dictize(obj, context, capacity=capacity) + else: + dictized = table_dictize(obj, context) if active and obj.state not in ('active', 'pending'): continue - result_list.append(table_dictize(obj, context)) + result_list.append(dictized) return sorted(result_list, key=sort_key) diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index f6c0bc5bdfb..4bca9d42d4c 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -19,7 +19,11 @@ def group_list_dictize(obj_list, context, result_list = [] for obj in obj_list: - group_dict = table_dictize(obj, context) + if context.get('with_capacity'): + obj, capacity = obj + group_dict = table_dictize(obj, context, capacity=capacity) + else: + group_dict = table_dictize(obj, context) group_dict.pop('created') if active and obj.state not in ('active', 'pending'): continue @@ -188,7 +192,7 @@ def _get_members(context, group, member_type): model = context['model'] Entity = getattr(model, member_type[:-1].capitalize()) - return model.Session.query(Entity).\ + return model.Session.query(Entity, model.Member.capacity).\ join(model.Member, model.Member.table_id == Entity.id).\ filter(model.Member.group_id == group.id).\ filter(model.Member.state == 'active').\ @@ -204,6 +208,8 @@ def group_dictize(group, context): result_dict['extras'] = extras_dict_dictize( group._extras, context) + context['with_capacity'] = True + result_dict['packages'] = obj_list_dictize( _get_members(context, group, 'packages'), context) @@ -220,6 +226,7 @@ def group_dictize(group, context): _get_members(context, group, 'users'), context) + context['with_capacity'] = False return result_dict @@ -227,7 +234,12 @@ def tag_list_dictize(tag_list, context): result_list = [] for tag in tag_list: - result_list.append(table_dictize(tag, context)) + if context.get('with_capacity'): + tag, capacity = tag + dictized = table_dictize(tag, context, capacity=capacity) + else: + dictized = table_dictize(tag, context) + result_list.append(dictized) return result_list @@ -254,7 +266,11 @@ def user_list_dictize(obj_list, context, def user_dictize(user, context): - result_dict = table_dictize(user, context) + if context.get('with_capacity'): + user, capacity = user + result_dict = table_dictize(user, context, capacity=capacity) + else: + result_dict = table_dictize(user, context) del result_dict['password'] diff --git a/ckan/tests/lib/test_dictization.py b/ckan/tests/lib/test_dictization.py index 869b11209d4..6fb7741be10 100644 --- a/ckan/tests/lib/test_dictization.py +++ b/ckan/tests/lib/test_dictization.py @@ -834,7 +834,7 @@ def test_16_group_dictized(self): '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, 'capacity': 'in'}], 'users':[{'name': 'annafan'}], 'groups':[{'name': 'simple'}], 'tags':[{'name': 'russian'}] @@ -855,8 +855,9 @@ def test_16_group_dictized(self): 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'}], + 'tags': [{'capacity': 'member', 'name': u'russian'}], 'groups': [{'description': u'', + 'capacity' : 'member', 'display_name': u'simple', 'name': u'simple', 'packages': 0, @@ -865,6 +866,7 @@ def test_16_group_dictized(self): 'type': u'publisher'}], 'users': [{'about': u'I love reading Annakarenina. My site: anna.com', 'display_name': u'annafan', + 'capacity' : 'member', 'email': None, 'email_hash': 'd41d8cd98f00b204e9800998ecf8427e', 'fullname': None, @@ -882,11 +884,14 @@ def test_16_group_dictized(self): 'name': u'annakarenina3', 'notes': u'Some test notes\n\n### A 3rd level heading\n\n**Some bolded text.**\n\n*Some italicized text.*\n\nForeign characters:\nu with umlaut \xfc\n66-style quote \u201c\nforeign word: th\xfcmb\n \nNeeds escaping:\nleft arrow <\n\n\n\n', 'state': u'active', + 'capacity' : 'in', 'title': u'A Novel By Tolstoy', 'url': u'http://www.annakarenina.com', 'version': u'0.7a'}, {'author': None, 'author_email': None, + 'capacity' : 'member', + 'title': u'A Novel By Tolstoy', 'license_id': u'other-open', 'maintainer': None, 'maintainer_email': None,