[z3-checkins] r17864 - in z3/Five/branch/castle-marker-utility: . browser browser/tests utilities/browser

gotcha at codespeak.net gotcha at codespeak.net
Sun Sep 25 19:33:53 CEST 2005


Author: gotcha
Date: Sun Sep 25 19:33:47 2005
New Revision: 17864

Modified:
   z3/Five/branch/castle-marker-utility/CHANGES.txt
   z3/Five/branch/castle-marker-utility/browser/__init__.py
   z3/Five/branch/castle-marker-utility/browser/absoluteurl.py
   z3/Five/branch/castle-marker-utility/browser/adding.py
   z3/Five/branch/castle-marker-utility/browser/configure.zcml
   z3/Five/branch/castle-marker-utility/browser/resource.py
   z3/Five/branch/castle-marker-utility/browser/tests/test_absoluteurl.py
   z3/Five/branch/castle-marker-utility/traversable.py
   z3/Five/branch/castle-marker-utility/utilities/browser/edit_marker.pt
   z3/Five/branch/castle-marker-utility/utilities/browser/markerview.py
Log:
* Views on views were added

* MarkerUtility provides access to IIntrospector



Modified: z3/Five/branch/castle-marker-utility/CHANGES.txt
==============================================================================
--- z3/Five/branch/castle-marker-utility/CHANGES.txt	(original)
+++ z3/Five/branch/castle-marker-utility/CHANGES.txt	Sun Sep 25 19:33:47 2005
@@ -7,6 +7,9 @@
 
 Others
 ------
+* Views on views were added
+
+* MarkerUtility provides access to IIntrospector
 
 * Removed backwards compatibility for some moved classes (AddForm, EditForm, 
   ContentAdding)

Modified: z3/Five/branch/castle-marker-utility/browser/__init__.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/__init__.py	(original)
+++ z3/Five/branch/castle-marker-utility/browser/__init__.py	Sun Sep 25 19:33:47 2005
@@ -19,7 +19,15 @@
 from AccessControl import ClassSecurityInfo
 from Globals import InitializeClass
 
-class BrowserView(Acquisition.Explicit):
+from zope.interface import implements
+
+from zope.app.publisher.interfaces.browser import IBrowserView
+
+from Products.Five.traversable import Traversable
+
+class BrowserView(Acquisition.Explicit, Traversable):
+    implements(IBrowserView)
+
     security = ClassSecurityInfo()
 
     def __init__(self, context, request):

Modified: z3/Five/branch/castle-marker-utility/browser/absoluteurl.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/absoluteurl.py	(original)
+++ z3/Five/branch/castle-marker-utility/browser/absoluteurl.py	Sun Sep 25 19:33:47 2005
@@ -19,6 +19,7 @@
 from OFS.interfaces import ITraversable
 
 from zope.interface import implements
+from zope.component import getView
 from zope.app import zapi
 from zope.app.traversing.browser.interfaces import IAbsoluteURL
 
@@ -35,9 +36,12 @@
         self.context, self.request = context, request
 
     def __str__(self):
+        return self._getContextAbsoluteUrl()
+
+    def _getContextAbsoluteUrl(self):
         context = aq_inner(self.context)
         return context.absolute_url()
-
+    
     __call__ = __str__
 
     def breadcrumbs(self):
@@ -50,7 +54,7 @@
         if container is None or self._isVirtualHostRoot() \
             or not ITraversable.providedBy(container):
             return (
-                {'name': name, 'url': context.absolute_url()},)
+                {'name': name, 'url': self._getContextAbsoluteUrl()},)
 
         view = zapi.getViewProviding(container, IAbsoluteURL, request)
         base = tuple(view.breadcrumbs())
