- 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:
helmutm 2011-03-13 12:53:42 +00:00
parent 5202421654
commit a1e7df5e57
3 changed files with 31 additions and 17 deletions

View file

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

View file

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

View file

@ -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 '')