From 2e0b88f0a0773484c5e11b4ed2f608e2a701dc3f Mon Sep 17 00:00:00 2001 From: Sean Hammond Date: Thu, 12 Jan 2012 18:32:05 +0100 Subject: [PATCH] [#1631] Add activities for new groups --- ckan/lib/dictization/model_save.py | 6 +++- ckan/logic/action/create.py | 9 +++++ ckan/logic/action/get.py | 5 +++ .../templates/activity_streams/new_group.html | 20 +++++++++++ ckan/tests/models/test_activity.py | 36 ++++++++++++++++++- 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 ckan/templates/activity_streams/new_group.html diff --git a/ckan/lib/dictization/model_save.py b/ckan/lib/dictization/model_save.py index a591dbb2a9d..6c646fc35d7 100644 --- a/ckan/lib/dictization/model_save.py +++ b/ckan/lib/dictization/model_save.py @@ -453,8 +453,12 @@ def activity_dict_save(activity_dict, context): object_id = activity_dict['object_id'] revision_id = activity_dict['revision_id'] activity_type = activity_dict['activity_type'] + if activity_dict.has_key('data'): + data = activity_dict['data'] + else: + data = None activity_obj = model.Activity(user_id, object_id, revision_id, - activity_type) + activity_type, data) session.add(activity_obj) # TODO: Handle activity details. diff --git a/ckan/logic/action/create.py b/ckan/logic/action/create.py index cb619a3a2d3..c82b2c63937 100644 --- a/ckan/logic/action/create.py +++ b/ckan/logic/action/create.py @@ -173,6 +173,15 @@ def group_create(context, data_dict): model.Session.flush() for item in PluginImplementations(IGroupController): item.create(group) + + activity_dict = { + 'user_id': model.User.by_name(user.decode('utf8')).id, + 'object_id': group.id, + 'activity_type': 'new group', + } + activity_dict['data'] = {'group': group_dictize(group, context)} + activity_create(context, activity_dict) + if not context.get('defer_commit'): model.repo.commit() context["group"] = group diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index d9192ff5eee..b861ca1e7f5 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -915,6 +915,10 @@ def render_changed_user_activity(context, activity): return render('activity_streams/changed_user.html', extra_vars = {'activity': activity}) +def render_new_group_activity(context, activity): + return render('activity_streams/new_group.html', + extra_vars = {'activity': activity}) + # Global dictionary mapping activity types to functions that render activity # dicts to HTML snippets for including in HTML pages. activity_renderers = { @@ -922,6 +926,7 @@ def render_changed_user_activity(context, activity): 'changed package' : render_changed_package_activity, 'new user' : render_new_user_activity, 'changed user' : render_changed_user_activity, + 'new group' : render_new_group_activity, } def user_activity_list_html(context, data_dict): diff --git a/ckan/templates/activity_streams/new_group.html b/ckan/templates/activity_streams/new_group.html new file mode 100644 index 00000000000..834bd9a0a36 --- /dev/null +++ b/ckan/templates/activity_streams/new_group.html @@ -0,0 +1,20 @@ + + +
+
+ ${h.linked_user(activity.user_id)} + created + the group + + ${activity.data.group.display_name} + + ${h.render_datetime(activity.timestamp, '%B %d %Y')} +
+
+ diff --git a/ckan/tests/models/test_activity.py b/ckan/tests/models/test_activity.py index 8d0a9b631c0..d7ef3e16469 100644 --- a/ckan/tests/models/test_activity.py +++ b/ckan/tests/models/test_activity.py @@ -4,7 +4,7 @@ import ckan import ckan.model as model -from ckan.logic.action.create import package_create, user_create +from ckan.logic.action.create import package_create, user_create, group_create from ckan.logic.action.update import package_update, resource_update from ckan.logic.action.update import user_update from ckan.logic.action.delete import package_delete @@ -683,3 +683,37 @@ def test_update_user(self): """ for user in model.Session.query(model.User).all(): self._update_user(user) + + def test_create_group(self): + + user = self.normal_user + + before = record_details(user.id) + + # Create a new package. + context = {'model': model, 'session': model.Session, 'user': user.name} + request_data = {'name': 'a-new-group', 'title': 'A New Group'} + group_created = group_create(context, request_data) + + after = record_details(user.id) + + # Find the new activity. + new_activities = find_new_activities(before, after) + assert len(new_activities) == 1, ("There should be 1 new activity in " + "the user's activity stream, but found %i" % len(new_activities)) + activity = new_activities[0] + + # Check that the new activity has the right attributes. + assert activity['object_id'] == group_created['id'], \ + str(activity['object_id']) + assert activity['user_id'] == user.id, str(activity['user_id']) + assert activity['activity_type'] == 'new group', \ + str(activity['activity_type']) + if not activity.has_key('id'): + assert False, "activity object should have an id value" + # TODO: Test for the _correct_ revision_id value. + if not activity.has_key('revision_id'): + assert False, "activity object should have a revision_id value" + timestamp = datetime_from_string(activity['timestamp']) + assert timestamp >= before['time'] and timestamp <= after['time'], \ + str(activity['timestamp'])