diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py
index 6febd0f7c7f..fbab846d930 100644
--- a/ckan/logic/action/get.py
+++ b/ckan/logic/action/get.py
@@ -939,10 +939,26 @@ def render_removed_tag_activity(context, activity, detail):
return render('activity_streams/removed_tag.html',
extra_vars = {'activity': activity, 'detail': detail})
+def render_new_package_extra_activity(context, activity, detail):
+ return render('activity_streams/new_package_extra.html',
+ extra_vars = {'activity': activity, 'detail': detail})
+
+def render_changed_package_extra_activity(context, activity, detail):
+ return render('activity_streams/changed_package_extra.html',
+ extra_vars = {'activity': activity, 'detail': detail})
+
+def render_deleted_package_extra_activity(context, activity, detail):
+ return render('activity_streams/deleted_package_extra.html',
+ extra_vars = {'activity': activity, 'detail': detail})
+
def render_changed_package_activity(context, activity):
details = activity_detail_list(context=context,
data_dict={'id': activity['id']})
+
if len(details) == 1:
+ # If an activity has only one activity detail we try to find an
+ # activity detail renderer to use instead of rendering the normal
+ # 'changed package' template.
detail = details[0]
activity_detail_renderers = {
'Resource': {
@@ -954,6 +970,11 @@ def render_changed_package_activity(context, activity):
'added': render_added_tag_activity,
'removed': render_removed_tag_activity,
},
+ 'PackageExtra': {
+ 'new': render_new_package_extra_activity,
+ 'changed': render_changed_package_extra_activity,
+ 'deleted': render_deleted_package_extra_activity
+ },
}
object_type = detail['object_type']
if activity_detail_renderers.has_key(object_type):
@@ -961,7 +982,7 @@ def render_changed_package_activity(context, activity):
if activity_detail_renderers[object_type].has_key(activity_type):
renderer = activity_detail_renderers[object_type][activity_type]
return renderer(context, activity, detail)
-
+
return render('activity_streams/changed_package.html',
extra_vars = {'activity': activity})
@@ -1005,7 +1026,8 @@ def _activity_list_to_html(context, activity_stream):
if not activity_renderers.has_key(activity_type):
raise NotImplementedError, ("No activity renderer for activity "
"type '%s'" % str(activity_type))
- html.append(activity_renderers[activity_type](context, activity))
+ activity_html = activity_renderers[activity_type](context, activity)
+ html.append(activity_html)
return literal('\n'.join(html))
def user_activity_list_html(context, data_dict):
diff --git a/ckan/model/package_extra.py b/ckan/model/package_extra.py
index e0774a82b1a..fcdcbda6dad 100644
--- a/ckan/model/package_extra.py
+++ b/ckan/model/package_extra.py
@@ -28,6 +28,23 @@ class PackageExtra(vdm.sqlalchemy.RevisionedObjectMixin,
def related_packages(self):
return [self.package]
+ def activity_stream_detail(self, activity_id, activity_type):
+ import ckan.model as model
+ import ckan.model.activity as activity
+ import ckan.lib.dictization
+
+ # Handle 'deleted' extras.
+ # When the user marks an extra as deleted this comes through here as a
+ # 'changed' extra. We detect this and change it to a 'deleted'
+ # activity.
+ if activity_type == 'changed' and self.state == u'deleted':
+ activity_type = 'deleted'
+
+ data_dict = ckan.lib.dictization.table_dictize(self,
+ context={'model': model})
+ return activity.ActivityDetail(activity_id, self.id, u"PackageExtra",
+ activity_type, {'package_extra': data_dict})
+
mapper(PackageExtra, package_extra_table, properties={
'package': orm.relation(Package,
backref=orm.backref('_extras',
diff --git a/ckan/templates/activity_streams/changed_package_extra.html b/ckan/templates/activity_streams/changed_package_extra.html
new file mode 100644
index 00000000000..5f1fafe5e8c
--- /dev/null
+++ b/ckan/templates/activity_streams/changed_package_extra.html
@@ -0,0 +1,21 @@
+
+