diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index 73c82ce7f6f..5e57dae8a73 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -637,19 +637,13 @@ def vocabulary_list_dictize(vocabulary_list, context): def activity_dictize(activity, context, include_data=False): activity_dict = d.table_dictize(activity, context) if not include_data: - # take a copy of the activity data, since the original may be used - # elsewhere during the same render and we don't want to affect that - activity_dict['data'] = copy.deepcopy(activity_dict['data']) - # delete all the data apart from the title field on each data object, - # because that is needed to display it in the activity stream - for obj_key in activity_dict['data'].keys(): - obj_data = activity_dict['data'][obj_key] - if isinstance(obj_data, dict): - for key in obj_data.keys(): - if key != 'title': - del obj_data[key] - else: - del activity_dict['data'][obj_key] + # replace the data with just a {'title': title} and not the rest of + # the dataset/group/org/custom obj. we need the title to display it + # in the activity stream. + activity_dict['data'] = { + key: {'title': val['title']} + for (key, val) in activity_dict['data'].items() + if 'title' in val} return activity_dict diff --git a/ckan/tests/lib/dictization/test_model_dictize.py b/ckan/tests/lib/dictization/test_model_dictize.py index c26c0590990..35c577020b7 100644 --- a/ckan/tests/lib/dictization/test_model_dictize.py +++ b/ckan/tests/lib/dictization/test_model_dictize.py @@ -608,3 +608,51 @@ def test_vocabulary_dictize_not_including_datasets(self): assert len(vocab_dict["tags"]) == 2 for tag in vocab_dict["tags"]: assert len(tag.get("packages", [])) == 0 + + +class TestActivityDictize(object): + def setup(self): + helpers.reset_db() + + def test_include_data(self): + dataset = factories.Dataset() + user = factories.User() + activity = factories.Activity( + user_id=user['id'], + object_id=dataset['id'], + revision_id=None, + activity_type='new package', + data={ + 'package': copy.deepcopy(dataset), + 'actor': 'Mr Someone', + }) + activity_obj = model.Activity.get(activity['id']) + context = {'model': model, 'session': model.Session} + dictized = model_dictize.activity_dictize(activity_obj, context, + include_data=True) + assert_equal(dictized['user_id'], user['id']) + assert_equal(dictized['activity_type'], 'new package') + assert_equal(dictized['data']['package']['title'], dataset['title']) + assert_equal(dictized['data']['package']['id'], dataset['id']) + assert_equal(dictized['data']['actor'], 'Mr Someone') + + def test_dont_include_data(self): + dataset = factories.Dataset() + user = factories.User() + activity = factories.Activity( + user_id=user['id'], + object_id=dataset['id'], + revision_id=None, + activity_type='new package', + data={ + 'package': copy.deepcopy(dataset), + 'actor': 'Mr Someone', + }) + activity_obj = model.Activity.get(activity['id']) + context = {'model': model, 'session': model.Session} + dictized = model_dictize.activity_dictize(activity_obj, context, + include_data=False) + assert_equal(dictized['user_id'], user['id']) + assert_equal(dictized['activity_type'], 'new package') + assert_equal(dictized['data'], + {'package': {'title': dataset['title']}})