[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/Publisher/Browser - __init__.py:1.2 browser-meta.zcml:1.2 browser.zcml:1.2 metaConfigure.py:1.2

Jim Fulton jim@zope.com
Mon, 10 Jun 2002 19:28:48 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/App/Publisher/Browser
In directory cvs.zope.org:/tmp/cvs-serv17445/lib/python/Zope/App/Publisher/Browser

Added Files:
	__init__.py browser-meta.zcml browser.zcml metaConfigure.py 
Log Message:
Merged Zope-3x-branch into newly forked Zope3 CVS Tree.


=== Zope3/lib/python/Zope/App/Publisher/Browser/__init__.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+# 
+##############################################################################
+"""Configuration of the browser framework for Zope
+"""
+


=== Zope3/lib/python/Zope/App/Publisher/Browser/browser-meta.zcml 1.1 => 1.2 ===
+  
+  <directives namespace="http://namespaces.zope.org/browser">
+
+    <directive 
+       name="view" 
+       attributes="factory name for layer template
+                   permission allowed_interface allowed_attributes"
+       handler="Zope.App.Publisher.Browser.metaConfigure.view" >
+       <subdirective name="page" 
+                     attributes="name attribute permission layer" 
+       /> 
+       <subdirective name="defaultPage" 
+                     attributes="name attribute permission" 
+       /> 
+    </directive>
+
+    <directive 
+       name="defaultView" 
+       attributes="factory name for layer template
+                   permission allowed_interface allowed_attributes"
+       handler="Zope.App.Publisher.Browser.metaConfigure.defaultView" />
+
+    <directive
+        name="resource"
+        attributes="factory name layer
+                    permission allowed_interface allowed_attributes"
+        handler="Zope.App.Publisher.Browser.metaConfigure.resource">
+       <subdirective name="page" 
+                     attributes="name attribute permission layer" 
+       /> 
+    </directive>
+
+    <directive name="skin" attributes="name layers" 
+        handler="Zope.App.Publisher.Browser.metaConfigure.skin" />
+
+  </directives>
+
+</zopeConfigure>


=== Zope3/lib/python/Zope/App/Publisher/Browser/browser.zcml 1.1 => 1.2 ===
+   xmlns='http://namespaces.zope.org/zope'
+   xmlns:security='http://namespaces.zope.org/security'
+>
+
+<content class=".BrowserRequest.">
+  <security:allow
+      interface=".IBrowserApplicationRequest." />
+  <security:allow
+      interface="Zope.ComponentArchitecture.IViewService.IViewRequest" />
+</content>
+
+</zopeConfigure>


=== Zope3/lib/python/Zope/App/Publisher/Browser/metaConfigure.py 1.1 => 1.2 ===
+#
+# 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.0 (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.
+# 
+##############################################################################
+"""Browser configuration code
+
+$Id$
+"""
+
+from Zope.Security.Proxy import Proxy
+from Zope.Security.Checker \
+     import InterfaceChecker, CheckerPublic, NamesChecker, Checker
+
+from Zope.Configuration.Action import Action
+from Zope.Configuration.Exceptions import ConfigurationError
+
+from Zope.Publisher.Browser.IBrowserPresentation import IBrowserPresentation
+
+from Zope.App.ComponentArchitecture.metaConfigure \
+     import defaultView as _defaultView, skin as _skin, handler
+
+from Zope.App.PageTemplate.SimpleViewClass import SimpleViewClass
+
+
+def skin(_context, **__kw):
+    return _skin(_context,
+                 type='Zope.Publisher.Browser.IBrowserPresentation.',
+                 **__kw)
+
+class resource(object):
+
+    type = IBrowserPresentation
+    default_allowed_attributes = '__call__'
+
+    def __init__(self, _context, factory, name=None, layer='default',
+                 permission=None,
+                 allowed_interface=None, allowed_attributes=None):
+
+        if ((allowed_attributes or allowed_interface)
+            and (not name or not permission)):
+            raise ConfigurationError(
+                "Must use name attribute with allowed_interface or "
+                "allowed_attributes"
+                )
+
+        if allowed_interface is not None:
+            allowed_interface = _context.resolve(allowed_interface)
+
+        self.factory = self._factory(_context, factory)
+        self.layer = layer
+        self.name = name
+        self.permission = permission
+        self.allowed_attributes = allowed_attributes
+        self.allowed_interface = allowed_interface
+        self.pages = 0
+
+    def _factory(self, _context, factory):
+        return _context.resolve(factory)
+
+    def page(self, _context, name, attribute, permission=None, layer=None):
+
+        permission = permission or self.permission
+
+        factory = self._pageFactory(self.factory, attribute, permission)
+
+        self.pages += 1
+
+        if layer is None:
+            layer = self.layer
+
+        return [
+            Action(
+                discriminator = self._discriminator(name, layer),
+                callable = handler,
+                args = self._args(name, factory, layer),
+                )
+            ]
+
+    def _discriminator(self, name, layer):
+        return ('resource', name, self.type, layer)
+
+    def _args(self, name, factory, layer):
+        return ('Resources', 'provideResource',
+                name, self.type, factory, layer)
+        
+    def _pageFactory(self, factory, attribute, permission):
+        if permission:
+            if permission == 'Zope.Public':
+                permission = CheckerPublic
+
+            def pageView(request,
+                         factory=factory, attribute=attribute,
+                         permission=permission):
+                return Proxy(getattr(factory(request), attribute),
+                             NamesChecker(__call__ = permission))
+
+        else:
+
+            def pageView(request,
+                         factory=factory, attribute=attribute):
+                return getattr(factory(request), attribute)
+
+        return pageView
+
+    def __call__(self):
+        if not self.name:
+            return ()
+
+        permission = self.permission
+        allowed_interface = self.allowed_interface
+        allowed_attributes = self.allowed_attributes
+        factory = self.factory
+
+        if permission:
+            if permission == 'Zope.Public':
+                permission = CheckerPublic
+            
+            if ((not allowed_attributes) and (allowed_interface is None)
+                and (not self.pages)):
+                allowed_attributes = self.default_allowed_attributes
+
+            require={}
+            for name in (allowed_attributes or '').split():
+                require[name] = permission
+            if allowed_interface:
+                for name in allowed_interface.names(1):
+                    require[name] = permission
+
+            checker = Checker(require.get)
+
+            factory = self._proxyFactory(factory, checker)
+
+
+        return [
+            Action(
+                discriminator = self._discriminator(self.name, self.layer),
+                callable = handler,
+                args = self._args(self.name, factory, self.layer),
+                )
+            ]
+
+    def _proxyFactory(self, factory, checker):
+        def proxyView(request,
+                      factory=factory, checker=checker):
+            resource = factory(request)
+
+            # We need this in case the resource gets unwrapped and needs to be rewrapped
+            resource.__Security_checker__ = checker
+
+            return Proxy(resource, checker)
+
+        return proxyView
+
+class view(resource):
+
+    def __init__(self, _context, factory=None, name=None, for_=None,
+                 layer='default',
+                 permission=None,
+                 allowed_interface=None, allowed_attributes=None,
+                 template=None):
+
+        if template:
+            if not name:
+                raise ConfigurationError(
+                    "Must specify name for template view")
+
+            self.default_allowed_attributes = (
+                '__call__ __getitem__ browserDefault')
+
+            template = _context.path(template)
+
+        self.template = template
+
+        if for_ is not None:
+            for_ = _context.resolve(for_)
+        self.for_ = for_
+        
+        resource.__init__(self, _context, factory, name, layer,
+                          permission, allowed_interface, allowed_attributes)
+
+
+    def page(self, _context, name, attribute, permission=None, layer=None):
+        if self.template:
+            raise ConfigurationError(
+                "Can't use page or defaultPage subdirectives for simple "
+                "template views")
+        return super(view, self).page(
+            _context, name, attribute, permission, layer)
+
+    def _factory(self, _context, factory):
+
+        if self.template:
+            
+            if factory:
+                raise ConfigurationError(
+                    "Can't specify factory and template")
+
+            return [SimpleViewClass(
+                str(_context.path(self.template)),
+                used_for = self.for_
+                )]
+
+        else:
+            return map(_context.resolve, factory.strip().split())
+
+    def _discriminator(self, name, layer):
+        return ('view', self.for_, name, self.type, layer)
+
+    def _args(self, name, factory, layer):
+        return ('Views', 'provideView',
+                self.for_, name, self.type, factory, layer)
+
+    def _pageFactory(self, factory, attribute, permission):
+
+        factory = factory[:]        
+        
+        if permission:
+            if permission == 'Zope.Public':
+                permission = CheckerPublic
+
+            def pageView(context, request,
+                         factory=factory[-1], attribute=attribute,
+                         permission=permission):
+                return Proxy(getattr(factory(context, request), attribute),
+                             NamesChecker(__call__ = permission))
+
+        else:
+
+            def pageView(context, request,
+                         factory=factory[-1], attribute=attribute):
+                return getattr(factory(context, request), attribute)
+
+        factory[-1] = pageView
+
+        return factory
+
+    def _proxyFactory(self, factory, checker):
+
+        factory = factory[:]        
+
+        def proxyView(context, request,
+                      factory=factory[-1], checker=checker):
+
+            view = factory(context, request)
+
+            # We need this in case the resource gets unwrapped and needs to be rewrapped
+            view.__Security_checker__ = checker
+
+            return Proxy(view, checker)
+
+        factory[-1] =  proxyView
+
+        return factory
+
+
+def defaultView(_context, name, for_=None, **__kw):
+
+    if __kw:
+        actions = view(_context, name=name, for_=for_, **__kw)()
+    else:
+        actions = []
+
+    if for_ is not None:
+        for_ = _context.resolve(for_)
+
+    type = IBrowserPresentation
+
+    actions += [Action(
+        discriminator = ('defaultViewName', for_, type, name),
+        callable = handler,
+        args = ('Views','setDefaultViewName', for_, type, name),
+        )]
+
+    return actions