add doctests to access tracking

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2983 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-11-13 13:34:13 +00:00
parent 8b8ef4cbcc
commit a6559dfdf9
10 changed files with 86 additions and 21 deletions

6
external/README.txt vendored
View file

@ -17,7 +17,7 @@ Let's set up a loops site with basic and example concepts and resources.
>>> concepts, resources, views = t.setup()
>>> loopsRoot = site['loops']
>>> len(concepts), len(resources), len(views)
(30, 3, 0)
(30, 3, 1)
Importing loops Objects
@ -44,7 +44,7 @@ Creating the corresponding objects
>>> loader = Loader(loopsRoot)
>>> loader.load(elements)
>>> len(concepts), len(resources), len(views)
(31, 3, 0)
(31, 3, 1)
>>> from loops.common import adapted
>>> adMyquery = adapted(concepts['myquery'])
@ -138,7 +138,7 @@ Writing object information to the external storage
child(u'projects', u'customer', u'standard')...
resource(u'doc04.txt', u'Document 4', u'textdocument', contentType='text/restructured')...
resourceRelation(u'myquery', u'doc04.txt', u'standard')
node('home', u'Home', '', u'menu', body=u'Welcome')
node('home', u'Home', '', u'menu')
node('myquery', u'My Query', 'home', u'page', target=u'concepts/myquery')...
Writing sub-elements

View file

@ -66,7 +66,6 @@ class NodeLayoutInstance(LayoutInstance):
li = ILayoutInstance(n)
li.template = layout
result.append(li)
# if not result: get layouts from parent node(s)
return result
@Lazy

View file

@ -83,8 +83,7 @@ So we are now ready to query the favorites.
User interface
--------------
>>> from loops.view import Node
>>> home = views['home'] = Node()
>>> home = views['home']
>>> from loops.tests.auth import TestRequest
>>> from loops.organize.personal.browser.configurator import PortletConfigurator

View file

@ -74,10 +74,47 @@ Recording assignment changes
Tracking Object Access
======================
>>> from loops.organize.tracking.access import record
Access records are not directly stored in the ZODB (in order to avoid
conflict errors) but first stored to a log file.
>>> from loops.organize.tracking.access import logfile_option, record, logAccess
>>> from loops.organize.tracking.access import AccessRecordManager
>>> from loops.organize.tracking.tests import testDir
>>> from loops.browser.node import NodeView
>>> from loops.browser.resource import ResourceView
>>> from loops import util
>>> from zope.app.publication.interfaces import EndRequestEvent
>>> from zope.publisher.browser import TestRequest
>>> loopsRoot.options = [logfile_option + ':test.log']
>>> request = TestRequest()
>>> home = views['home']
>>> record(request, principal='users.john', view='render',
... node=util.getUidForObject(home),
... target=util.getUidForObject(resources['d001.txt']),
... )
>>> record(request, principal='users.john', view='render',
... node=util.getUidForObject(home),
... target=util.getUidForObject(resources['d002.txt']),
... )
>>> logAccess(EndRequestEvent(NodeView(home, request), request), testDir)
They 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
of job control.
>>> rm = AccessRecordManager(loopsRoot, TestRequest())
>>> rm.baseDir = testDir
>>> rm.loadRecordsFromLog()
Fin de partie
=============
>>> import os
>>> for fn in os.listdir(testDir):
... if '.log' in fn:
... os.unlink(os.path.join(testDir, fn))
>>> placefulTearDown()

View file

@ -59,7 +59,7 @@ def record(request, **kw):
@adapter(IEndRequestEvent)
def logAccess(event):
def logAccess(event, baseDir=None):
object = removeSecurityProxy(event.object)
context = getattr(object, 'context', None)
if context is None:
@ -79,7 +79,7 @@ def logAccess(event):
fn = logfileOption[0]
logger = loggers.get(fn)
if not logger:
path = os.path.join(util.getVarDirectory(), fn)
path = os.path.join(baseDir or util.getVarDirectory(), fn)
logger = loggers[fn] = Logger(fn, path)
logger.log(marshall(data))
@ -101,6 +101,7 @@ class AccessRecordManager(BaseRecordManager):
def __init__(self, context, request):
self.context = context
self.request = request
self.baseDir = util.getVarDirectory()
@Lazy
def logfile(self):
@ -115,7 +116,7 @@ class AccessRecordManager(BaseRecordManager):
if not self.valid:
return
fn = self.logfile
path = os.path.join(util.getVarDirectory(), fn)
path = os.path.join(self.baseDir, fn)
logger = loggers.get(fn)
if not logger:
logger = loggers[fn] = Logger(fn, path)

