diff --git a/organize/tracking/README.txt b/organize/tracking/README.txt
index 44ccc30..559f315 100644
--- a/organize/tracking/README.txt
+++ b/organize/tracking/README.txt
@@ -151,6 +151,16 @@ Overview (cumulative) statistics
>>> result['data']
[{'access': 2, 'new': 0, 'changed': 1, 'period': '...', 'count': 3}]
+
+Changes for a certain period (month)
+------------------------------------
+
+ >>> input = dict(period='2009-01', select='access')
+ >>> view = TrackingStats(statQuery, TestRequest(form=input))
+ >>> result = view.getData()
+ >>> result['data']
+ [...]
+
Recent changes
--------------
diff --git a/organize/tracking/report.pt b/organize/tracking/report.pt
index 2e0a7f0..51ab279 100644
--- a/organize/tracking/report.pt
+++ b/organize/tracking/report.pt
@@ -21,12 +21,18 @@
|
- |
- |
- |
+
+ |
+
+ |
+
+ |
|
@@ -34,7 +40,22 @@
+
+
+ Period ,
+
+
+ Back to overview
+
+
+
+
+
+
+
+
+
Title |
@@ -43,7 +64,8 @@
tal:condition="view/useVersioning">V
User |
Date/Time |
- New |
+ New |
@@ -68,6 +90,7 @@
tal:content="row/user/title" />
|
|
diff --git a/organize/tracking/report.py b/organize/tracking/report.py
index d0cbc18..4fef072 100644
--- a/organize/tracking/report.py
+++ b/organize/tracking/report.py
@@ -23,6 +23,7 @@ $Id$
"""
from datetime import date, datetime
+import time
from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError
@@ -65,13 +66,21 @@ class TrackingStats(BaseView):
def typeNames(self):
return self.options('types') or ['resource:*']
+ @Lazy
+ def accessContainer(self):
+ return self.loopsRoot.getRecordManager()['access']
+
+ @Lazy
+ def changesContainer(self):
+ return self.loopsRoot.getRecordManager()['changes']
+
@Lazy
def accessRecords(self):
- return self.filter(reversed(self.loopsRoot.getRecordManager()['access'].values()))
+ return self.filter(reversed(self.accessContainer.values()))
@Lazy
def changeRecords(self):
- return self.filter(reversed(self.loopsRoot.getRecordManager()['changes'].values()))
+ return self.filter(reversed(self.changesContainer.values()))
def filter(self, tracks):
for tr in tracks:
@@ -109,17 +118,19 @@ class TrackingStats(BaseView):
form = self.request.form
period = form.get('period')
uid = form.get('id')
- if period is not None:
- result = self.getPeriodDetails(period)
- macroName = 'period'
- elif uid is not None:
- result = self.getObjectDetails(uid)
+ select = form.get('select') or 'changes'
+ if uid is not None:
+ result = self.getObjectDetails(uid, period, select)
macroName = 'object'
+ elif period is not None:
+ result = self.getPeriodDetails(period, select)
+ macroName = 'period'
else:
result = self.getOverview()
macroName = 'overview'
macro = self.macros[macroName]
- return dict(data=result, macro=macro)
+ return dict(data=result, macro=macro,
+ showNewColumn=(select in ('changes', 'new')))
def getOverview(self):
""" Period-based (monthly) listing of the numbers of object accesses, new,
@@ -148,12 +159,30 @@ class TrackingStats(BaseView):
num = num - data['new']
return result
- def getPeriodDetails(period):
+ def getPeriodDetails(self, period, select='changes'):
""" Listing of accessed, new, changed, [deleted] objects during
the period given.
"""
+ parts = [int(x) for x in period.split('-')]
+ parts.append(1)
+ start = date(*parts)
+ if parts[1] == 12:
+ end = date(parts[0] + 1, 1, 1)
+ else:
+ end = date(parts[0], parts[1] + 1, 1)
+ start = int(time.mktime(start.timetuple()))
+ end = int(time.mktime(end.timetuple()))
+ if select in ('changes', 'new'):
+ data = reversed(list(self.filter(
+ self.changesContainer.query(timeFromTo=(start, end)))))
+ if select == 'new':
+ data = [tr for tr in data if tr.data['action'] == 'add']
+ if select == 'access':
+ data = reversed(list(self.filter(
+ self.accessContainer.query(timeFromTo=(start, end)))))
+ return [TrackDetails(self, tr) for tr in data]
- def getObjectDetails(uid, period=None):
+ def getObjectDetails(self, uid, period=None, select='changes'):
""" Listing of (last n?) accesses and changes of the object specified by
the uid given, optionally limited to the period (month) given.
"""
@@ -185,7 +214,8 @@ class RecentChanges(TrackingStats):
result.append(track)
continue
return dict(data=[TrackDetails(self, tr) for tr in result],
- macro=self.macros['recent_changes'])
+ macro=self.macros['recent_changes'],
+ showNewColumn=True)
class TrackDetails(BaseView):
@@ -207,6 +237,14 @@ class TrackDetails(BaseView):
self.view.lastMonth = self.month
return result
+ @Lazy
+ def day(self):
+ value = self.formatTimeStamp(self.track.timeStamp, 'date')
+ if value == self.view.lastDay:
+ return u''
+ self.view.lastDay = value
+ return value
+
@Lazy
def authentication(self):
return component.getUtility(IAuthentication)
@@ -258,11 +296,11 @@ class TrackDetails(BaseView):
#return format.formatDate(value, 'dateTime', self.timeStampFormat,
# self.view.languageInfo.language)
- def formatTimeStamp(self, ts):
+ def formatTimeStamp(self, ts, f='dateTime'):
if not ts:
return u''
value = datetime.fromtimestamp(ts)
- return format.formatDate(value, 'dateTime', self.timeStampFormat,
+ return format.formatDate(value, f, self.timeStampFormat,
self.view.languageInfo.language)
def __repr__(self):