diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py
index b861ca1e7f5..f98140416cd 100644
--- a/ckan/logic/action/get.py
+++ b/ckan/logic/action/get.py
@@ -919,6 +919,10 @@ def render_new_group_activity(context, activity):
return render('activity_streams/new_group.html',
extra_vars = {'activity': activity})
+def render_changed_group_activity(context, activity):
+ return render('activity_streams/changed_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 = {
@@ -927,6 +931,7 @@ def render_new_group_activity(context, activity):
'new user' : render_new_user_activity,
'changed user' : render_changed_user_activity,
'new group' : render_new_group_activity,
+ 'changed group' : render_changed_group_activity,
}
def user_activity_list_html(context, data_dict):
diff --git a/ckan/logic/action/update.py b/ckan/logic/action/update.py
index 0923a18f649..7921ffbeabd 100644
--- a/ckan/logic/action/update.py
+++ b/ckan/logic/action/update.py
@@ -332,6 +332,17 @@ def group_update(context, data_dict):
for item in PluginImplementations(IGroupController):
item.edit(group)
+ activity_dict = {
+ 'user_id': model.User.by_name(user.decode('utf8')).id,
+ 'object_id': group.id,
+ 'activity_type': 'changed group',
+ }
+ activity_dict['data'] = {'group': group_dictize(group, context)}
+ from ckan.logic.action.create import activity_create
+ activity_create(context, activity_dict)
+ # TODO: Also create an activity detail recording what exactly changed in
+ # the group.
+
if not context.get('defer_commit'):
model.repo.commit()
if errors:
diff --git a/ckan/templates/activity_streams/changed_group.html b/ckan/templates/activity_streams/changed_group.html
new file mode 100644
index 00000000000..6fe416f4aea
--- /dev/null
+++ b/ckan/templates/activity_streams/changed_group.html
@@ -0,0 +1,23 @@
+
+
+
+
+ ${h.linked_user(activity.user_id)}
+
updated
+ the group
+
+ ${activity.data.group.display_name}
+
+
+ ${h.truncate(activity.data.group.description, length=80, whole_word=True)}
+
+ ${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 d7ef3e16469..8d5754f8135 100644
--- a/ckan/tests/models/test_activity.py
+++ b/ckan/tests/models/test_activity.py
@@ -6,7 +6,7 @@
import ckan.model as model
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.update import user_update, group_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 user_activity_list, activity_detail_list
@@ -690,7 +690,7 @@ def test_create_group(self):
before = record_details(user.id)
- # Create a new package.
+ # Create a new group.
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)
@@ -717,3 +717,50 @@ def test_create_group(self):
timestamp = datetime_from_string(activity['timestamp'])
assert timestamp >= before['time'] and timestamp <= after['time'], \
str(activity['timestamp'])
+
+ def _update_group(self, group, user):
+ """
+ Update the given group and test that the correct activity stream
+ item and detail are emitted.
+
+ """
+ before = record_details(user.id)
+
+ # Update the group.
+ context = {'model': model, 'session': model.Session, 'user': user.name,
+ 'allow_partial_update': True}
+ group_dict = {'id': group.id, 'title': 'edited'}
+ group_update(context, group_dict)
+
+ 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.id, str(activity['object_id'])
+ assert activity['user_id'] == user.id, str(activity['user_id'])
+ assert activity['activity_type'] == 'changed group', \
+ str(activity['activity_type'])
+ if not activity.has_key('id'):
+ assert False, "activity object has no id value"
+ # TODO: Test for the _correct_ revision_id value.
+ if not activity.has_key('revision_id'):
+ assert False, "activity has no revision_id value"
+ timestamp = datetime_from_string(activity['timestamp'])
+ assert timestamp >= before['time'] and timestamp <= after['time'], \
+ str(activity['timestamp'])
+
+ def test_update_group(self):
+ """
+ Test updated group activity stream.
+
+ Test that correct activity stream item and detail items are created
+ when groups are updated.
+
+ """
+ for group in model.Session.query(model.Group).all():
+ self._update_group(group, user=self.sysadmin_user)