View file

@ -39,7 +39,10 @@ class ChangeView(TrackView):
@Lazy
def taskTitle(self):
return getattr(self.task, 'title', getName(self.task))
task = self.task
if task is None:
return self.metadata['taskId']
return getattr(task, 'title', getName(task))
@Lazy
def taskUrl(self):
@ -67,3 +70,8 @@ class ChangeView(TrackView):
user = self.user
if user is not None and not isinstance(user, basestring):
return '%s/@@introspector.html' % absoluteURL(user, self.request)
class AccessView(ChangeView):
pass

View file

@ -7,11 +7,27 @@
<zope:class class="loops.organize.tracking.change.ChangeRecord">
<require permission="zope.View"
interface="cybertools.tracking.interfaces.ITrack" />
interface="loops.organize.tracking.change.IChangeRecord" />
<require permission="zope.ManageContent"
set_schema="cybertools.tracking.interfaces.ITrack" />
set_schema="loops.organize.tracking.change.IChangeRecord" />
</zope:class>
<zope:class class="loops.organize.tracking.access.AccessRecord">
<require permission="zope.View"
interface="loops.organize.tracking.access.IAccessRecord" />
<require permission="zope.ManageContent"
set_schema="loops.organize.tracking.access.IAccessRecord" />
</zope:class>
<zope:subscriber handler="loops.organize.tracking.change.recordModification" />
<zope:subscriber handler="loops.organize.tracking.change.recordAdding" />
<zope:subscriber handler="loops.organize.tracking.change.recordAssignment" />
<zope:subscriber handler="loops.organize.tracking.change.recordDeassignment" />
<zope:subscriber handler="loops.organize.tracking.access.logAccess" />
<!-- views -->
<zope:adapter
for="loops.organize.tracking.change.IChangeRecord
zope.publisher.interfaces.browser.IBrowserRequest"
@ -19,12 +35,12 @@
factory="loops.organize.tracking.browser.ChangeView"
permission="zope.View" />
<zope:subscriber handler="loops.organize.tracking.change.recordModification" />
<zope:subscriber handler="loops.organize.tracking.change.recordAdding" />
<zope:subscriber handler="loops.organize.tracking.change.recordAssignment" />
<zope:subscriber handler="loops.organize.tracking.change.recordDeassignment" />
<zope:subscriber handler="loops.organize.tracking.access.logAccess" />
<zope:adapter
for="loops.organize.tracking.access.IAccessRecord
zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.interface.Interface"
factory="loops.organize.tracking.browser.AccessView"
permission="zope.View" />
<browser:page
name="load_access_records"

View file

@ -1,9 +1,13 @@
# $Id$
import os
import unittest, doctest
from zope.testing.doctestunit import DocFileSuite
testDir = os.path.join(os.path.dirname(__file__), 'testdata')
class Test(unittest.TestCase):
"Basic tests for the loops.organize.tracking package."

View file

@ -25,8 +25,7 @@ $Id$
from zope import interface, component, schema
from zope.app.authentication.interfaces import IPluggableAuthentication
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.security.interfaces import IAuthentication
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError
from loops.common import adapted
from loops.type import getOptionsDict

View file

@ -195,6 +195,8 @@ class TestSite(object):
d003 = addObject(resources, Resource, 'd003.txt',
title=u'Doc 003', resourceType=tTextDocument)
home = addObject(views, Node, 'home', title=u'Home', nodeType=u'menu')
self.indexAll(concepts, resources)
return concepts, resources, views