- keep access trail (history) in session
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@4201 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									5202421654
								
							
						
					
					
						commit
						a1e7df5e57
					
				
					 3 changed files with 31 additions and 17 deletions
				
			
		|  | @ -6,6 +6,7 @@ $Id$ | ||||||
| 1.1 | 1.1 | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | - keep access trail (history) in session | ||||||
| - work items: provide "move" action for assigning a work item to | - work items: provide "move" action for assigning a work item to | ||||||
|   another task |   another task | ||||||
| - show work items (if present) for arbitrary concepts | - show work items (if present) for arbitrary concepts | ||||||
|  |  | ||||||
|  | @ -95,8 +95,8 @@ EndRequestEvent. | ||||||
|   >>> from loops.browser.node import NodeView |   >>> from loops.browser.node import NodeView | ||||||
|   >>> from loops.browser.resource import ResourceView |   >>> from loops.browser.resource import ResourceView | ||||||
|   >>> from loops import util |   >>> from loops import util | ||||||
|   >>> from zope.app.publication.interfaces import EndRequestEvent |  | ||||||
|   >>> from zope.publisher.browser import TestRequest |   >>> from zope.publisher.browser import TestRequest | ||||||
|  |   >>> from cybertools.browser.view import BodyRenderedEvent | ||||||
| 
 | 
 | ||||||
|   >>> loopsRoot.options = [logfile_option + ':test.log'] |   >>> loopsRoot.options = [logfile_option + ':test.log'] | ||||||
| 
 | 
 | ||||||
|  | @ -106,13 +106,13 @@ EndRequestEvent. | ||||||
|   ...                 node=util.getUidForObject(home), |   ...                 node=util.getUidForObject(home), | ||||||
|   ...                 target=util.getUidForObject(resources['d001.txt']), |   ...                 target=util.getUidForObject(resources['d001.txt']), | ||||||
|   ...       ) |   ...       ) | ||||||
|   >>> logAccess(EndRequestEvent(NodeView(home, request), request), testDir) |   >>> logAccess(BodyRenderedEvent(home, request), testDir) | ||||||
| 
 | 
 | ||||||
|   >>> record(request, principal='users.john', view='render', |   >>> record(request, principal='users.john', view='render', | ||||||
|   ...                 node=util.getUidForObject(home), |   ...                 node=util.getUidForObject(home), | ||||||
|   ...                 target=util.getUidForObject(resources['d002.txt']), |   ...                 target=util.getUidForObject(resources['d002.txt']), | ||||||
|   ...       ) |   ...       ) | ||||||
|   >>> logAccess(EndRequestEvent(NodeView(home, request), request), testDir) |   >>> logAccess(BodyRenderedEvent(home, request), testDir) | ||||||
| 
 | 
 | ||||||
| The access log can then be read in via an AccessRecordManager object, i.e. a view | The access log can then be read in via an AccessRecordManager object, i.e. a view | ||||||
| that may be called via ``wget`` using a crontab entry or some other kind | that may be called via ``wget`` using a crontab entry or some other kind | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2009 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2011 Helmut Merz helmutm@cy55.de | ||||||
| # | # | ||||||
| #  This program is free software; you can redistribute it and/or modify | #  This program is free software; you can redistribute it and/or modify | ||||||
| #  it under the terms of the GNU General Public License as published by | #  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -27,22 +27,27 @@ import os | ||||||
| import time | import time | ||||||
| 
 | 
 | ||||||
| import transaction | import transaction | ||||||
| from zope.app.publication.interfaces import IEndRequestEvent | from zope.app.session.interfaces import ISession | ||||||
| from zope.interface import Interface, implements |  | ||||||
| from zope.cachedescriptors.property import Lazy | from zope.cachedescriptors.property import Lazy | ||||||
|  | from zope import component | ||||||
| from zope.component import adapter | from zope.component import adapter | ||||||
|  | from zope.interface import Interface, implements | ||||||
| from zope.security.proxy import removeSecurityProxy | from zope.security.proxy import removeSecurityProxy | ||||||
| 
 | 
 | ||||||
