make size of recent changes report configurable; take title from query concept
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3045 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
f0c04d5b36
commit
185deb40f5
4 changed files with 23 additions and 9 deletions
|
@ -136,9 +136,15 @@ Tracking Reports
|
||||||
Overview (cumulative) statistics
|
Overview (cumulative) statistics
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
>>> from loops.organize.tracking.report import TrackingStats
|
>>> from loops.expert.concept import IQueryConcept
|
||||||
|
>>> tQuery = concepts['query'] = addAndConfigureObject(concepts, Concept,
|
||||||
|
... 'query', conceptType=concepts.getTypeConcept(),
|
||||||
|
... typeInterface=IQueryConcept)
|
||||||
|
>>> statQuery = addAndConfigureObject(concepts, Concept, 'stats',
|
||||||
|
... conceptType=tQuery)
|
||||||
|
|
||||||
>>> view = TrackingStats(home, TestRequest())
|
>>> from loops.organize.tracking.report import TrackingStats
|
||||||
|
>>> view = TrackingStats(statQuery, TestRequest())
|
||||||
>>> result = view.getData()
|
>>> result = view.getData()
|
||||||
>>> result['macro'][4][1][u'define-macro']
|
>>> result['macro'][4][1][u'define-macro']
|
||||||
u'overview'
|
u'overview'
|
||||||
|
@ -149,7 +155,7 @@ Recent changes
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
>>> from loops.organize.tracking.report import RecentChanges
|
>>> from loops.organize.tracking.report import RecentChanges
|
||||||
>>> view = RecentChanges(home, TestRequest())
|
>>> view = RecentChanges(statQuery, TestRequest())
|
||||||
>>> result = view.getData()
|
>>> result = view.getData()
|
||||||
>>> result['macro'][4][1][u'define-macro']
|
>>> result['macro'][4][1][u'define-macro']
|
||||||
u'recent_changes'
|
u'recent_changes'
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<metal:report define-macro="report"
|
<metal:report define-macro="report"
|
||||||
tal:define="info item/getData">
|
tal:define="info item/getData">
|
||||||
<h2 i18n:translate=""
|
<metal:title use-macro="item/conceptMacros/concepttitle" />
|
||||||
tal:content="item/title|default">Statistics Report</h2><br />
|
<br />
|
||||||
<metal:listing use-macro="info/macro" />
|
<metal:listing use-macro="info/macro" />
|
||||||
</metal:report>
|
</metal:report>
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ from zope.cachedescriptors.property import Lazy
|
||||||
from zope.traversing.browser import absoluteURL
|
from zope.traversing.browser import absoluteURL
|
||||||
from zope.traversing.api import getName
|
from zope.traversing.api import getName
|
||||||
|
|
||||||
|
from cybertools.meta.interfaces import IOptions
|
||||||
from cybertools.util import format
|
from cybertools.util import format
|
||||||
from loops.browser.common import BaseView
|
from loops.browser.common import BaseView
|
||||||
from loops.interfaces import IResource
|
from loops.interfaces import IResource
|
||||||
|
@ -53,6 +54,10 @@ class TrackingStats(BaseView):
|
||||||
def macros(self):
|
def macros(self):
|
||||||
return self.template.macros
|
return self.template.macros
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def options(self):
|
||||||
|
return IOptions(self.adapted)
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def accessRecords(self):
|
def accessRecords(self):
|
||||||
return self.filter(reversed(self.loopsRoot.getRecordManager()['access'].values()))
|
return self.filter(reversed(self.loopsRoot.getRecordManager()['access'].values()))
|
||||||
|
@ -128,11 +133,15 @@ class RecentChanges(TrackingStats):
|
||||||
title = _(u'Recent Changes')
|
title = _(u'Recent Changes')
|
||||||
|
|
||||||
def getData(self):
|
def getData(self):
|
||||||
length = int(self.request.form.get('length', 15))
|
sizeOption = self.options('size')
|
||||||
|
size = int(self.request.form.get('size') or
|
||||||
|
(sizeOption and sizeOption[0]) or 15)
|
||||||
new = {}
|
new = {}
|
||||||
changed = {}
|
changed = {}
|
||||||
result = []
|
result = []
|
||||||
for track in self.changeRecords:
|
for track in self.changeRecords:
|
||||||
|
if len(result) >= size:
|
||||||
|
break
|
||||||
if track.data['action'] == 'add' and track.taskId not in new:
|
if track.data['action'] == 'add' and track.taskId not in new:
|
||||||
sameChanged = changed.get(track.taskId)
|
sameChanged = changed.get(track.taskId)
|
||||||
if sameChanged and sameChanged.timeStamp < track.timeStamp + 60:
|
if sameChanged and sameChanged.timeStamp < track.timeStamp + 60:
|
||||||
|
@ -146,8 +155,6 @@ class RecentChanges(TrackingStats):
|
||||||
changed[track.taskId] = track
|
changed[track.taskId] = track
|
||||||
result.append(track)
|
result.append(track)
|
||||||
continue
|
continue
|
||||||
if len(result) > length:
|
|
||||||
break
|
|
||||||
return dict(data=[TrackDetails(self, tr) for tr in result],
|
return dict(data=[TrackDetails(self, tr) for tr in result],
|
||||||
macro=self.macros['recent_changes'])
|
macro=self.macros['recent_changes'])
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ from loops.browser.node import ViewPropertiesConfigurator
|
||||||
from loops.common import NameChooser
|
from loops.common import NameChooser
|
||||||
from loops.concept import Concept
|
from loops.concept import Concept
|
||||||
from loops.concept import IndexAttributes as ConceptIndexAttributes
|
from loops.concept import IndexAttributes as ConceptIndexAttributes
|
||||||
from loops.config.base import GlobalOptions, LoopsOptions
|
from loops.config.base import GlobalOptions, LoopsOptions, QueryOptions
|
||||||
from loops.interfaces import ILoopsObject, IIndexAttributes
|
from loops.interfaces import ILoopsObject, IIndexAttributes
|
||||||
from loops.interfaces import IDocument, IFile, ITextDocument
|
from loops.interfaces import IDocument, IFile, ITextDocument
|
||||||
from loops.layout.base import LayoutNode
|
from loops.layout.base import LayoutNode
|
||||||
|
@ -129,6 +129,7 @@ class TestSite(object):
|
||||||
component.provideHandler(revokeAcquiredSecurity)
|
component.provideHandler(revokeAcquiredSecurity)
|
||||||
component.provideAdapter(BaseSecuritySetter)
|
component.provideAdapter(BaseSecuritySetter)
|
||||||
component.provideAdapter(LoopsOptions)
|
component.provideAdapter(LoopsOptions)
|
||||||
|
component.provideAdapter(QueryOptions)
|
||||||
component.provideUtility(GlobalOptions())
|
component.provideUtility(GlobalOptions())
|
||||||
|
|
||||||
component.provideAdapter(Instance)
|
component.provideAdapter(Instance)
|
||||||
|
|
Loading…
Add table
Reference in a new issue