Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Zope: Dev

Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests.

 

 

Zope dev RSS feed   Index | Next | Previous | View Threaded


jim at zope

Jun 20, 2009, 10:10 AM

Post #1 of 9 (893 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests.

Why? traverseName is part of zope.app.publication's implementation.
Now it's oddly split off in a very separate package. This makes
customizing publication behavior more difficult. I recently made
proxying overridable and missed traverseName.

This should be moved back to zope.app.publication. The only other
thing that uses this is zope.app.publsher.browser.menu. That can and
should get to these methods via request.publication.

Or, better yet, traverseRelativeURL and traversePath should be moved
to the browser module and should get traverseName from
request.publication.

I'll go ahead and do this.

Jim


On May 22, 2009, at 8:35 PM, Shane Hathaway wrote:

> Log message for revision 100262:
> Moved the publicationtraverse module from zope.app.publication and
> added tests.
>
>
> Changed:
> A zope.traversing/trunk/src/zope/traversing/publicationtraverse.py
> A zope.traversing/trunk/src/zope/traversing/tests/
> test_publicationtraverse.py
>
> -=-
> Added: zope.traversing/trunk/src/zope/traversing/
> publicationtraverse.py
> ===================================================================
> --- zope.traversing/trunk/src/zope/traversing/
> publicationtraverse.py (rev 0)
> +++ zope.traversing/trunk/src/zope/traversing/publicationtraverse.py
> 2009-05-23 00:35:46 UTC (rev 100262)
> @@ -0,0 +1,129 @@
> +
> ##############################################################################
> +#
> +# Copyright (c) 2001, 2002 Zope Corporation 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.
> +#
> +
> ##############################################################################
> +"""Publication Traverser
> +
> +$Id: publicationtraverse.py 67630 2006-04-27 00:54:03Z jim $
> +"""
> +__docformat__ = 'restructuredtext'
> +from types import StringTypes
> +
> +from zope.component import queryMultiAdapter
> +from zope.publisher.interfaces import NotFound
> +from zope.security.checker import ProxyFactory
> +from zope.traversing.namespace import namespaceLookup
> +from zope.traversing.namespace import nsParse
> +from zope.traversing.interfaces import TraversalError
> +from zope.publisher.interfaces import IPublishTraverse
> +from zope.publisher.interfaces.browser import IBrowserPublisher
> +
> +class DuplicateNamespaces(Exception):
> + """More than one namespace was specified in a request"""
> +
> +class UnknownNamespace(Exception):
> + """A parameter specified an unknown namespace"""
> +
> +class PublicationTraverser(object):
> + """Traversal used for publication.
> +
> + The significant differences from
> + zope.traversing.adapters.traversePathElement() are:
> +
> + - Instead of adapting each traversed object to ITraversable, this
> + version multi-adapts (ob, request) to IPublishTraverse.
> +
> + - This version wraps a security proxy around each traversed
> object.
> +
> + - This version raises NotFound rather than LocationError.
> +
> + - This version has a method, traverseRelativeURL(), that
> + supports "browserDefault" traversal.
> + """
> +
> + def traverseName(self, request, ob, name):
> + nm = name # the name to look up the object with
> +
> + if name and name[:1] in '@+':
> + # Process URI segment parameters.
> + ns, nm = nsParse(name)
> + if ns:
> + try:
> + ob2 = namespaceLookup(ns, nm, ob, request)
> + except TraversalError:
> + raise NotFound(ob, name)
> +
> + return ProxyFactory(ob2)
> +
> + if nm == '.':
> + return ob
> +
> + if IPublishTraverse.providedBy(ob):
> + ob2 = ob.publishTraverse(request, nm)
> + else:
> + # self is marker
> + adapter = queryMultiAdapter((ob, request),
> IPublishTraverse,
> + default=self)
> + if adapter is not self:
> + ob2 = adapter.publishTraverse(request, nm)
> + else:
> + raise NotFound(ob, name, request)
> +
> + return ProxyFactory(ob2)
> +
> + def traversePath(self, request, ob, path):
> +
> + if isinstance(path, StringTypes):
> + path = path.split('/')
> + if len(path) > 1 and not path[-1]:
> + # Remove trailing slash
> + path.pop()
> + else:
> + path = list(path)
> +
> + # Remove single dots
> + path = [x for x in path if x != '.']
> +
> + path.reverse()
> +
> + # Remove double dots
> + while '..' in path:
> + l = path.index('..')
> + if l < 0 or l+2 > len(path):
> + break
> + del path[l:l+2]
> +
> + pop = path.pop
> +
> + while path:
> + name = pop()
> + ob = self.traverseName(request, ob, name)
> +
> + return ob
> +
> + def traverseRelativeURL(self, request, ob, path):
> + """Path traversal that includes browserDefault paths"""
> + ob = self.traversePath(request, ob, path)
> +
> + while True:
> + adapter = IBrowserPublisher(ob, None)
> + if adapter is None:
> + return ob
> + ob, path = adapter.browserDefault(request)
> + ob = ProxyFactory(ob)
> + if not path:
> + return ob
> +
> + ob = self.traversePath(request, ob, path)
> +
> +# alternate spelling
> +PublicationTraverse = PublicationTraverser
>
> Added: zope.traversing/trunk/src/zope/traversing/tests/
> test_publicationtraverse.py
> ===================================================================
> --- zope.traversing/trunk/src/zope/traversing/tests/
> test_publicationtraverse.py (rev 0)
> +++ zope.traversing/trunk/src/zope/traversing/tests/
> test_publicationtraverse.py 2009-05-23 00:35:46 UTC (rev 100262)
> @@ -0,0 +1,183 @@
> +
> ##############################################################################
> +#
> +# Copyright (c) 2003 Zope Corporation 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.
> +#
> +
> ##############################################################################
> +"""Tests of PublicationTraverser
> +
> +$Id: test_vh.py 82003 2007-11-28 08:49:12Z jukart $
> +"""
> +from unittest import TestCase, main, makeSuite
> +from zope.testing.cleanup import CleanUp
> +from zope.component import provideAdapter
> +from zope.interface import Interface, implements
> +from zope.publisher.browser import TestRequest
> +from zope.publisher.interfaces import IPublishTraverse
> +from zope.publisher.interfaces import NotFound
> +from zope.publisher.interfaces.browser import IBrowserPublisher
> +from zope.security.proxy import removeSecurityProxy
> +from zope.traversing.interfaces import ITraversable
> +
> +class TestPublicationTraverser(CleanUp, TestCase):
> +
> + def testViewNotFound(self):
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + self.assertRaises(NotFound, t.traverseName, request, ob,
> '@@foo')
> +
> + def testViewFound(self):
> + provideAdapter(DummyViewTraverser, (Interface, Interface),
> + ITraversable, name='view')
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + proxy = t.traverseName(request, ob, '@@foo')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'foo')
> +
> + def testDot(self):
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + self.assertEqual(ob, t.traverseName(request, ob, '.'))
> +
> + def testNameNotFound(self):
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + self.assertRaises(NotFound, t.traverseName, request, ob,
> 'foo')
> +
> + def testNameFound(self):
> + provideAdapter(DummyPublishTraverse, (Interface, Interface),
> + IPublishTraverse)
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + proxy = t.traverseName(request, ob, 'foo')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'foo')
> +
> + def testDirectTraversal(self):
> + request = TestRequest()
> + ob = DummyPublishTraverse(Content(), request)
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + proxy = t.traverseName(request, ob, 'foo')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'foo')
> +
> + def testPathNotFound(self):
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + self.assertRaises(NotFound, t.traversePath, request, ob,
> 'foo/bar')
> +
> + def testPathFound(self):
> + provideAdapter(DummyPublishTraverse, (Interface, Interface),
> + IPublishTraverse)
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + proxy = t.traversePath(request, ob, 'foo/bar')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'bar')
> +
> + def testComplexPath(self):
> + provideAdapter(DummyPublishTraverse, (Interface, Interface),
> + IPublishTraverse)
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + proxy = t.traversePath(request, ob, 'foo/../alpha//beta/./
> bar')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'bar')
> +
> + def testTraverseRelativeURL(self):
> + provideAdapter(DummyPublishTraverse, (Interface, Interface),
> + IPublishTraverse)
> + provideAdapter(DummyBrowserPublisher, (Interface,),
> + IBrowserPublisher)
> + ob = Content()
> + from zope.traversing.publicationtraverse import
> PublicationTraverser
> + t = PublicationTraverser()
> + request = TestRequest()
> + proxy = t.traverseRelativeURL(request, ob, 'foo/bar')
> + view = removeSecurityProxy(proxy)
> + self.assertTrue(proxy is not view)
> + self.assertEqual(view.__class__, View)
> + self.assertEqual(view.name, 'more')
> +
> +
> +class IContent(Interface):
> + pass
> +
> +class Content(object):
> + implements(IContent)
> +
> +class View(object):
> + def __init__(self, name):
> + self.name = name
> +
> +class DummyViewTraverser(object):
> + implements(ITraversable)
> +
> + def __init__(self, content, request):
> + self.content = content
> +
> + def traverse(self, name, furtherPath):
> + return View(name)
> +
> +class DummyPublishTraverse(object):
> + implements(IPublishTraverse)
> +
> + def __init__(self, context, request):
> + pass
> +
> + def publishTraverse(self, request, name):
> + return View(name)
> +
> +class DummyBrowserPublisher(object):
> + implements(IBrowserPublisher)
> +
> + def __init__(self, context):
> + self.context = removeSecurityProxy(context)
> +
> + def browserDefault(self, request):
> + if self.context.name != 'more':
> + return self.context, ['more']
> + else:
> + return self.context, ()
> +
> +
> +def test_suite():
> + return makeSuite(TestPublicationTraverser)
> +
> +if __name__ == '__main__':
> + unittest.main()
>
> _______________________________________________
> Checkins mailing list
> Checkins [at] zope
> http://mail.zope.org/mailman/listinfo/checkins

--
Jim Fulton
Zope Corporation


_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


shane at hathawaymix

Jun 20, 2009, 12:04 PM

Post #2 of 9 (854 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

Jim Fulton wrote:
> Why? traverseName is part of zope.app.publication's implementation.
> Now it's oddly split off in a very separate package.

The publisher traversal code is very similar to the code in
zope.traversing, so I thought the best thing to do is put it in the same
package as zope.traversing, so that traversal would be maintained in one
place.

> Or, better yet, traverseRelativeURL and traversePath should be moved
> to the browser module and should get traverseName from
> request.publication.
>
> I'll go ahead and do this.

That's fine.

Shane
_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


ct at gocept

Jun 21, 2009, 2:36 AM

Post #3 of 9 (840 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

On Sat, 2009-06-20 at 13:04 -0600, Shane Hathaway wrote:
> Jim Fulton wrote:
> > Why? traverseName is part of zope.app.publication's implementation.
> > Now it's oddly split off in a very separate package.
>
> The publisher traversal code is very similar to the code in
> zope.traversing, so I thought the best thing to do is put it in the same
> package as zope.traversing, so that traversal would be maintained in one
> place.

I think there's a valid goal around here. Publisher traversal and
traversal as used in templates have two different implementations that
partly overlap at some points and its hard to explain why there are two
of them.

I'm not sure whether we can get a single unified implementation, but for
me that would be nice.

Christian

--
Christian Theune · ct [at] gocept
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 7 · fax +49 345 1229889 1
Zope and Plone consulting and development
Attachments: signature.asc (0.19 KB)


jim at zope

Jun 21, 2009, 5:40 AM

Post #4 of 9 (842 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

On Jun 20, 2009, at 1:10 PM, Jim Fulton wrote:

> Why? traverseName is part of zope.app.publication's
> implementation. Now it's oddly split off in a very separate
> package. This makes customizing publication behavior more difficult.
> I recently made proxying overridable and missed traverseName.
>
> This should be moved back to zope.app.publication. The only other
> thing that uses this is zope.app.publsher.browser.menu. That can and
> should get to these methods via request.publication.
>
> Or, better yet, traverseRelativeURL and traversePath should be moved
> to the browser module and should get traverseName from
> request.publication.
>
> I'll go ahead and do this.


Unless something other than zope.app.publication.ZopePublication is
using PublicationTraverser (or PublicationTraverse) as a base class.
I'm guessing that this isn't likely.

The tests for PublicationTraverser either need it to provide
traverseName or they need the request to have a publication that has
traverseName. But the tests don't want to depend on
zope.app.publication.

Also, traverseRelativeURL really wants to use the publication
getDefaultTraversal method.

I'm going to wager that the intent of
zope.traverser.publicationtraverse is *not* to provide a publication
base class. I'm going to refactor the tests so that they have a test
publication with minimal traverseName and getDefaultTraversal.

Jim

--
Jim Fulton
Zope Corporation


_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


jim at zope

Jun 21, 2009, 5:48 AM

Post #5 of 9 (840 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

On Jun 21, 2009, at 5:36 AM, Christian Theune wrote:

> On Sat, 2009-06-20 at 13:04 -0600, Shane Hathaway wrote:
>> Jim Fulton wrote:
>>> Why? traverseName is part of zope.app.publication's implementation.
>>> Now it's oddly split off in a very separate package.
>>
>> The publisher traversal code is very similar to the code in
>> zope.traversing, so I thought the best thing to do is put it in the
>> same
>> package as zope.traversing, so that traversal would be maintained
>> in one
>> place.
>
> I think there's a valid goal around here. Publisher traversal and
> traversal as used in templates have two different implementations that
> partly overlap at some points and its hard to explain why there are
> two
> of them.
>
> I'm not sure whether we can get a single unified implementation, but
> for
> me that would be nice.


I don't agree. The semantics are different. For example, you often
want to traverse to things in a template that you don't want to expose
via URL. We currently (or last time I checked) expose ++resource+
+name in URLs and this is a bug.

The only place this traversal code is used outside of publication is
by the browser menu code that tries to traverse to a menu item to see
if it is accessible to the user. This was to avoid having to put
security declarations on menu items (a worthy goal) but we've found
that this entailed far too much expense and complexity. I'm not sure
anyone is even using this menu code any more and if they are, I bet
they are or should be making explicit security declarations.

Jim

--
Jim Fulton
Zope Corporation


_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


jim at zope

Jun 21, 2009, 7:58 AM

Post #6 of 9 (839 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

Gaaa. As I did deeper, it's even more muddled that I feared. I'll
start a separate thread.

Jim

On Jun 21, 2009, at 8:48 AM, Jim Fulton wrote:

>
> On Jun 21, 2009, at 5:36 AM, Christian Theune wrote:
>
>> On Sat, 2009-06-20 at 13:04 -0600, Shane Hathaway wrote:
>>> Jim Fulton wrote:
>>>> Why? traverseName is part of zope.app.publication's
>>>> implementation.
>>>> Now it's oddly split off in a very separate package.
>>>
>>> The publisher traversal code is very similar to the code in
>>> zope.traversing, so I thought the best thing to do is put it in the
>>> same
>>> package as zope.traversing, so that traversal would be maintained
>>> in one
>>> place.
>>
>> I think there's a valid goal around here. Publisher traversal and
>> traversal as used in templates have two different implementations
>> that
>> partly overlap at some points and its hard to explain why there are
>> two
>> of them.
>>
>> I'm not sure whether we can get a single unified implementation, but
>> for
>> me that would be nice.
>
>
> I don't agree. The semantics are different. For example, you often
> want to traverse to things in a template that you don't want to expose
> via URL. We currently (or last time I checked) expose ++resource+
> +name in URLs and this is a bug.
>
> The only place this traversal code is used outside of publication is
> by the browser menu code that tries to traverse to a menu item to see
> if it is accessible to the user. This was to avoid having to put
> security declarations on menu items (a worthy goal) but we've found
> that this entailed far too much expense and complexity. I'm not sure
> anyone is even using this menu code any more and if they are, I bet
> they are or should be making explicit security declarations.
>
> Jim
>
> --
> Jim Fulton
> Zope Corporation
>
>
> _______________________________________________
> Zope-Dev maillist - Zope-Dev [at] zope
> http://mail.zope.org/mailman/listinfo/zope-dev
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://mail.zope.org/mailman/listinfo/zope-announce
> http://mail.zope.org/mailman/listinfo/zope )

--
Jim Fulton
Zope Corporation


_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


l at lrowe

Jun 21, 2009, 12:38 PM

Post #7 of 9 (834 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

Jim Fulton wrote:
> I don't agree. The semantics are different. For example, you often
> want to traverse to things in a template that you don't want to expose
> via URL. We currently (or last time I checked) expose ++resource+
> +name in URLs and this is a bug.

What use is a resource without being URL accessible? It's used fairly
often in Plone products to expose static css / js / images.

Laurence

_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


hanno at hannosch

Jun 21, 2009, 1:02 PM

Post #8 of 9 (824 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

On Sun, Jun 21, 2009 at 9:38 PM, Laurence Rowe<l [at] lrowe> wrote:
> Jim Fulton wrote:
>> I don't agree. The semantics are different. For example, you often
>> want to traverse to things in a template that you don't want to expose
>> via URL.  We currently (or last time I checked) expose ++resource+
>> +name in URLs and this is a bug.
>
> What use is a resource without being URL accessible? It's used fairly
> often in Plone products to expose static css / js / images.

You are a victim of Five here and the different semantics of it
compared to zope.app.publisher.

In zope.app.publisher the url for a resource is something like:

<site url>/@@/<name>

where <site url> is basically IAbsoluteURL for zope.site.getSite().

In Zope2 / Five we have:

<context url>/++resource++<name>

instead.

The expression used in page templates to access resources is the same, though.

The reason for this semantic difference is entirely historical. Five
didn't support local component registries / sites at the time when
support for resources have been added. This all happened before those
local registries where simplified in one of the early Zope 3.x
releases.

Hanno
_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )


jim at zope

Jun 22, 2009, 2:13 AM

Post #9 of 9 (814 views)
Permalink
Re: [Checkins] SVN: zope.traversing/trunk/src/zope/traversing/ Moved the publicationtraverse module from zope.app.publication and added tests. [In reply to]

On Jun 21, 2009, at 3:38 PM, Laurence Rowe wrote:

> Jim Fulton wrote:
>> I don't agree. The semantics are different. For example, you often
>> want to traverse to things in a template that you don't want to
>> expose
>> via URL. We currently (or last time I checked) expose ++resource+
>> +name in URLs and this is a bug.
>
> What use is a resource without being URL accessible? It's used fairly
> often in Plone products to expose static css / js / images.


The way to access a resource in a URL is <site>/@@/name, as Hanno
mentioned. The ++resource++name form is intended for use in ZPT
paths. It can be used anywhere in a path, which defeats effective
caching of resources.

Jim


--
Jim Fulton
Zope Corporation


_______________________________________________
Zope-Dev maillist - Zope-Dev [at] zope
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )

Zope dev RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.