- 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