--- 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]