@@ -75,10 +79,25 @@
     (original: zope.app.traversing.browser.absoluteurl)
     """
 
+    def _getContextAbsoluteUrl(self):
+        return self.context.absolute_url()
+    
     def breadcrumbs(self):
         context = self.context
         request = self.request
 
         return ({'name': context.getId(),
-                 'url': context.absolute_url()
+                 'url': self._getContextAbsoluteUrl()
                  },)
+
+class BrowserViewAbsoluteURL(AbsoluteURL):
+    """
+    views need to access inside the wrapper
+    """
+    def _getContextAbsoluteUrl(self):
+        viewed = self.context.aq_inner.aq_parent
+        #import pdb; pdb.set_trace() 
+        viewed_url = getView(viewed, 'absolute_url', self.request)()
+        return viewed_url + '/' + self.context.__name__
+    
+

Modified: z3/Five/branch/castle-marker-utility/browser/adding.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/adding.py	(original)
+++ z3/Five/branch/castle-marker-utility/browser/adding.py	Sun Sep 25 19:33:47 2005
@@ -35,7 +35,6 @@
 from zExceptions import BadRequest
 
 from Products.Five import BrowserView
-from Products.Five.traversable import Traversable
 from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
 
 from Acquisition import Implicit
@@ -201,7 +200,7 @@
                return True
        return False
 
-class ContentAdding(Adding, Traversable, SimpleItem):
+class ContentAdding(Adding, SimpleItem):
 
     menu_id = "add_content"
 

Modified: z3/Five/branch/castle-marker-utility/browser/configure.zcml
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/configure.zcml	(original)
+++ z3/Five/branch/castle-marker-utility/browser/configure.zcml	Sun Sep 25 19:33:47 2005
@@ -1,5 +1,6 @@
 <configure xmlns="http://namespaces.zope.org/zope"
-           xmlns:browser="http://namespaces.zope.org/browser">
+           xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:five="http://namespaces.zope.org/five">
 
   <serviceType
       id="BrowserMenu"
@@ -30,6 +31,10 @@
       provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
       />
 
+  <!-- register views as traversable in order to be able to traverse to 
+       views on views (like absolute_url) -->
+  
+    
   <browser:page
       for="zope.app.traversing.interfaces.IContainmentRoot"
       name="absolute_url"
@@ -46,6 +51,22 @@
       provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
       />
 
+  <browser:page
+      for="zope.app.publisher.interfaces.browser.IBrowserView"
+      name="absolute_url"
+      class=".absoluteurl.BrowserViewAbsoluteURL"
+      permission="zope.Public"
+      allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
+      />
+
+  <view
+      for="zope.app.publisher.interfaces.browser.IBrowserView"
+      factory=".absoluteurl.BrowserViewAbsoluteURL"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
+      />
+
   <browser:view
       for="OFS.interfaces.IObjectManager"
       name="+"

Modified: z3/Five/branch/castle-marker-utility/browser/resource.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/resource.py	(original)
+++ z3/Five/branch/castle-marker-utility/browser/resource.py	Sun Sep 25 19:33:47 2005
@@ -37,6 +37,11 @@
 
 _marker = []
 
+def addResourceNamespace(name):
+    if not name.startswith('++resource++'):
+        name = '++resource++' + name
+    return name    
+
 class Resource(Explicit):
     """A publishable resource
     """
@@ -52,7 +57,7 @@
         url = str(getViewProviding(container, IAbsoluteURL, self.request))
         url = urllib.unquote(url)
         if not isinstance(container, DirectoryResource):
-            name = '++resource++%s' % name
+            name = addResourceNamespace(name)
         return "%s/%s" % (url, name)
 
 class PageTemplateResource(BrowserView, Resource):
@@ -129,7 +134,7 @@
     resource = None
 
     def __init__(self, name, path, resource_factory=None):
-        self.__name = name
+        self.__name__ = name
         self.__rsrc = self.factory(path, name)
         if resource_factory is not None:
             self.resource = resource_factory
@@ -193,10 +198,7 @@
         self.REQUEST = request
 
     def getId(self):
-        name = self.__name__
-        if not name.startswith('++resource++'):
-            name = '++resource++%s' % self.__name__
-        return name
+        return addResourceNamespace(self.__name__)
 
     def __browser_default__(self, request):
         '''See interface IBrowserPublisher'''

Modified: z3/Five/branch/castle-marker-utility/browser/tests/test_absoluteurl.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/browser/tests/test_absoluteurl.py	(original)
+++ z3/Five/branch/castle-marker-utility/browser/tests/test_absoluteurl.py	Sun Sep 25 19:33:47 2005
@@ -38,6 +38,16 @@
       >>> view()
       'http://nohost/test_folder_1_/testoid'
 
+    Traversal to @@absolute_url of a view should work as well
+    
+      >>> import Products.Five.browser.tests
+      >>> zcml.load_config('pages.zcml', package=Products.Five.browser.tests)
+      >>> from Products.Five.testing.simplecontent import manage_addSimpleContent
+      >>> manage_addSimpleContent(self.folder, 'testsc', 'Testsc')
+      >>> view_on_view = self.folder.unrestrictedTraverse('testsc/@@eagle.txt/@@absolute_url')
+      >>> view_on_view()
+      'http://nohost/test_folder_1_/testsc/@@eagle.txt'
+
     IAbsoluteURL also defines a breadcrumbs() method that returns a
     simple Python structure:
 

Modified: z3/Five/branch/castle-marker-utility/traversable.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/traversable.py	(original)
+++ z3/Five/branch/castle-marker-utility/traversable.py	Sun Sep 25 19:33:47 2005
@@ -72,8 +72,10 @@
         # con Zope 3 into using Zope 2's checkPermission
         newInteraction()
         try:
-            return ITraverser(self).traverse(
+            traversed = ITraverser(self).traverse(
                 path=[name], request=REQUEST).__of__(self)
+            traversed.__name__ = name
+            return traversed
         except (ComponentLookupError, NotFoundError,
                 AttributeError, KeyError, NotFound):
             pass
@@ -100,7 +102,9 @@
             REQUEST = FakeRequest()
         # Try to lookup a view first
         try:
-            return getView(context, name, REQUEST)
+            view = getView(context, name, REQUEST)
+            view.__name__ = name
+            return view
         except ComponentLookupError:
             pass
         # If a view can't be found, then use default traversable

Modified: z3/Five/branch/castle-marker-utility/utilities/browser/edit_marker.pt
==============================================================================
--- z3/Five/branch/castle-marker-utility/utilities/browser/edit_marker.pt	(original)
+++ z3/Five/branch/castle-marker-utility/utilities/browser/edit_marker.pt	Sun Sep 25 19:33:47 2005
@@ -4,8 +4,7 @@
 
   <head><title></title></head>
   <body metal:define-macro='marker_edit'>
-    <div metal:fill-slot="main"
-         tal:define="errors view/state/getErrors">
+    <div tal:define="errors python:{}">
 
       <h1 i18n:translate="heading_edit_marker">
         Edit Marker Interfaces
@@ -21,7 +20,7 @@
             action="."
             method="post"
             enctype="multipart/form-data"
-            tal:attributes="action string:${context/getId}/${view/name}"
+            tal:attributes="action view/@@absolute_url"
             tal:define="provided view/getDirectlyProvidedNames;
                         impl view/getProvidedNames"
             >

Modified: z3/Five/branch/castle-marker-utility/utilities/browser/markerview.py
==============================================================================
--- z3/Five/branch/castle-marker-utility/utilities/browser/markerview.py	(original)
+++ z3/Five/branch/castle-marker-utility/utilities/browser/markerview.py	Sun Sep 25 19:33:47 2005
@@ -12,11 +12,11 @@
         self.context_url = self.context.absolute_url()
 
     
-    def _getLinkToInterfaceDetailsView(interfaceName):
+    def _getLinkToInterfaceDetailsView(self, interfaceName):
         return (self.context_url + 
             '/view_details?iface=%s&type=zope.publisher.interfaces.browser.IBrowserRequest' % interfaceName)
 
-    def _getNameLinkDicts(interfaceNames):
+    def _getNameLinkDicts(self, interfaceNames):
         return [dict(name=name,
                      link=self._getLinkToInterfaceDetailsView(name))
                 for name in interfaceNames]


More information about the z3-checkins mailing list