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:
parent
8b8ef4cbcc
commit
a6559dfdf9
10 changed files with 86 additions and 21 deletions
6
external/README.txt
vendored
6
external/README.txt
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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."
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue