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)