From c0abea1759646a078a3b5b3714d4cb50511fdba6 Mon Sep 17 00:00:00 2001 From: Sean Hammond Date: Tue, 3 Jan 2012 16:31:13 +0100 Subject: [PATCH] Add activity_detail_show() method and tests Add activity_detail_show() method to ckan.logic.action.get, use this method in ckan.tests.models.test_activity whenever we need to get activity detail items. --- ckan/lib/dictization/model_dictize.py | 12 ++- ckan/logic/action/get.py | 15 +++- ckan/tests/models/test_activity.py | 124 +++++++++++++++----------- 3 files changed, 94 insertions(+), 57 deletions(-) diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index e8110bf70a4..4220aeef111 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -343,7 +343,6 @@ def package_to_api2(pkg, context): return dictized def activity_dictize(activity, context): - # TODO: Include any related activity detail items in the activity dict. activity_dict = table_dictize(activity, context) return activity_dict @@ -353,3 +352,14 @@ def activity_list_dictize(activity_list, context): activity_dict = activity_dictize(activity, context) activity_dicts.append(activity_dict) return activity_dicts + +def activity_detail_dictize(activity_detail, context): + return table_dictize(activity_detail, context) + +def activity_detail_list_dictize(activity_detail_list, context): + activity_detail_dicts = [] + for activity_detail in activity_detail_list: + activity_detail_dict = activity_detail_dictize(activity_detail, + context) + activity_detail_dicts.append(activity_detail_dict) + return activity_detail_dicts diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 3c5e9177357..59e3a53d39c 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -21,7 +21,8 @@ tag_dictize, task_status_dictize, user_dictize, - activity_list_dictize) + activity_list_dictize, + activity_detail_list_dictize) from ckan.lib.dictization.model_dictize import (package_to_api1, package_to_api2, @@ -868,9 +869,19 @@ def status_show(context, data_dict): } def activity_show(context, data_dict): - '''Get a user's public activity stream as a list of dicts.''' + '''Return a user's public activity stream as a list of dicts.''' model = context['model'] user_id = data_dict['id'] activity_objects = model.Session.query( model.activity.Activity).filter_by(user_id=user_id).all() return activity_list_dictize(activity_objects, context) + +def activity_detail_show(context, data_dict): + '''Return an activity's list of activity detail items, as a list of dicts. + + ''' + model = context['model'] + activity_id = data_dict['id'] + activity_detail_objects = model.Session.query( + model.activity.ActivityDetail).filter_by(activity_id=activity_id).all() + return activity_detail_list_dictize(activity_detail_objects, context) diff --git a/ckan/tests/models/test_activity.py b/ckan/tests/models/test_activity.py index 9943a170639..21ff91b0eb1 100644 --- a/ckan/tests/models/test_activity.py +++ b/ckan/tests/models/test_activity.py @@ -8,7 +8,7 @@ from ckan.logic.action.update import package_update, resource_update from ckan.logic.action.delete import package_delete from ckan.lib.dictization.model_dictize import resource_list_dictize -from ckan.logic.action.get import activity_show +from ckan.logic.action.get import activity_show, activity_detail_show def datetime_from_string(s): '''Return a standard datetime.datetime object initialised from a string in @@ -66,11 +66,16 @@ def get_user_activity_stream(user_id): data_dict = {'id':user_id} return activity_show(context, data_dict) +def get_activity_details(activity): + '''Return the list of activity details for the given activity.''' + context = {'model': model} + data_dict = {'id': activity['id']} + return activity_detail_show(context, data_dict) + def record_details(user_id): details = {} details['user activity stream'] = get_user_activity_stream(user_id) details['time'] = datetime.datetime.now() - details['details'] = model.Session.query(model.activity.ActivityDetail).all() return details def find_new_activities(before, after): @@ -132,24 +137,25 @@ def _create_package(self, user): # Test that there are three activity details: one for the package # itself and one for each of its two resources, and test that each # contains the right data. - assert len(after['details']) == len(before['details']) + 3 - new_details = after['details'][-3:] - for detail in new_details: - assert detail.activity_id == activity['id'], \ - str(detail.activity_id) - assert detail.activity_type == "new", str(detail.activity_type) - if detail.object_id == package_created['id']: - assert detail.object_type == "Package", str(detail.object_type) - elif detail.object_id == package_created['resources'][0]['id']: - assert detail.object_type == "Resource", \ - str(detail.object_type) - elif detail.object_id == package_created['resources'][1]['id']: - assert detail.object_type == "Resource", \ - str(detail.object_type) + details = get_activity_details(activity) + assert len(details) == 3 + for detail in details: + assert detail['activity_id'] == activity['id'], \ + str(detail['activity_id']) + assert detail['activity_type'] == "new", str(detail['activity_type']) + if detail['object_id'] == package_created['id']: + assert detail['object_type'] == "Package", \ + str(detail['object_type']) + elif detail['object_id'] == package_created['resources'][0]['id']: + assert detail['object_type'] == "Resource", \ + str(detail['object_type']) + elif detail['object_id'] == package_created['resources'][1]['id']: + assert detail['object_type'] == "Resource", \ + str(detail['object_type']) else: assert False, ("Activity detail's object_id did not match" "package or any of its resources: %s" \ - % str(detail.object_id)) + % str(detail['object_id'])) def test_create_package(self): """ @@ -223,16 +229,18 @@ def _add_resource(self, package, user): str(activity['timestamp']) # Test for the presence of a correct activity detail item. - assert len(after['details']) == len(before['details']) + 1 - detail = after['details'][-1] - assert detail.activity_id == activity['id'], str(detail.activity_id) + details = get_activity_details(activity) + assert len(details) == 1 + detail = details[0] + assert detail['activity_id'] == activity['id'], \ + str(detail['activity_id']) new_resource_ids = [id for id in resource_ids_after if id not in resource_ids_before] assert len(new_resource_ids) == 1 new_resource_id = new_resource_ids[0] - assert detail.object_id == new_resource_id, str(detail.object_id) - assert detail.object_type == "Resource", str(detail.object_type) - assert detail.activity_type == "new", str(detail.activity_type) + assert detail['object_id'] == new_resource_id, str(detail['object_id']) + assert detail['object_type'] == "Resource", str(detail['object_type']) + assert detail['activity_type'] == "new", str(detail['activity_type']) def test_add_resources(self): """ @@ -304,12 +312,15 @@ def _update_package(self, package, user): str(activity['timestamp']) # Test for the presence of a correct activity detail item. - assert len(after['details']) == len(before['details']) + 1 - detail = after['details'][-1] - assert detail.activity_id == activity['id'], str(detail.activity_id) - assert detail.object_id == package.id, str(detail.object_id) - assert detail.object_type == "Package", str(detail.object_type) - assert detail.activity_type == "changed", str(detail.activity_type) + details = get_activity_details(activity) + assert len(details) == 1 + detail = details[0] + assert detail['activity_id'] == activity['id'], \ + str(detail['activity_id']) + assert detail['object_id'] == package.id, str(detail['object_id']) + assert detail['object_type'] == "Package", str(detail['object_type']) + assert detail['activity_type'] == "changed", \ + str(detail['activity_type']) def test_update_package(self): """ @@ -382,12 +393,15 @@ def _update_resource(self, package, resource, user): str(activity['timestamp']) # Test for the presence of a correct activity detail item. - assert len(after['details']) == len(before['details']) + 1 - detail = after['details'][-1] - assert detail.activity_id == activity['id'], str(detail.activity_id) - assert detail.object_id == resource.id, str(detail.object_id) - assert detail.object_type == "Resource", str(detail.object_type) - assert detail.activity_type == "changed", str(detail.activity_type) + details = get_activity_details(activity) + assert len(details) == 1 + detail = details[0] + assert detail['activity_id'] == activity['id'], \ + str(detail['activity_id']) + assert detail['object_id'] == resource.id, str(detail['object_id']) + assert detail['object_type'] == "Resource", str(detail['object_type']) + assert detail['activity_type'] == "changed", \ + str(detail['activity_type']) def test_update_resource(self): """ @@ -461,14 +475,17 @@ def _delete_package(self, package): str(activity['timestamp']) # Test for the presence of a correct activity detail item. - assert len(after['details']) == len(before['details']) + 1 - detail = after['details'][-1] - assert detail.activity_id == activity['id'], str(detail.activity_id) - assert detail.object_id == package.id, str(detail.object_id) - assert detail.object_type == "Package", str(detail.object_type) + details = get_activity_details(activity) + assert len(details) == 1 + detail = details[0] + assert detail['activity_id'] == activity['id'], \ + str(detail['activity_id']) + assert detail['object_id'] == package.id, str(detail['object_id']) + assert detail['object_type'] == "Package", str(detail['object_type']) # "Deleted" packages actually show up as changed (the package's status # changes to "deleted" but the package is not expunged). - assert detail.activity_type == "changed", str(detail.activity_type) + assert detail['activity_type'] == "changed", \ + str(detail['activity_type']) def test_delete_package(self): """ @@ -525,19 +542,18 @@ def _delete_resources(self, package): str(activity['timestamp']) # Test for the presence of correct activity detail items. - if num_resources == 0: - assert len(after['details']) == len(before['details']) - else: - assert len(after['details']) == len(before['details']) + \ - num_resources - new_details = after['details'][-num_resources:] - for detail in new_details: - assert detail.activity_id == activity['id'], \ - "activity_id should be %s but is %s" \ - % (activity['id'], detail.activity_id) - assert detail.object_id in resource_ids, str(detail.object_id) - assert detail.object_type == "Resource", str(detail.object_type) - assert detail.activity_type == "changed", str(detail.activity_type) + details = get_activity_details(activity) + assert len(details) == num_resources + for detail in details: + assert detail['activity_id'] == activity['id'], \ + "activity_id should be %s but is %s" \ + % (activity['id'], detail['activity_id']) + assert detail['object_id'] in resource_ids, \ + str(detail['object_id']) + assert detail['object_type'] == "Resource", \ + str(detail['object_type']) + assert detail['activity_type'] == "changed", \ + str(detail['activity_type']) def test_delete_resources(self): """