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