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()
|
>>> concepts, resources, views = t.setup()
|
||||||
>>> loopsRoot = site['loops']
|
>>> loopsRoot = site['loops']
|
||||||
>>> len(concepts), len(resources), len(views)
|
>>> len(concepts), len(resources), len(views)
|
||||||
(30, 3, 0)
|
(30, 3, 1)
|
||||||
|
|
||||||
|
|
||||||
Importing loops Objects
|
Importing loops Objects
|
||||||
|
@ -44,7 +44,7 @@ Creating the corresponding objects
|
||||||
>>> loader = Loader(loopsRoot)
|
>>> loader = Loader(loopsRoot)
|
||||||
>>> loader.load(elements)
|
>>> loader.load(elements)
|
||||||
>>> len(concepts), len(resources), len(views)
|
>>> len(concepts), len(resources), len(views)
|
||||||
(31, 3, 0)
|
(31, 3, 1)
|
||||||
|
|
||||||
>>> from loops.common import adapted
|
>>> from loops.common import adapted
|
||||||
>>> adMyquery = adapted(concepts['myquery'])
|
>>> adMyquery = adapted(concepts['myquery'])
|
||||||
|
@ -138,7 +138,7 @@ Writing object information to the external storage
|
||||||
child(u'projects', u'customer', u'standard')...
|
child(u'projects', u'customer', u'standard')...
|
||||||
resource(u'doc04.txt', u'Document 4', u'textdocument', contentType='text/restructured')...
|
resource(u'doc04.txt', u'Document 4', u'textdocument', contentType='text/restructured')...
|
||||||
resourceRelation(u'myquery', u'doc04.txt', u'standard')
|
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')...
|
node('myquery', u'My Query', 'home', u'page', target=u'concepts/myquery')...
|
||||||
|
|
||||||
Writing sub-elements
|
Writing sub-elements
|
||||||
|
|
|
@ -66,7 +66,6 @@ class NodeLayoutInstance(LayoutInstance):
|
||||||
li = ILayoutInstance(n)
|
li = ILayoutInstance(n)
|
||||||
li.template = layout
|
li.template = layout
|
||||||
result.append(li)
|
result.append(li)
|
||||||
# if not result: get layouts from parent node(s)
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
|
|
@ -83,8 +83,7 @@ So we are now ready to query the favorites.
|
||||||
User interface
|
User interface
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
>>> from loops.view import Node
|
>>> home = views['home']
|
||||||
>>> home = views['home'] = Node()
|
|
||||||
>>> from loops.tests.auth import TestRequest
|
>>> from loops.tests.auth import TestRequest
|
||||||
>>> from loops.organize.personal.browser.configurator import PortletConfigurator
|
>>> from loops.organize.personal.browser.configurator import PortletConfigurator
|
||||||
|
|
||||||
|
|
|
@ -74,10 +74,47 @@ Recording assignment changes
|
||||||
Tracking Object Access
|
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
|
Fin de partie
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
>>> import os
|
||||||
|
>>> for fn in os.listdir(testDir):
|
||||||
|
... if '.log' in fn:
|
||||||
|
... os.unlink(os.path.join(testDir, fn))
|
||||||
>>> placefulTearDown()
|
>>> placefulTearDown()
|
||||||
|
|
|
@ -59,7 +59,7 @@ def record(request, **kw):
|
||||||
|
|
||||||
|
|
||||||
@adapter(IEndRequestEvent)
|
@adapter(IEndRequestEvent)
|
||||||
def logAccess(event):
|
def logAccess(event, baseDir=None):
|
||||||
object = removeSecurityProxy(event.object)
|
object = removeSecurityProxy(event.object)
|
||||||
context = getattr(object, 'context', None)
|
context = getattr(object, 'context', None)
|
||||||
if context is None:
|
if context is None:
|
||||||
|
@ -79,7 +79,7 @@ def logAccess(event):
|
||||||
fn = logfileOption[0]
|
fn = logfileOption[0]
|
||||||
logger = loggers.get(fn)
|
logger = loggers.get(fn)
|
||||||
if not logger:
|
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 = loggers[fn] = Logger(fn, path)
|
||||||
logger.log(marshall(data))
|
logger.log(marshall(data))
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ class AccessRecordManager(BaseRecordManager):
|
||||||
def __init__(self, context, request):
|
def __init__(self, context, request):
|
||||||
self.context = context
|
self.context = context
|
||||||
self.request = request
|
self.request = request
|
||||||
|
self.baseDir = util.getVarDirectory()
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def logfile(self):
|
def logfile(self):
|
||||||
|
@ -115,7 +116,7 @@ class AccessRecordManager(BaseRecordManager):
|
||||||
if not self.valid:
|
if not self.valid:
|
||||||
return
|
return
|
||||||
fn = self.logfile
|
fn = self.logfile
|
||||||
path = os.path.join(util.getVarDirectory(), fn)
|
path = os.path.join(self.baseDir, fn)
|
||||||
logger = loggers.get(fn)
|
logger = loggers.get(fn)
|
||||||
if not logger:
|
if not logger:
|
||||||
logger = loggers[fn] = Logger(fn, path)
|
logger = loggers[fn] = Logger(fn, path)
|
||||||
|
|
|
@ -39,7 +39,10 @@ class ChangeView(TrackView):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def taskTitle(self):
|
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
|
@Lazy
|
||||||
def taskUrl(self):
|
def taskUrl(self):
|
||||||
|
@ -67,3 +70,8 @@ class ChangeView(TrackView):
|
||||||
user = self.user
|
user = self.user
|
||||||
if user is not None and not isinstance(user, basestring):
|
if user is not None and not isinstance(user, basestring):
|
||||||
return '%s/@@introspector.html' % absoluteURL(user, self.request)
|
return '%s/@@introspector.html' % absoluteURL(user, self.request)
|
||||||
|
|
||||||
|
|
||||||
|
class AccessView(ChangeView):
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
|
@ -7,11 +7,27 @@
|
||||||
|
|
||||||
<zope:class class="loops.organize.tracking.change.ChangeRecord">
|
<zope:class class="loops.organize.tracking.change.ChangeRecord">
|
||||||
<require permission="zope.View"
|
<require permission="zope.View"
|
||||||
interface="cybertools.tracking.interfaces.ITrack" />
|
interface="loops.organize.tracking.change.IChangeRecord" />
|
||||||
<require permission="zope.ManageContent"
|
<require permission="zope.ManageContent"
|
||||||
set_schema="cybertools.tracking.interfaces.ITrack" />
|
set_schema="loops.organize.tracking.change.IChangeRecord" />
|
||||||
</zope:class>
|
</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
|
<zope:adapter
|
||||||
for="loops.organize.tracking.change.IChangeRecord
|
for="loops.organize.tracking.change.IChangeRecord
|
||||||
zope.publisher.interfaces.browser.IBrowserRequest"
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
|
@ -19,12 +35,12 @@
|
||||||
factory="loops.organize.tracking.browser.ChangeView"
|
factory="loops.organize.tracking.browser.ChangeView"
|
||||||
permission="zope.View" />
|
permission="zope.View" />
|
||||||
|
|
||||||
<zope:subscriber handler="loops.organize.tracking.change.recordModification" />
|
<zope:adapter
|
||||||
<zope:subscriber handler="loops.organize.tracking.change.recordAdding" />
|
for="loops.organize.tracking.access.IAccessRecord
|
||||||
<zope:subscriber handler="loops.organize.tracking.change.recordAssignment" />
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
<zope:subscriber handler="loops.organize.tracking.change.recordDeassignment" />
|
provides="zope.interface.Interface"
|
||||||
|
factory="loops.organize.tracking.browser.AccessView"
|
||||||
<zope:subscriber handler="loops.organize.tracking.access.logAccess" />
|
permission="zope.View" />
|
||||||
|
|
||||||
<browser:page
|
<browser:page
|
||||||
name="load_access_records"
|
name="load_access_records"
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
|
import os
|
||||||
import unittest, doctest
|
import unittest, doctest
|
||||||
from zope.testing.doctestunit import DocFileSuite
|
from zope.testing.doctestunit import DocFileSuite
|
||||||
|
|
||||||
|
|
||||||
|
testDir = os.path.join(os.path.dirname(__file__), 'testdata')
|
||||||
|
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
"Basic tests for the loops.organize.tracking package."
|
"Basic tests for the loops.organize.tracking package."
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,7 @@ $Id$
|
||||||
from zope import interface, component, schema
|
from zope import interface, component, schema
|
||||||
from zope.app.authentication.interfaces import IPluggableAuthentication
|
from zope.app.authentication.interfaces import IPluggableAuthentication
|
||||||
from zope.app.authentication.interfaces import IAuthenticatorPlugin
|
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.common import adapted
|
||||||
from loops.type import getOptionsDict
|
from loops.type import getOptionsDict
|
||||||
|
|
||||||
|
|
|
@ -195,6 +195,8 @@ class TestSite(object):
|
||||||
d003 = addObject(resources, Resource, 'd003.txt',
|
d003 = addObject(resources, Resource, 'd003.txt',
|
||||||
title=u'Doc 003', resourceType=tTextDocument)
|
title=u'Doc 003', resourceType=tTextDocument)
|
||||||
|
|
||||||
|
home = addObject(views, Node, 'home', title=u'Home', nodeType=u'menu')
|
||||||
|
|
||||||
self.indexAll(concepts, resources)
|
self.indexAll(concepts, resources)
|
||||||
return concepts, resources, views
|
return concepts, resources, views
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue