extend recent changes query: include concepts, add types option

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3058 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-12-11 15:48:50 +00:00
parent 1e5a79e8cd
commit eb3a11db88
4 changed files with 51 additions and 11 deletions

View file

@ -304,14 +304,13 @@ class BaseView(GenericView, I18NView):
@Lazy @Lazy
def longTypeTitle(self): def longTypeTitle(self):
t = self.typeTitle ct = getattr(self.context, 'contentType', None)
ct = getattr(self.context, 'contentType')
if ct: if ct:
ext = mimetypes.extensions.get(ct) ext = mimetypes.extensions.get(ct)
if ext: if ext:
#return '%s (%s)' % (t, ext.upper()) #return '%s (%s)' % (t, ext.upper())
return ext.upper() return ext.upper()
return t return self.typeTitle
@Lazy @Lazy
def typeUrl(self): def typeUrl(self):
@ -584,8 +583,8 @@ class BaseView(GenericView, I18NView):
'dojo.require("dijit.form.SimpleTextarea"); ' 'dojo.require("dijit.form.SimpleTextarea"); '
'dojo.require("dijit.form.FilteringSelect"); ' 'dojo.require("dijit.form.FilteringSelect"); '
#'dojo.require("dijit.layout.TabContainer"); ' #'dojo.require("dijit.layout.TabContainer"); '
'dojo.require("dojox.grid.DataGrid"); ' #'dojo.require("dojox.grid.DataGrid"); '
'dojo.require("dojo.data.ItemFileWriteStore"); ' #'dojo.require("dojo.data.ItemFileWriteStore"); '
'dojo.require("dojox.data.QueryReadStore"); ') 'dojo.require("dojox.data.QueryReadStore"); ')
cm.register('js-execute', 'dojo.form.all', jsCall=jsCall) cm.register('js-execute', 'dojo.form.all', jsCall=jsCall)
cm.register('css', identifier='dojox.grid.css', position=0, cm.register('css', identifier='dojox.grid.css', position=0,

View file

@ -167,8 +167,8 @@ Recent changes
>>> data[0].timeStamp >>> data[0].timeStamp
u'... ...:...' u'... ...:...'
>>> data[0].objectData >>> data[0].objectData
{'url': '', 'version': '', 'object': <loops.resource.Resource ...>, {'url': '', 'version': '', 'type': u'Text',
'title': 'Change Doc 001'} 'object': <loops.resource.Resource ...>, 'title': 'Change Doc 001'}
>>> data[0].user >>> data[0].user
{'url': '', 'object': <loops.concept.Concept ...>, 'title': u'john'} {'url': '', 'object': <loops.concept.Concept ...>, 'title': u'john'}
>>> data[0].action >>> data[0].action

View file

@ -1,3 +1,6 @@
<!-- $Id$ -->
<metal:report define-macro="report" <metal:report define-macro="report"
tal:define="info item/getData"> tal:define="info item/getData">
<metal:title use-macro="item/conceptMacros/concepttitle" /> <metal:title use-macro="item/conceptMacros/concepttitle" />
@ -35,6 +38,7 @@
<table class="listing"> <table class="listing">
<tr> <tr>
<th i18n:translate="">Title</th> <th i18n:translate="">Title</th>
<th i18n:translate="">Type</th>
<th i18n:translate="" <th i18n:translate=""
tal:condition="view/useVersioning">V</th> tal:condition="view/useVersioning">V</th>
<th i18n:translate="">User</th> <th i18n:translate="">User</th>
@ -49,6 +53,7 @@
<a tal:omit-tag="not:url" <a tal:omit-tag="not:url"
tal:attributes="href string:$url?version=this" tal:attributes="href string:$url?version=this"
tal:content="object/title" /></td> tal:content="object/title" /></td>
<td tal:content="object/type"></td>
<tal:version tal:condition="view/useVersioning"> <tal:version tal:condition="view/useVersioning">
<td class="center" <td class="center"
tal:define="version object/version"> tal:define="version object/version">

View file

@ -27,13 +27,14 @@ from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.app.security.interfaces import IAuthentication, PrincipalLookupError
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.interface.interface import InterfaceClass
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.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 IConcept, IResource
from loops import util from loops import util
from loops.util import _ from loops.util import _
from loops.versioning.interfaces import IVersionable from loops.versioning.interfaces import IVersionable
@ -46,6 +47,8 @@ class TrackingStats(BaseView):
template = report_macros template = report_macros
typeMapping = {'resource:*': IResource, 'concept:*': IConcept}
@Lazy @Lazy
def macro(self): def macro(self):
return self.macros['report'] return self.macros['report']
@ -58,6 +61,10 @@ class TrackingStats(BaseView):
def options(self): def options(self):
return IOptions(self.adapted) return IOptions(self.adapted)
@Lazy
def typeNames(self):
return self.options('types') or ['resource:*']
@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()))
@ -69,11 +76,35 @@ class TrackingStats(BaseView):
def filter(self, tracks): def filter(self, tracks):
for tr in tracks: for tr in tracks:
try: try:
if IResource.providedBy(util.getObjectForUid(tr.taskId)): if self.checkType(util.getObjectForUid(tr.taskId)):
yield tr yield tr
except KeyError: except KeyError:
pass pass
@Lazy
def typeObjects(self):
result = []
for tn in self.typeNames:
ifc = self.typeMapping.get(tn)
if ifc is None:
tp = self.conceptManager.get(tn)
if tp is not None:
result.append(tp)
else:
result.append(ifc)
return result
def checkType(self, obj):
if not IResource.providedBy(obj) and not IConcept.providedBy(obj):
return False
for t in self.typeObjects:
if isinstance(t, InterfaceClass):
if t.providedBy(obj):
return True
elif obj.getType() == t:
return True
return False
def getData(self): def getData(self):
form = self.request.form form = self.request.form
period = form.get('period') period = form.get('period')
@ -157,7 +188,7 @@ class RecentChanges(TrackingStats):
macro=self.macros['recent_changes']) macro=self.macros['recent_changes'])
class TrackDetails(object): class TrackDetails(BaseView):
timeStampFormat = 'short' timeStampFormat = 'short'
@ -173,6 +204,10 @@ class TrackDetails(object):
def object(self): def object(self):
return util.getObjectForUid(self.track.taskId) return util.getObjectForUid(self.track.taskId)
@Lazy
def context(self):
return self.object
@Lazy @Lazy
def objectData(self): def objectData(self):
obj = self.object obj = self.object
@ -180,7 +215,8 @@ class TrackDetails(object):
url = node is not None and node.getUrlForTarget(obj) or '' url = node is not None and node.getUrlForTarget(obj) or ''
versionable = IVersionable(self.object, None) versionable = IVersionable(self.object, None)
version = versionable is not None and versionable.versionId or '' version = versionable is not None and versionable.versionId or ''
return dict(object=obj, title=obj.title, url=url, version=version) return dict(object=obj, title=obj.title,
type=self.longTypeTitle, url=url, version=version)
@Lazy @Lazy
def user(self): def user(self):