Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
Zope
Commits
86a623e5
Commit
86a623e5
authored
Aug 28, 2016
by
Hanno Schlichting
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Stop mixing in `Five.bbb.AcquisitionBBB` into browser components.
parent
cc059e24
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
66 additions
and
582 deletions
+66
-582
CHANGES.rst
CHANGES.rst
+2
-0
src/App/FactoryDispatcher.py
src/App/FactoryDispatcher.py
+1
-1
src/App/special_dtml.py
src/App/special_dtml.py
+2
-2
src/App/tests/test_ApplicationManager.py
src/App/tests/test_ApplicationManager.py
+2
-2
src/OFS/EtagSupport.py
src/OFS/EtagSupport.py
+3
-3
src/OFS/ObjectManager.py
src/OFS/ObjectManager.py
+2
-2
src/OFS/tests/testObjectManager.py
src/OFS/tests/testObjectManager.py
+5
-5
src/Products/Five/bbb.py
src/Products/Five/bbb.py
+0
-40
src/Products/Five/browser/__init__.py
src/Products/Five/browser/__init__.py
+4
-11
src/Products/Five/browser/pagetemplatefile.py
src/Products/Five/browser/pagetemplatefile.py
+2
-6
src/Products/Five/browser/resource.py
src/Products/Five/browser/resource.py
+1
-2
src/Products/Five/browser/tests/aqlegacy.py
src/Products/Five/browser/tests/aqlegacy.py
+0
-157
src/Products/Five/browser/tests/aqlegacy.zcml
src/Products/Five/browser/tests/aqlegacy.zcml
+0
-142
src/Products/Five/browser/tests/aqlegacy_ftest.txt
src/Products/Five/browser/tests/aqlegacy_ftest.txt
+0
-165
src/Products/Five/browser/tests/legacymanager.pt
src/Products/Five/browser/tests/legacymanager.pt
+0
-1
src/Products/Five/browser/tests/legacyprovider.pt
src/Products/Five/browser/tests/legacyprovider.pt
+0
-1
src/Products/Five/browser/tests/pages.txt
src/Products/Five/browser/tests/pages.txt
+3
-3
src/Products/Five/browser/tests/template_variables.pt
src/Products/Five/browser/tests/template_variables.pt
+6
-6
src/Products/Five/browser/tests/test_pages.py
src/Products/Five/browser/tests/test_pages.py
+0
-2
src/Products/Five/viewlet/manager.py
src/Products/Five/viewlet/manager.py
+1
-2
src/Products/Five/viewlet/viewlet.py
src/Products/Five/viewlet/viewlet.py
+2
-4
src/Products/PageTemplates/PageTemplate.py
src/Products/PageTemplates/PageTemplate.py
+2
-2
src/Shared/DC/Scripts/Bindings.py
src/Shared/DC/Scripts/Bindings.py
+2
-3
src/Testing/ZopeTestCase/testPortalTestCase.py
src/Testing/ZopeTestCase/testPortalTestCase.py
+11
-9
src/Testing/ZopeTestCase/testZopeTestCase.py
src/Testing/ZopeTestCase/testZopeTestCase.py
+7
-5
src/ZPublisher/BaseRequest.py
src/ZPublisher/BaseRequest.py
+4
-3
src/ZTUtils/SimpleTree.py
src/ZTUtils/SimpleTree.py
+3
-2
src/ZTUtils/Tree.py
src/ZTUtils/Tree.py
+1
-1
No files found.
CHANGES.rst
View file @
86a623e5
...
...
@@ -30,6 +30,8 @@ Features Added
Restructuring
+++++++++++++
- Stop mixing in `Five.bbb.AcquisitionBBB` into browser components.
- Integrate `five.pt` code directly into `Products.PageTemplates`.
- Move `Products.SiteAccess` into ZServer distribution.
...
...
src/App/FactoryDispatcher.py
View file @
86a623e5
...
...
@@ -90,7 +90,7 @@ class ProductDispatcher(Implicit):
FactoryDispatcher
)
product
=
Product
(
name
)
dispatcher
=
dispatcher_class
(
product
,
self
.
aq_parent
,
REQUEST
)
dispatcher
=
dispatcher_class
(
product
,
self
.
__parent__
,
REQUEST
)
return
dispatcher
.
__of__
(
self
)
...
...
src/App/special_dtml.py
View file @
86a623e5
...
...
@@ -24,7 +24,7 @@ from App.config import getConfiguration
import
Zope2
from
Shared.DC.Scripts.Bindings
import
Bindings
from
Acquisition
import
Explicit
,
aq_inner
,
aq_parent
from
Acquisition
import
Explicit
,
aq_inner
,
aq_parent
,
aq_acquire
from
DocumentTemplate.DT_String
import
_marker
,
DTReturn
,
render_blocks
from
DocumentTemplate.DT_Util
import
TemplateDict
,
InstanceDict
from
AccessControl
import
getSecurityManager
...
...
@@ -166,7 +166,7 @@ class DTMLFile(Bindings, Explicit, ClassicHTMLFile):
else
:
# We're first, so get the REQUEST.
try
:
req
=
self
.
aq_acquire
(
'REQUEST'
)
req
=
aq_acquire
(
self
,
'REQUEST'
)
if
hasattr
(
req
,
'taintWrapper'
):
req
=
req
.
taintWrapper
()
except
Exception
:
...
...
src/App/tests/test_ApplicationManager.py
View file @
86a623e5
...
...
@@ -127,7 +127,7 @@ class DatabaseChooserTests(ConfigTestBase, unittest.TestCase):
found
=
dc
[
'foo'
]
self
.
assertTrue
(
isinstance
(
found
,
AltDatabaseManager
))
self
.
assertEqual
(
found
.
id
,
'foo'
)
self
.
assertTrue
(
found
.
aq_parent
is
dc
)
self
.
assertTrue
(
found
.
__parent__
is
dc
)
conn
=
found
.
_p_jar
self
.
assertTrue
(
isinstance
(
conn
,
FakeConnection
))
self
.
assertTrue
(
conn
.
db
()
is
foo
)
...
...
@@ -150,7 +150,7 @@ class DatabaseChooserTests(ConfigTestBase, unittest.TestCase):
found
=
dc
.
__bobo_traverse__
(
None
,
'foo'
)
self
.
assertTrue
(
isinstance
(
found
,
AltDatabaseManager
))
self
.
assertEqual
(
found
.
id
,
'foo'
)
self
.
assertTrue
(
found
.
aq_parent
is
dc
)
self
.
assertTrue
(
found
.
__parent__
is
dc
)
conn
=
found
.
_p_jar
self
.
assertTrue
(
isinstance
(
conn
,
FakeConnection
))
self
.
assertTrue
(
conn
.
db
()
is
foo
)
...
...
src/OFS/EtagSupport.py
View file @
86a623e5
...
...
@@ -13,11 +13,11 @@
import
time
from
Acquisition
import
aq_acquire
from
zExceptions
import
HTTPPreconditionFailed
from
zope.interface
import
implements
from
zope.interface
import
Interface
from
zExceptions
import
HTTPPreconditionFailed
class
EtagBaseInterface
(
Interface
):
"""
\
...
...
@@ -108,7 +108,7 @@ class EtagSupport(object):
# Process if-match and if-none-match headers
if
REQUEST
is
None
:
REQUEST
=
self
.
aq_acquire
(
'REQUEST'
)
REQUEST
=
aq_acquire
(
self
,
'REQUEST'
)
matchlist
=
self
.
http__parseMatchList
(
REQUEST
,
'if-match'
)
nonematch
=
self
.
http__parseMatchList
(
REQUEST
,
'if-none-match'
)
...
...
src/OFS/ObjectManager.py
View file @
86a623e5
...
...
@@ -33,7 +33,7 @@ from AccessControl.Permissions import delete_objects
from
AccessControl.Permissions
import
ftp_access
from
AccessControl
import
getSecurityManager
from
AccessControl.ZopeSecurityPolicy
import
getRoles
from
Acquisition
import
aq_base
,
aq_parent
from
Acquisition
import
aq_base
,
aq_
acquire
,
aq_
parent
from
Acquisition
import
Implicit
from
App.Common
import
is_acquired
from
App.config
import
getConfiguration
...
...
@@ -770,7 +770,7 @@ class IFAwareObjectManager:
interfaces
=
self
.
_product_interfaces
elif
hasattr
(
self
,
'aq_acquire'
):
try
:
interfaces
=
self
.
aq_acquire
(
'_product_interfaces'
)
interfaces
=
aq_acquire
(
self
,
'_product_interfaces'
)
except
Exception
:
pass
...
...
src/OFS/tests/testObjectManager.py
View file @
86a623e5
...
...
@@ -6,7 +6,7 @@ from AccessControl.SecurityManagement import noSecurityManager
from
AccessControl.SecurityManager
import
setSecurityPolicy
from
AccessControl.SpecialUsers
import
emergency_user
,
nobody
,
system
from
AccessControl.User
import
User
# before SpecialUsers
from
Acquisition
import
Implicit
from
Acquisition
import
aq_self
,
Implicit
from
App.config
import
getConfiguration
from
logging
import
getLogger
from
zExceptions
import
BadRequest
...
...
@@ -444,8 +444,8 @@ class ObjectManagerTests(PlacelessSetup, unittest.TestCase):
si1
=
SimpleItem
(
'1'
)
om
[
'1'
]
=
si1
got
=
om
[
'1'
]
self
.
assertTrue
(
got
.
aq_self
is
si1
)
self
.
assertTrue
(
got
.
aq_parent
is
om
)
self
.
assertTrue
(
aq_self
(
got
)
is
si1
)
self
.
assertTrue
(
got
.
__parent__
is
om
)
def
test_get_miss_wo_default
(
self
):
om
=
self
.
_makeOne
()
...
...
@@ -465,8 +465,8 @@ class ObjectManagerTests(PlacelessSetup, unittest.TestCase):
si1
=
SimpleItem
(
'1'
)
om
[
'1'
]
=
si1
got
=
om
.
get
(
'1'
)
self
.
assertTrue
(
got
.
aq_self
is
si1
)
self
.
assertTrue
(
got
.
aq_parent
is
om
)
self
.
assertTrue
(
aq_self
(
got
)
is
si1
)
self
.
assertTrue
(
got
.
__parent__
is
om
)
def
test_items
(
self
):
om
=
self
.
_makeOne
()
...
...
src/Products/Five/bbb.py
deleted
100644 → 0
View file @
cc059e24
##############################################################################
#
# Copyright (c) 2006 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Things needed for backward compatibility
"""
import
Acquisition
class
AcquisitionBBB
(
object
):
"""Emulate a class implementing Acquisition.interfaces.IAcquirer and
IAcquisitionWrapper.
"""
def
__of__
(
self
,
context
):
# Technically this isn't in line with the way Acquisition's
# __of__ works. With Acquisition, you get a wrapper around
# the original object and only that wrapper's parent is the
# new context.
return
self
aq_self
=
aq_inner
=
aq_base
=
property
(
lambda
self
:
self
)
aq_chain
=
property
(
Acquisition
.
aq_chain
)
aq_parent
=
property
(
Acquisition
.
aq_parent
)
def
aq_acquire
(
self
,
*
args
,
**
kw
):
return
Acquisition
.
aq_acquire
(
self
,
*
args
,
**
kw
)
def
aq_inContextOf
(
self
,
*
args
,
**
kw
):
return
Acquisition
.
aq_inContextOf
(
self
,
*
args
,
**
kw
)
src/Products/Five/browser/__init__.py
View file @
86a623e5
...
...
@@ -14,13 +14,10 @@
"""Provide basic browser functionality
"""
import
Acquisition
import
zope.publisher.browser
from
zope.publisher
import
browser
from
Products.Five.bbb
import
AcquisitionBBB
class
BrowserView
(
zope
.
publisher
.
browser
.
BrowserView
,
AcquisitionBBB
):
class
BrowserView
(
browser
.
BrowserView
):
# Use an explicit __init__ to work around problems with magically inserted
# super classes when using BrowserView as a base for viewlets.
...
...
@@ -28,14 +25,10 @@ class BrowserView(zope.publisher.browser.BrowserView, AcquisitionBBB):
self
.
context
=
context
self
.
request
=
request
# Classes which are still based on Acquisition and access
# self.context in a method need to call aq_inner on it, or get a
# funky aq_chain. We do this here for BBB friendly purposes.
def
__getParent
(
self
):
return
getattr
(
self
,
'_parent'
,
Acquisition
.
aq_inner
(
self
.
context
)
)
return
getattr
(
self
,
'_parent'
,
self
.
context
)
def
__setParent
(
self
,
parent
):
self
.
_parent
=
parent
aq_parent
=
__parent__
=
property
(
__getParent
,
__setParent
)
__parent__
=
property
(
__getParent
,
__setParent
)
src/Products/Five/browser/pagetemplatefile.py
View file @
86a623e5
...
...
@@ -24,8 +24,6 @@ from AccessControl import getSecurityManager
from
Products.PageTemplates.Expressions
import
SecureModuleImporter
from
Products.PageTemplates.Expressions
import
createTrustedZopeEngine
from
Products.Five.bbb
import
AcquisitionBBB
_engine
=
createTrustedZopeEngine
()
...
...
@@ -107,12 +105,10 @@ class ViewMapper(object):
return
getMultiAdapter
((
self
.
ob
,
self
.
request
),
name
=
name
)
# When a view's template is accessed e.g. as template.view, a
# BoundPageTemplate object is returned. For BBB reasons, it needs to
# support the aq_* methods and attributes known from Acquisition. For
# that it also needs to be locatable through __parent__.
# BoundPageTemplate object is returned.
class
BoundPageTemplate
(
AcquisitionBBB
):
class
BoundPageTemplate
(
object
):
def
__init__
(
self
,
pt
,
ob
):
object
.
__setattr__
(
self
,
'im_func'
,
pt
)
object
.
__setattr__
(
self
,
'im_self'
,
ob
)
...
...
src/Products/Five/browser/resource.py
View file @
86a623e5
...
...
@@ -26,7 +26,6 @@ from zope.publisher.interfaces import NotFound
from
zope.publisher.interfaces.browser
import
IBrowserPublisher
from
zope.ptresource.ptresource
import
PageTemplate
from
Acquisition
import
aq_base
from
Products.Five.browser
import
BrowserView
...
...
@@ -175,7 +174,7 @@ class DirectoryResource(Resource,
# We need to propagate security so that restrictedTraverse() will
# work
if
hasattr
(
aq_base
(
self
)
,
'__roles__'
):
if
hasattr
(
self
,
'__roles__'
):
resource
.
__roles__
=
self
.
__roles__
return
resource
...
...
src/Products/Five/browser/tests/aqlegacy.py
deleted
100644 → 0
View file @
cc059e24
##############################################################################
#
# Copyright (c) 2007 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Legacy browser view tests.
Here we nake sure that legacy implementations of views (e.g. those
which mix-in one of the Acquisition base classes without knowing
better) still work.
"""
import
Acquisition
import
OFS.SimpleItem
from
zope.interface
import
implements
from
zope.traversing.interfaces
import
ITraversable
from
zope.contentprovider.interfaces
import
IContentProvider
from
Products.Five
import
BrowserView
from
Products.Five.browser.pagetemplatefile
import
ViewPageTemplateFile
class
LegacyAttributes
(
BrowserView
):
"""Make sure that those old aq_* attributes on Five BrowserViews
still work, in particular aq_chain, even though BrowserView may
not be an Acquisition-decendant class anymore...
"""
def
__call__
(
self
):
return
repr
([
obj
for
obj
in
self
.
aq_chain
])
class
ExplicitLegacyAttributes
(
Acquisition
.
Explicit
):
"""Make sure that those old aq_* attributes work on browser views
that only inherit from Explicit as well."""
def
__call__
(
self
):
return
repr
([
obj
for
obj
in
self
.
aq_chain
])
class
LegacyTemplate
(
BrowserView
):
template
=
ViewPageTemplateFile
(
'falcon.pt'
)
def
__call__
(
self
):
return
self
.
template
()
class
LegacyTemplateTwo
(
BrowserView
):
def
__init__
(
self
,
context
,
request
):
self
.
__parent__
=
context
self
.
context
=
context
self
.
request
=
request
self
.
template
=
ViewPageTemplateFile
(
'falcon.pt'
)
def
__call__
(
self
):
return
self
.
template
()
class
Explicit
(
Acquisition
.
Explicit
):
def
render
(
self
):
return
'Explicit'
class
ExplicitWithTemplate
(
Acquisition
.
Explicit
):
template
=
ViewPageTemplateFile
(
'falcon.pt'
)
class
Implicit
(
Acquisition
.
Implicit
):
index_html
=
None
# we don't want to acquire this!
def
render
(
self
):
return
'Implicit'
class
ImplicitWithTemplate
(
Acquisition
.
Implicit
):
template
=
ViewPageTemplateFile
(
'falcon.pt'
)
class
ExplicitContentProvider
(
Acquisition
.
Explicit
):
implements
(
IContentProvider
)
def
__init__
(
self
,
context
,
request
,
view
):
self
.
context
=
context
self
.
request
=
request
self
.
view
=
view
# A content provider must set __parent__ to view or context.
self
.
__parent__
=
context
def
update
(
self
):
pass
def
render
(
self
):
return
'Content provider inheriting from Explicit'
class
ExplicitViewlet
(
Acquisition
.
Explicit
):
def
__init__
(
self
,
context
,
request
,
view
,
manager
):
self
.
context
=
context
self
.
request
=
request
def
update
(
self
):
# Make sure that the viewlet has the legacy attributes and
# they point to the right objects.
assert
self
.
aq_parent
==
self
.
context
assert
self
.
aq_base
==
self
def
render
(
self
):
return
'Viewlet inheriting from Explicit'
class
BrowserViewViewlet
(
BrowserView
):
def
__init__
(
self
,
context
,
request
,
view
,
manager
):
# This is the tricky bit. super(...).__init__ wouldn't
# necessarily have to resolve to BrowserView.__init__ because
# <browser:viewlet /> generates classes on the fly with a
# mix-in base class...
super
(
BrowserViewViewlet
,
self
).
__init__
(
context
,
request
)
self
.
view
=
view
self
.
manager
=
manager
def
update
(
self
):
pass
def
render
(
self
):
return
'BrowserView viewlet'
class
LegacyNamespace
(
object
):
implements
(
ITraversable
)
def
__init__
(
self
,
context
,
request
):
self
.
context
=
context
self
.
request
=
request
def
traverse
(
self
,
name
,
ignored
):
return
LegacyNamespaceObject
(
name
)
class
LegacyNamespaceObject
(
OFS
.
SimpleItem
.
SimpleItem
):
def
__init__
(
self
,
name
):
self
.
id
=
name
src/Products/Five/browser/tests/aqlegacy.zcml
deleted
100644 → 0
View file @
cc059e24
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">
<browser:page
for="*"
name="attributes"
class=".aqlegacy.LegacyAttributes"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicitattributes"
class=".aqlegacy.ExplicitLegacyAttributes"
permission="zope.Public"
/>
<browser:page
for="*"
name="template"
class=".aqlegacy.LegacyTemplate"
permission="zope.Public"
/>
<browser:page
for="*"
name="template_two"
class=".aqlegacy.LegacyTemplateTwo"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit"
class=".aqlegacy.Explicit"
attribute="render"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit_zcmltemplate"
class=".aqlegacy.Explicit"
template="falcon.pt"
permission="zope.Public"
/>
<browser:page
for="*"
name="explicit_template"
class=".aqlegacy.ExplicitWithTemplate"
attribute="template"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit"
class=".aqlegacy.Implicit"
attribute="render"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit_template"
class=".aqlegacy.ImplicitWithTemplate"
attribute="template"
permission="zope.Public"
/>
<browser:page
for="*"
name="implicit_zcmltemplate"
class=".aqlegacy.Implicit"
template="falcon.pt"
permission="zope.Public"
/>
<!-- Content providers and viewlets -->
<adapter
for="* * *"
provides="zope.contentprovider.interfaces.IContentProvider"
factory=".aqlegacy.ExplicitContentProvider"
name="aqlegacyprovider"
/>
<browser:page
for="*"
name="aqlegacyprovider"
template="legacyprovider.pt"
permission="zope.Public"
/>
<browser:viewletManager
name="aqlegacymanager"
permission="zope.Public"
/>
<browser:viewlet
for="*"
class=".aqlegacy.ExplicitViewlet"
name="explicit"
permission="zope.Public"
/>
<browser:viewlet
for="*"
class=".aqlegacy.BrowserViewViewlet"
name="browserview"
permission="zope.Public"
/>
<browser:page
for="*"
name="aqlegacymanager"
template="legacymanager.pt"
permission="zope.Public"
/>
<!-- Namespace traversal -->
<adapter
for="*"
factory=".aqlegacy.LegacyNamespace"
name="aqlegacy"
/>
<adapter
for="* *"
factory=".aqlegacy.LegacyNamespace"
name="aqlegacy"
/>
<browser:page
for=".aqlegacy.LegacyNamespaceObject"
name="index.html"
template="falcon.pt"
permission="zope.Public"
/>
</configure>
\ No newline at end of file
src/Products/Five/browser/tests/aqlegacy_ftest.txt
deleted
100644 → 0
View file @
cc059e24
Testing legacy browser views
============================
This test tests publishing aspects of browser pages. Let's register
some:
>>> import Products.Five.browser.tests
>>> from Zope2.App import zcml
>>> zcml.load_config("configure.zcml", Products.Five)
>>> zcml.load_config('aqlegacy.zcml', package=Products.Five.browser.tests)
>>> from Testing.testbrowser import Browser
>>> browser = Browser()
>>> browser.handleErrors = False
Acquisition API legacy on BrowserView
-------------------------------------
Let's make sure that accessing those old aq_* properties on browser
views still works (the printed output is the aq_chain of the view):
>>> browser.open('http://localhost/test_folder_1_/attributes')
>>> print browser.contents
[<Products.Five.browser.metaconfigure.LegacyAttributes object at ...>,
<Folder at /test_folder_1_>,
<Application at >,
<ZPublisher.BaseRequest.RequestContainer object at ...>]
The same goes for browser views that just mix in Acquisition.Explicit:
>>> browser.open('http://localhost/test_folder_1_/explicitattributes')
>>> print browser.contents
[<Products.Five.browser.metaconfigure.ExplicitLegacyAttributes object at ...>,
<Folder at /test_folder_1_>,
<Application at >,
<ZPublisher.BaseRequest.RequestContainer object at ...>]
Let's do some more manual tests with the view object. But first we
must get it:
>>> from zope.component import getMultiAdapter
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> view = getMultiAdapter((self.folder, request), name='attributes')
Let's check for the various aq_* attributes:
>>> view.aq_parent == self.folder
True
>>> view.aq_inner == view
True
>>> view.aq_base == view
True
>>> view.aq_self == view
True
Views also still support the __of__ protocol, at least pro forma:
>>> view == view.__of__(self.app)
True
Mixing in Acquisition.{Ex|Im}plicit
-----------------------------------
Let's make sure that mixing in Acquisition.Explicit or Implicit won't
mess up your views (even though you should never have done it in the
first place...):
>>> browser.open('http://localhost/test_folder_1_/explicit')
>>> print browser.contents
Explicit
>>> browser.open('http://localhost/test_folder_1_/explicit_zcmltemplate')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/explicit_template')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/implicit')
>>> print browser.contents
Implicit
>>> browser.open('http://localhost/test_folder_1_/implicit_template')
>>> print browser.contents
<p>The falcon has taken flight</p>
>>> browser.open('http://localhost/test_folder_1_/implicit_zcmltemplate')
>>> print browser.contents
<p>The falcon has taken flight</p>
Testing legacy content providers and viewlets
=============================================
>>> browser.open('http://localhost/test_folder_1_/aqlegacyprovider')
>>> print browser.contents
<p>Content provider inheriting from Explicit</p>
>>> browser.open('http://localhost/test_folder_1_/aqlegacymanager')
>>> print browser.contents
<p>BrowserView viewlet
Viewlet inheriting from Explicit</p>
Testing namespace traversal
===========================
Namespace traversal can turn up objects during traversal without
attribute access. That means they might not be wrapped by default.
Here we make sure that they are wrapped and that things like the
request can be acquired.
First let's try ``restrictedTraverse()``:
>>> foo = self.folder.restrictedTraverse('++aqlegacy++foo')
>>> import Acquisition
>>> Acquisition.aq_acquire(foo, 'REQUEST')
<HTTPRequest, URL=http://nohost>
Now let's try URL traversal:
>>> browser.open('http://localhost/test_folder_1_/++aqlegacy++foo/index.html')
>>> print browser.contents
<p>The falcon has taken flight</p>
Testing keyword arguments
=========================
ViewPageTemplateFile's take arbitrary keyword arguments:
>>> view = getMultiAdapter((self.folder, request), name='template')
>>> template = view.template
>>> print template(foo=1, bar=2)
<p>The falcon has taken flight</p>
Passing in an argument called instance was supported by the old Five version
of ViewPageTemplateFile, so we still need to support it.
>>> print template(instance='allowed')
<p>The falcon has taken flight</p>
No arguments required
=====================
ViewPageTemplateFile's require no arguments, but you can only use them as
class variables:
>>> view = getMultiAdapter((self.folder, request), name='template_two')
>>> print view()
Traceback (most recent call last):
...
TypeError: __call__() takes at least 2 arguments (1 given)
Clean up
--------
>>> from zope.component.testing import tearDown
>>> tearDown()
src/Products/Five/browser/tests/legacymanager.pt
deleted
100644 → 0
View file @
cc059e24
<p tal:content="provider:aqlegacymanager" />
src/Products/Five/browser/tests/legacyprovider.pt
deleted
100644 → 0
View file @
cc059e24
<p tal:content="provider:aqlegacyprovider" />
src/Products/Five/browser/tests/pages.txt
View file @
86a623e5
...
...
@@ -150,7 +150,7 @@ Make sure that global template variables in ZPT pages are correct:
>>> print view()
View is a view: True
Context is testoid: True
Context.
aq_parent
is test_folder_1_: True
Context.
__parent__
is test_folder_1_: True
Container is context: True
Here is context: True
Nothing is None: True
...
...
@@ -260,7 +260,7 @@ The parent of the view is the view's context:
The direct parent of the context is
>>>
context.aq_inner.aq_parent
>>>
aq_inner(context).__parent__
<Folder at /test_folder_1_>
C methods work the same
...
...
@@ -285,7 +285,7 @@ The same applies to a view registered with <browser:view /> instead of
True
>>> aq_parent(view) == view.context
True
>>>
context.aq_inner.aq_parent
>>>
aq_inner(context).__parent__
<Folder at /test_folder_1_>
>>> aq_parent(aq_inner(context))
<Folder at /test_folder_1_>
...
...
src/Products/Five/browser/tests/template_variables.pt
View file @
86a623e5
View is a view: <tal:block
content="python:hasattr(view,'context') and hasattr(view, 'request')" />
Context is testoid: <tal:block content="python:context.id == 'testoid'" />
Context.
aq_parent is test_folder_1_: <tal:block
content="python:context.
aq_parent
.id =='test_folder_1_'" />
Context.
__parent__ is test_folder_1_: <tal:block
content="python:context.
__parent__
.id =='test_folder_1_'" />
Container is context: <tal:block content="python:container is context" />
Here is context: <tal:block content="python:here is context"/>
Nothing is None: <tal:block content="python:nothing is None"/>
Default works: <tal:block replace="non_existent_var|default" />True
Root is the application: <tal:block
Root is the application: <tal:block
replace="python:repr(root).find('Application') != -1" />
Template is a template: <tal:block
Template is a template: <tal:block
replace="python:'ViewPageTemplateFile' in repr(template)" />
Traverse_subpath exists and is empty: <tal:block
Traverse_subpath exists and is empty: <tal:block
replace="python:traverse_subpath == []" />
Request is a request: <tal:block
Request is a request: <tal:block
replace="python:getattr(request, 'RESPONSE', None) is not None" />
User is manager: <tal:block replace="python:str(user) == 'manager'" />
Options exist: <tal:block replace="python:options is not None" />
...
...
src/Products/Five/browser/tests/test_pages.py
View file @
86a623e5
...
...
@@ -74,6 +74,4 @@ def test_suite():
ZopeDocFileSuite
(
'pages.txt'
,
package
=
'Products.Five.browser.tests'
),
FunctionalDocFileSuite
(
'pages_ftest.txt'
,
package
=
'Products.Five.browser.tests'
),
FunctionalDocFileSuite
(
'aqlegacy_ftest.txt'
,
package
=
'Products.Five.browser.tests'
),
))
src/Products/Five/viewlet/manager.py
View file @
86a623e5
...
...
@@ -14,7 +14,6 @@
"""Viewlet manager.
"""
from
Acquisition
import
aq_base
from
AccessControl.ZopeGuards
import
guarded_hasattr
import
zope.interface
import
zope.security
...
...
@@ -76,7 +75,7 @@ class ViewletManagerBase(origManagerBase):
# but it allows the tests to have deterministic results.
def
_key
(
info
):
return
aq_base
(
info
[
1
])
return
info
[
1
]
return
sorted
(
viewlets
,
key
=
_key
)
...
...
src/Products/Five/viewlet/viewlet.py
View file @
86a623e5
...
...
@@ -16,16 +16,14 @@
import
os
import
zope.viewlet.viewlet
from
Products.Five.bbb
import
AcquisitionBBB
from
Products.Five.browser.pagetemplatefile
import
ViewPageTemplateFile
class
ViewletBase
(
zope
.
viewlet
.
viewlet
.
ViewletBase
,
AcquisitionBBB
):
class
ViewletBase
(
zope
.
viewlet
.
viewlet
.
ViewletBase
):
pass
class
SimpleAttributeViewlet
(
zope
.
viewlet
.
viewlet
.
SimpleAttributeViewlet
,
AcquisitionBBB
):
class
SimpleAttributeViewlet
(
zope
.
viewlet
.
viewlet
.
SimpleAttributeViewlet
):
pass
...
...
src/Products/PageTemplates/PageTemplate.py
View file @
86a623e5
...
...
@@ -15,7 +15,7 @@
import
sys
from
Acquisition
import
aq_base
from
Acquisition
import
aq_base
,
aq_inner
,
aq_parent
import
ExtensionClass
import
zope.pagetemplate.pagetemplate
from
zope.pagetemplate.pagetemplate
import
PTRuntimeError
...
...
@@ -41,7 +41,7 @@ class PageTemplate(ExtensionClass.Base,
if
parent
is
not
None
:
c
[
'here'
]
=
parent
c
[
'context'
]
=
parent
c
[
'container'
]
=
self
.
aq_inner
.
aq_parent
c
[
'container'
]
=
aq_parent
(
aq_inner
(
self
))
while
parent
is
not
None
:
self
=
parent
parent
=
getattr
(
self
,
'__parent__'
,
None
)
...
...
src/Shared/DC/Scripts/Bindings.py
View file @
86a623e5
...
...
@@ -23,8 +23,7 @@ from AccessControl.Permissions import view_management_screens
from
AccessControl.PermissionRole
import
_what_not_even_god_should_do
from
AccessControl.unauthorized
import
Unauthorized
from
AccessControl.ZopeGuards
import
guarded_getattr
from
Acquisition
import
aq_parent
from
Acquisition
import
aq_inner
from
Acquisition
import
aq_base
,
aq_inner
,
aq_parent
defaultBindings
=
{
'name_context'
:
'context'
,
'name_container'
:
'container'
,
...
...
@@ -238,7 +237,7 @@ class Bindings:
path
=
request
[
'TraversalRequestNameStack'
]
names
=
self
.
getBindingAssignments
()
if
(
not
names
.
isNameAssigned
(
'name_subpath'
)
or
(
path
and
hasattr
(
self
.
aq_base
,
path
[
-
1
]))):
(
path
and
hasattr
(
aq_base
(
self
)
,
path
[
-
1
]))):
return
subpath
=
path
[:]
path
[:]
=
[]
...
...
src/Testing/ZopeTestCase/testPortalTestCase.py
View file @
86a623e5
...
...
@@ -22,7 +22,7 @@ way of getting started.
from
Testing
import
ZopeTestCase
from
Acquisition
import
aq_base
from
Acquisition
import
aq_base
,
aq_inner
from
AccessControl
import
getSecurityManager
from
OFS.SimpleItem
import
SimpleItem
from
OFS.Folder
import
Folder
...
...
@@ -61,11 +61,11 @@ class DummyMembershipTool(SimpleItem):
def
createMemberarea
(
self
,
member_id
):
self
.
_called
.
append
(
'createMemberarea'
)
portal
=
self
.
aq_inner
.
aq_parent
portal
=
aq_inner
(
self
).
__parent__
portal
.
Members
.
manage_addFolder
(
member_id
)
def
getHomeFolder
(
self
,
member_id
):
portal
=
self
.
aq_inner
.
aq_parent
portal
=
aq_inner
(
self
).
__parent__
return
getattr
(
portal
.
Members
,
member_id
)
...
...
@@ -73,7 +73,7 @@ class NewMembershipTool(DummyMembershipTool):
def
createMemberArea
(
self
,
member_id
):
self
.
_called
.
append
(
'createMemberArea'
)
portal
=
self
.
aq_inner
.
aq_parent
portal
=
aq_inner
(
self
).
__parent__
portal
.
Members
.
manage_addFolder
(
member_id
)
...
...
@@ -434,8 +434,9 @@ class TestPlainUserFolder(ZopeTestCase.PortalTestCase):
self
.
assertEqual
(
user
.
getId
(),
user_name
)
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertTrue
(
user
.
__class__
.
__name__
,
'User'
)
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'UserFolder'
)
self
.
assertTrue
(
user
.
aq_parent
.
aq_parent
.
__class__
.
__name__
,
'Folder'
)
self
.
assertTrue
(
user
.
__parent__
.
__class__
.
__name__
,
'UserFolder'
)
self
.
assertTrue
(
user
.
__parent__
.
__parent__
.
__class__
.
__name__
,
'Folder'
)
class
TestWrappingUserFolder
(
ZopeTestCase
.
PortalTestCase
):
...
...
@@ -453,7 +454,7 @@ class TestWrappingUserFolder(ZopeTestCase.PortalTestCase):
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertFalse
(
user
is
aq_base
(
user
))
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'WrappingUserFolder'
)
user
.
__parent__
.
__class__
.
__name__
,
'WrappingUserFolder'
)
def
testLoggedInUserIsWrapped
(
self
):
user
=
getSecurityManager
().
getUser
()
...
...
@@ -461,8 +462,9 @@ class TestWrappingUserFolder(ZopeTestCase.PortalTestCase):
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertTrue
(
user
.
__class__
.
__name__
,
'User'
)
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'WrappingUserFolder'
)
self
.
assertTrue
(
user
.
aq_parent
.
aq_parent
.
__class__
.
__name__
,
'Folder'
)
user
.
__parent__
.
__class__
.
__name__
,
'WrappingUserFolder'
)
self
.
assertTrue
(
user
.
__parent__
.
__parent__
.
__class__
.
__name__
,
'Folder'
)
# Because we override setUp we need to test again
...
...
src/Testing/ZopeTestCase/testZopeTestCase.py
View file @
86a623e5
...
...
@@ -364,8 +364,9 @@ class TestPlainUserFolder(ZopeTestCase.ZopeTestCase):
self
.
assertEqual
(
user
.
getId
(),
user_name
)
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertTrue
(
user
.
__class__
.
__name__
,
'User'
)
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'UserFolder'
)
self
.
assertTrue
(
user
.
aq_parent
.
aq_parent
.
__class__
.
__name__
,
'Folder'
)
self
.
assertTrue
(
user
.
__parent__
.
__class__
.
__name__
,
'UserFolder'
)
self
.
assertTrue
(
user
.
__parent__
.
__parent__
.
__class__
.
__name__
,
'Folder'
)
class
TestWrappingUserFolder
(
ZopeTestCase
.
ZopeTestCase
):
...
...
@@ -379,7 +380,7 @@ class TestWrappingUserFolder(ZopeTestCase.ZopeTestCase):
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertFalse
(
user
is
aq_base
(
user
))
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'WrappingUserFolder'
)
user
.
__parent__
.
__class__
.
__name__
,
'WrappingUserFolder'
)
def
testLoggedInUserIsWrapped
(
self
):
user
=
getSecurityManager
().
getUser
()
...
...
@@ -387,8 +388,9 @@ class TestWrappingUserFolder(ZopeTestCase.ZopeTestCase):
self
.
assertTrue
(
hasattr
(
user
,
'aq_base'
))
self
.
assertTrue
(
user
.
__class__
.
__name__
,
'User'
)
self
.
assertTrue
(
user
.
aq_parent
.
__class__
.
__name__
,
'WrappingUserFolder'
)
self
.
assertTrue
(
user
.
aq_parent
.
aq_parent
.
__class__
.
__name__
,
'Folder'
)
user
.
__parent__
.
__class__
.
__name__
,
'WrappingUserFolder'
)
self
.
assertTrue
(
user
.
__parent__
.
__parent__
.
__class__
.
__name__
,
'Folder'
)
def
test_suite
():
...
...
src/ZPublisher/BaseRequest.py
View file @
86a623e5
...
...
@@ -18,7 +18,7 @@ import types
import
xmlrpc
from
AccessControl.ZopeSecurityPolicy
import
getRoles
from
Acquisition
import
aq_base
from
Acquisition
import
aq_base
,
aq_inner
from
Acquisition.interfaces
import
IAcquirer
from
ExtensionClass
import
Base
from
zExceptions
import
Forbidden
...
...
@@ -469,7 +469,8 @@ class BaseRequest:
hasattr
(
object
,
'aq_base'
)
and
not
hasattr
(
object
,
'__bobo_traverse__'
)):
if
object
.
aq_parent
is
not
object
.
aq_inner
.
aq_parent
:
if
(
object
.
__parent__
is
not
aq_inner
(
object
).
__parent__
):
object
=
NullResource
(
parents
[
-
2
],
object
.
getId
(),
self
).
__of__
(
parents
[
-
2
])
...
...
@@ -556,7 +557,7 @@ class BaseRequest:
if
(
no_acquire_flag
and
hasattr
(
parents
[
1
],
'aq_base'
)
and
not
hasattr
(
parents
[
1
],
'__bobo_traverse__'
)):
base
=
parents
[
1
].
aq_base
base
=
aq_base
(
parents
[
1
])
if
not
hasattr
(
base
,
entry_name
):
try
:
if
entry_name
not
in
base
:
...
...
src/ZTUtils/SimpleTree.py
View file @
86a623e5
...
...
@@ -13,6 +13,7 @@
"""Simple Tree classes
"""
from
Acquisition
import
aq_acquire
from
Tree
import
TreeMaker
,
TreeNode
,
b2a
...
...
@@ -23,13 +24,13 @@ class SimpleTreeNode(TreeNode):
if
self
.
state
<
0
:
setst
=
'expand'
exnum
=
self
.
aq_parent
.
expansion_number
exnum
=
self
.
__parent__
.
expansion_number
else
:
setst
=
'collapse'
exnum
=
self
.
expansion_number
obid
=
self
.
id
pre
=
self
.
aq_acquire
(
'tree_pre'
)
pre
=
aq_acquire
(
self
,
'tree_pre'
)
return
{
'link'
:
'?%s-setstate=%s,%s,%s#%s'
%
(
pre
,
setst
[
0
],
exnum
,
obid
,
obid
),
...
...
src/ZTUtils/Tree.py
View file @
86a623e5
...
...
@@ -53,7 +53,7 @@ class TreeNode(Explicit):
child
.
__of__
(
self
).
walk
(
f
,
data
)
def
_depth
(
self
):
return
self
.
aq_parent
.
depth
+
1
return
self
.
__parent__
.
depth
+
1
depth
=
ComputedAttribute
(
_depth
,
1
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment