Switch to side-by-side view

--- a/Allura/allura/model/stats.py
+++ b/Allura/allura/model/stats.py
@@ -1,4 +1,6 @@
 import logging
+from collections import defaultdict
+from datetime import datetime, time
 
 import ming
 
@@ -10,3 +12,38 @@
     class __mongometa__:
         session = main_doc_session
         name='stats'
+
+class CPA(ming.Document):
+    class __mongometa__:
+        session = main_doc_session
+        name='content_production_activities'
+        indexes = [
+            'type', 'class_name', 'project_id', 'project_shortname', 'app_config_id', 'when' ]
+
+    @classmethod
+    def post(cls, type, obj):
+        doc = cls.make(dict(
+                type=type,
+                class_name='%s.%s' % (
+                    obj.__class__.__module__,
+                    obj.__class__.__name__),
+                project_id=obj.app_config.project_id,
+                project_shortname=obj.app_config.project.shortname,
+                app_config_id=obj.app_config_id,
+                tool_name=obj.app_config.tool_name,
+                mount_point=obj.app_config.options.mount_point,
+                when=datetime.utcnow()))
+        doc.m.insert()
+
+    @classmethod
+    def stats(cls, since=None):
+        result = defaultdict(lambda:dict(create=0, modify=0, delete=0))
+        if since:
+            q = dict(when={'$gt':datetime.combine(since, time.min)})
+        else:
+            q = {}
+        for doc in cls.m.find(q).sort([('tool_name', 1), ('class_name', 1)]):
+            result[doc.tool_name, doc.class_name][doc.type] += 1
+        result = sorted(result.iteritems())
+        return [ dict(v, tool_name=k[0], class_name=k[1])
+                 for k,v in result]