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:
parent
1e5a79e8cd
commit
eb3a11db88
4 changed files with 51 additions and 11 deletions
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Add table
Reference in a new issue