|  | from cybertools.browser.view import IBodyRenderedEvent | ||||||
| from cybertools.meta.interfaces import IOptions | from cybertools.meta.interfaces import IOptions | ||||||
| from cybertools.tracking.btree import Track, getTimeStamp | from cybertools.tracking.btree import Track | ||||||
| from cybertools.tracking.interfaces import ITrack | from cybertools.tracking.interfaces import ITrack | ||||||
| from cybertools.tracking.logfile import Logger, loggers | from cybertools.tracking.logfile import Logger, loggers | ||||||
|  | from cybertools.util.date import getTimeStamp | ||||||
| from loops.interfaces import ILoopsObject | from loops.interfaces import ILoopsObject | ||||||
| from loops.organize.job.base import JobManager | from loops.organize.job.base import JobManager | ||||||
| from loops.organize.tracking.base import BaseRecordManager | from loops.organize.tracking.base import BaseRecordManager | ||||||
| from loops import util | from loops import util | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | packageId = 'loops.organize.tracking.access' | ||||||
|  | 
 | ||||||
| # logging | # logging | ||||||
| 
 | 
 | ||||||
| logfile_option = 'organize.tracking.logfile' | logfile_option = 'organize.tracking.logfile' | ||||||
|  | @ -52,29 +57,29 @@ fields = { | ||||||
|     '001': ('principal', 'node', 'target', 'view', 'params'), |     '001': ('principal', 'node', 'target', 'view', 'params'), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | version = '001' | ||||||
|  | 
 | ||||||
|  | accessTrailSize = 50 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def record(request, **kw): | def record(request, **kw): | ||||||
|     data = request.annotations.setdefault(request_key, {}) |     data = request.annotations.setdefault(request_key, {}) | ||||||
|     for k, v in kw.items(): |     for k, v in kw.items(): | ||||||
|         data[k] = v |         data[k] = v | ||||||
|     # ???: better to collect data in a list of dictionaries? |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @adapter(IEndRequestEvent) | 
 | ||||||
|  | @adapter(IBodyRenderedEvent) | ||||||
| def logAccess(event, baseDir=None): | def logAccess(event, baseDir=None): | ||||||
|     object = removeSecurityProxy(event.object) |     context = event.context | ||||||
|     context = getattr(object, 'context', None) |  | ||||||
|     if context is None: |  | ||||||
|         object = getattr(object, 'im_self', None) |  | ||||||
|         context = getattr(object, 'context', None) |  | ||||||
|         if context is None: |  | ||||||
|             return |  | ||||||
|     if not ILoopsObject.providedBy(context): |     if not ILoopsObject.providedBy(context): | ||||||
|         return |         return | ||||||
|     data = event.request.annotations.get(request_key) |     data = event.request.annotations.get(request_key) | ||||||
|     if not data: |     if not data: | ||||||
|         return |         return | ||||||
|     context = removeSecurityProxy(context) |     context = removeSecurityProxy(context) | ||||||
|  |     if 'principal' in data: | ||||||
|  |         storeAccessTrail(context, event.request, data) | ||||||
|     options = IOptions(context.getLoopsRoot()) |     options = IOptions(context.getLoopsRoot()) | ||||||
|     logfileOption = options(logfile_option) |     logfileOption = options(logfile_option) | ||||||
|     if not logfileOption: |     if not logfileOption: | ||||||
|  | @ -86,9 +91,17 @@ def logAccess(event, baseDir=None): | ||||||
|         logger = loggers[fn] = Logger(fn, path) |         logger = loggers[fn] = Logger(fn, path) | ||||||
|     logger.log(marshall(data)) |     logger.log(marshall(data)) | ||||||
| 
 | 
 | ||||||
|  | def storeAccessTrail(context, request, data): | ||||||
|  |     """ Keep records in Session for access history""" | ||||||
|  |     session = ISession(request)[packageId] | ||||||
|  |     item = session.setdefault('accessTrail', [])[:accessTrailSize] | ||||||
|  |     record = dict((key, data.get(key) or '') for key in fields[version]) | ||||||
|  |     record['timeStamp'] = getTimeStamp() | ||||||
|  |     record['version'] = version | ||||||
|  |     item.insert(0, record) | ||||||
|  |     session['accessTrail'] = item | ||||||
| 
 | 
 | ||||||
| def marshall(data): | def marshall(data): | ||||||
|     version = '001' |  | ||||||
|     values = [version] |     values = [version] | ||||||
|     for key in fields[version]: |     for key in fields[version]: | ||||||
|         values.append(data.get(key) or '') |         values.append(data.get(key) or '') | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm