[z3-checkins] r10839 - in z3/Five/branch/philikon-restructuring: .
browser form skin
philikon at codespeak.net
philikon at codespeak.net
Tue Apr 19 01:22:53 MEST 2005
Author: philikon
Date: Tue Apr 19 01:22:53 2005
New Revision: 10839
Added:
z3/Five/branch/philikon-restructuring/browser/
z3/Five/branch/philikon-restructuring/browser/__init__.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
z3/Five/branch/philikon-restructuring/browser/absoluteurl.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
z3/Five/branch/philikon-restructuring/browser/adding.pt
- copied unchanged from r10836, z3/Five/branch/philikon-restructuring/adding.pt
z3/Five/branch/philikon-restructuring/browser/adding.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/adding.py
z3/Five/branch/philikon-restructuring/browser/configure.zcml
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.zcml
z3/Five/branch/philikon-restructuring/browser/meta.zcml
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/meta.zcml
z3/Five/branch/philikon-restructuring/browser/metaconfigure.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py
z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/pagetemplatefile.py
z3/Five/branch/philikon-restructuring/browser/resource.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/resource.py
z3/Five/branch/philikon-restructuring/form/
z3/Five/branch/philikon-restructuring/form/__init__.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
z3/Five/branch/philikon-restructuring/form/add.pt
- copied unchanged from r10836, z3/Five/branch/philikon-restructuring/add.pt
z3/Five/branch/philikon-restructuring/form/configure.zcml (contents, props changed)
z3/Five/branch/philikon-restructuring/form/edit.pt
- copied unchanged from r10836, z3/Five/branch/philikon-restructuring/edit.pt
z3/Five/branch/philikon-restructuring/form/macros.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/skin.py
z3/Five/branch/philikon-restructuring/form/meta.zcml
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/meta.zcml
z3/Five/branch/philikon-restructuring/form/metaconfigure.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py
z3/Five/branch/philikon-restructuring/skin/
z3/Five/branch/philikon-restructuring/skin/__init__.py (contents, props changed)
z3/Five/branch/philikon-restructuring/skin/configure.zcml
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.zcml
z3/Five/branch/philikon-restructuring/skin/five_template.pt
- copied unchanged from r10836, z3/Five/branch/philikon-restructuring/five_template.pt
z3/Five/branch/philikon-restructuring/skin/standardmacros.py
- copied, changed from r10836, z3/Five/branch/philikon-restructuring/skin.py
Removed:
z3/Five/branch/philikon-restructuring/add.pt
z3/Five/branch/philikon-restructuring/adding.pt
z3/Five/branch/philikon-restructuring/adding.py
z3/Five/branch/philikon-restructuring/browser.py
z3/Five/branch/philikon-restructuring/browser.zcml
z3/Five/branch/philikon-restructuring/browserconfigure.py
z3/Five/branch/philikon-restructuring/edit.pt
z3/Five/branch/philikon-restructuring/five_template.pt
z3/Five/branch/philikon-restructuring/pagetemplatefile.py
z3/Five/branch/philikon-restructuring/resource.py
z3/Five/branch/philikon-restructuring/skin.py
Modified:
z3/Five/branch/philikon-restructuring/__init__.py
z3/Five/branch/philikon-restructuring/api.py
z3/Five/branch/philikon-restructuring/configure.zcml
z3/Five/branch/philikon-restructuring/fiveconfigure.py
z3/Five/branch/philikon-restructuring/meta.zcml
Log:
Major restructuring. We now have the following sub-packages:
* Five.browser
* Five.form
* Five.skin
Tests aren't passing yet which is due to a weird behaviour of
ZopeTwoPageTemplateFile.
Modified: z3/Five/branch/philikon-restructuring/__init__.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/__init__.py (original)
+++ z3/Five/branch/philikon-restructuring/__init__.py Tue Apr 19 01:22:53 2005
@@ -22,7 +22,7 @@
# public API provided by Five
# usage: from Products.Five import <something>
from browser import BrowserView
-from skin import StandardMacros
+from skin.standardmacros import StandardMacros
def initialize(context):
zcml.load_site()
Deleted: /z3/Five/branch/philikon-restructuring/add.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/add.pt Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,72 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/page">
- <body>
- <div metal:fill-slot="body">
-
- <div metal:define-macro="addform">
-
- <form action="." tal:attributes="action request/URL" method="post"
- enctype="multipart/form-data">
-
- <div metal:define-macro="formbody">
-
- <h3 tal:condition="view/label"
- tal:content="view/label"
- metal:define-slot="heading"
- >Edit something</h3>
-
- <p tal:define="status view/update"
- tal:condition="status"
- tal:content="status" />
-
- <p tal:condition="view/errors" i18n:translate="">
- There are <strong tal:content="python:len(view.errors)"
- i18n:name="num_errors">6</strong> input errors.
- </p>
-
- <div metal:define-slot="extra_info" tal:replace="nothing">
- </div>
-
- <div class="row" metal:define-slot="extra_top" tal:replace="nothing">
- <div class="label">Extra top</div>
- <div class="label"><input type="text" style="width:100%" /></div>
- </div>
-
- <div metal:use-macro="context/@@widget_macros/widget_rows" />
-
- <div class="separator"></div>
-
- <div class="row"
- metal:define-slot="extra_bottom" tal:replace="nothing">
- <div class="label">Extra bottom</div>
- <div class="field"><input type="text" style="width:100%" /></div>
- </div>
-
- <div class="separator"></div>
-
- </div>
- <br/><br/>
- <div class="row">
- <div class="controls"><hr />
- <input type='submit' value='Refresh'
- i18n:attributes='value refresh-button' />
- <input type='submit' value='Add' name='UPDATE_SUBMIT'
- i18n:attributes='value add-button' />
- <span tal:condition="context/nameAllowed|nothing" tal:omit-tag="">
- <b i18n:translate="">Object Name</b>
- <input type='text' name='add_input_name'
- tal:attributes="value context/contentName" />
- </span>
- </div>
- </div>
-
- <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
- </div>
-
- <div class="separator"></div>
- </form>
- </div>
-
- </div>
- </body>
-
-</html>
Deleted: /z3/Five/branch/philikon-restructuring/adding.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/adding.pt Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,7 +0,0 @@
-<html metal:use-macro="here/five_template/macros/master">
-<body>
-<div metal:fill-slot="main">
- <p>+ screen not yet supported by Five</p>
-</div>
-</body>
-</html>
Deleted: /z3/Five/branch/philikon-restructuring/adding.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/adding.py Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,245 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 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.
-#
-##############################################################################
-"""Adding View
-
-The Adding View is used to add new objects to a container. It is sort of a
-factory screen.
-"""
-__docformat__ = 'restructuredtext'
-
-from warnings import warn
-from zope.interface import implements
-from zope.publisher.interfaces import IPublishTraverse
-from zope.component.interfaces import IFactory
-
-from zope.app.exception.interfaces import UserError
-from zope.app.container.interfaces import IAdding, INameChooser
-from zope.app.container.interfaces import IContainerNamesContainer
-from zope.app.container.constraints import checkFactory, checkObject
-
-from zope.app import zapi
-from zope.app.event.objectevent import ObjectCreatedEvent
-from zope.event import notify
-
-from zExceptions import BadRequest
-
-from Products.Five import BrowserView
-from Products.Five.traversable import Traversable
-from Products.Five.pagetemplatefile import ZopeTwoPageTemplateFile
-
-from Acquisition import Implicit
-from OFS.SimpleItem import SimpleItem
-
-class BasicAdding(Implicit, BrowserView):
- implements(IAdding, IPublishTraverse)
-
- def add(self, content):
- """See zope.app.container.interfaces.IAdding
- """
- container = self.context
- name = self.contentName
- chooser = INameChooser(container)
-
- # check precondition
- checkObject(container, name, content)
-
- if IContainerNamesContainer.providedBy(container):
- # The container picks it's own names.
- # We need to ask it to pick one.
- name = chooser.chooseName(self.contentName or '', content)
- else:
- request = self.request
- name = request.get('add_input_name', name)
-
- if name is None:
- name = chooser.chooseName(self.contentName or '', content)
- elif name == '':
- name = chooser.chooseName('', content)
- chooser.checkName(name, container)
-
- content.id = name
- container._setObject(name, content)
- self.contentName = name # Set the added object Name
- return container._getOb(name)
-
- contentName = None # usually set by Adding traverser
-
- def nextURL(self):
- """See zope.app.container.interfaces.IAdding"""
- # XXX this is definitely not right for all or even most uses
- # of Five, but can be overridden by an AddView subclass, using
- # the class attribute of a zcml:addform directive
- return (str(zapi.getView(self.context, "absolute_url", self.request))
- + '/manage_main')
-
- # set in BrowserView.__init__
- request = None
- context = None
-
- def renderAddButton(self):
- warn("The renderAddButton method is deprecated, use nameAllowed",
- DeprecationWarning, 2)
-
-
- def publishTraverse(self, request, name):
- """See zope.app.container.interfaces.IAdding"""
- if '=' in name:
- view_name, content_name = name.split("=", 1)
- self.contentName = content_name
-
- if view_name.startswith('@@'):
- view_name = view_name[2:]
- return zapi.getView(self, view_name, request)
-
- if name.startswith('@@'):
- view_name = name[2:]
- else:
- view_name = name
-
- view = zapi.queryView(self, view_name, request)
- if view is not None:
- return view
-
- factory = zapi.queryUtility(IFactory, name)
- if factory is None:
- return super(BasicAdding, self).publishTraverse(request, name)
-
- return factory
-
- def action(self, type_name='', id=''):
- if not type_name:
- raise UserError("You must select the type of object to add.")
-
- if type_name.startswith('@@'):
- type_name = type_name[2:]
-
- if '/' in type_name:
- view_name = type_name.split('/', 1)[0]
- else:
- view_name = type_name
-
- if zapi.queryView(self, view_name, self.request) is not None:
- url = "%s/%s=%s" % (
- zapi.getView(self, "absolute_url", self.request),
- type_name, id)
- self.request.response.redirect(url)
- return
-
- if not self.contentName:
- self.contentName = id
-
- factory = zapi.getUtility(IFactory, type_name)
- content = factory()
-
- notify(ObjectCreatedEvent(content))
- self.add(content)
- self.request.response.redirect(self.nextURL())
-
- def namesAccepted(self):
- return not IContainerNamesContainer.providedBy(self.context)
-
- def nameAllowed(self):
- """Return whether names can be input by the user."""
- return not IContainerNamesContainer.providedBy(self.context)
-
-
-class Adding(BasicAdding):
-
- menu_id = None
- index = ZopeTwoPageTemplateFile("adding.pt")
-
- def addingInfo(self):
- """Return menu data.
-
- This is sorted by title.
- """
- container = self.context
- menu_service = zapi.getService("BrowserMenu")
- result = []
- for menu_id in (self.menu_id, 'zope.app.container.add'):
- if not menu_id:
- continue
- for item in menu_service.getMenu(menu_id, self, self.request):
- extra = item.get('extra')
- if extra:
- factory = extra.get('factory')
- if factory:
- factory = zapi.getUtility(IFactory, factory)
- if not checkFactory(container, None, factory):
- continue
- elif item['extra']['factory'] != item['action']:
- item['has_custom_add_view']=True
- result.append(item)
-
- result.sort(lambda a, b: cmp(a['title'], b['title']))
- return result
-
- def isSingleMenuItem(self):
- "Return whether there is single menu item or not."
- return len(self.addingInfo()) == 1
-
- def hasCustomAddView(self):
- "This should be called only if there is `singleMenuItem` else return 0"
- if self.isSingleMenuItem():
- menu_item = self.addingInfo()[0]
- if 'has_custom_add_view' in menu_item:
- return True
- return False
-
-class ContentAdding(Adding, Traversable, SimpleItem):
-
- menu_id = "add_content"
-
-class ObjectManagerNameChooser:
- """A name chooser for a Zope object manager.
- """
-
- implements(INameChooser)
-
- def __init__(self, context):
- self.context = context
-
- def checkName(self, name, object):
- try:
- self.context._checkId(name, allow_dup=False)
- except BadRequest:
- raise UserError, "Id is in use or invalid"
-
- def chooseName(self, name, object):
- if not name:
- name = object.__class__.__name__
-
- dot = name.rfind('.')
- if dot >= 0:
- suffix = name[dot:]
- name = name[:dot]
- else:
- suffix = ''
-
- n = name + suffix
- i = 1
- while True:
- try:
- container._getOb(n)
- except AttributeError:
- pass
- else:
- break
- i += 1
- n = name + '-' + str(i) + suffix
-
- # Make sure tha name is valid. We may have started with something bad.
- self.checkName(n, object)
-
- return n
Modified: z3/Five/branch/philikon-restructuring/api.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/api.py (original)
+++ z3/Five/branch/philikon-restructuring/api.py Tue Apr 19 01:22:53 2005
@@ -17,6 +17,7 @@
'Import directly from Products.Five instead for public API.',
DeprecationWarning)
-from browser import BrowserView, StandardMacros
+from browser import BrowserView
+from form.standardmacros import StandardMacros
from traversable import Traversable
from viewable import Viewable
Deleted: /z3/Five/branch/philikon-restructuring/browser.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browser.py Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,292 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Five Contributors. All rights reserved.
-#
-# This software is distributed under the terms of the Zope Public
-# License (ZPL) v2.1. See COPYING.txt for more information.
-#
-##############################################################################
-"""Provide basic browser functionality
-
-$Id$
-"""
-
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
-import Acquisition
-from Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
- security = ClassSecurityInfo()
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
-
- # XXX do not create any methods on the subclass called index_html,
- # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def __init__(self, context, request):
- self.context, self.request = context, request
-
- implements(IAbsoluteURL)
-
- def __str__(self):
- context = aq_inner(self.context)
- return context.absolute_url()
-
- __call__ = __str__
-
- def breadcrumbs(self):
- context = self.context.aq_inner
- container = context.aq_parent
- request = self.request
-
- name = context.getId()
-
- if container is None or self._isVirtualHostRoot() \
- or not ITraversable.providedBy(container):
- return (
- {'name': name, 'url': context.absolute_url()},)
-
- view = getViewProviding(container, IAbsoluteURL, request)
- base = tuple(view.breadcrumbs())
- base += (
- {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
- return base
-
- def _isVirtualHostRoot(self):
- virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
- if virtualrootpath is None:
- return False
- context = self.context.aq_inner
- return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- This one is just used to stop breadcrumbs from crumbing up
- to the Zope root.
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def breadcrumbs(self):
- context = self.context
- request = self.request
-
- return ({'name': context.getId(),
- 'url': context.absolute_url()
- },)
-
-class EditView(BrowserView):
- """Simple edit-view base class
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- errors = ()
- update_status = None
- label = ''
-
- # Fall-back field names computes from schema
- fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
- # Fall-back template
- generated_form = FivePageTemplateFile('edit.pt')
-
- def __init__(self, context, request):
- BrowserView.__init__(self, context, request)
- self._setUpWidgets()
-
- def _setUpWidgets(self):
- adapted = self.schema(self.context)
- if adapted is not self.context:
- if not ILocation.providedBy(adapted):
- adapted = LocationProxy(adapted)
- adapted.__parent__ = self.context
- self.adapted = adapted
- setUpEditWidgets(self, self.schema, source=self.adapted,
- names=self.fieldNames)
-
- def setPrefix(self, prefix):
- for widget in self.widgets():
- widget.setPrefix(prefix)
-
- def widgets(self):
- return [getattr(self, name+'_widget')
- for name in self.fieldNames]
-
- def changed(self):
- # This method is overridden to execute logic *after* changes
- # have been made.
- pass
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the status we previously
- # computed.
- return self.update_status
-
- status = ''
-
- content = self.adapted
-
- if Update in self.request.form.keys():
- changed = False
- try:
- changed = applyWidgetsChanges(self, self.schema,
- target=content, names=self.fieldNames)
- # We should not generate events when an adapter is used.
- # That's the adapter's job.
- if changed and self.context is self.adapted:
- notify(ObjectModifiedEvent(content))
- except WidgetsError, errors:
- self.errors = errors
- status = "An error occured."
- get_transaction().abort()
- else:
- setUpEditWidgets(self, self.schema, source=self.adapted,
- ignoreStickyValues=True,
- names=self.fieldNames)
- if changed:
- self.changed()
- # XXX: Needs i18n support:
- # formatter = self.request.locale.dates.getFormatter(
- # 'dateTime', 'medium')
- # status = _("Updated on ${date_time}")
- # status.mapping = {'date_time': formatter.format(
- # datetime.utcnow())}
- status = "Updated on %s" % str(datetime.utcnow())
-
- self.update_status = status
- return status
-
-class AddView(EditView):
- """Simple edit-view base class.
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- def _setUpWidgets(self):
- setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the previous result.
- return self.update_status
-
- if self.request.form.has_key(Update):
-
- self.update_status = ''
- try:
- data = getWidgetsData(self, self.schema, names=self.fieldNames)
- self.createAndAdd(data)
- except WidgetsError, errors:
- self.errors = errors
- self.update_status = "An error occured."
- return self.update_status
-
- self.request.response.redirect(self.nextURL())
-
- return self.update_status
-
- def create(self, *args, **kw):
- """Do the actual instantiation."""
- # hack to please typical Zope 2 factories, which expect id and title
- args = ('tmp_id', 'Temporary title') + args
- return self._factory(*args, **kw)
-
- def createAndAdd(self, data):
- """Add the desired object using the data in the data argument.
-
- The data argument is a dictionary with the data entered in the form.
- """
-
- args = []
- if self._arguments:
- for name in self._arguments:
- args.append(data[name])
-
- kw = {}
- if self._keyword_arguments:
- for name in self._keyword_arguments:
- if name in data:
- kw[str(name)] = data[name]
-
- content = self.create(*args, **kw)
- adapted = self.schema(content)
-
- errors = []
-
- if self._set_before_add:
- for name in self._set_before_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- notify(ObjectCreatedEvent(content))
-
- content = self.add(content)
-
- adapted = self.schema(content)
-
- if self._set_after_add:
- for name in self._set_after_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- return content
-
- def add(self, content):
- return self.context.add(content)
-
- def nextURL(self):
- return self.context.nextURL()
Deleted: /z3/Five/branch/philikon-restructuring/browser.zcml
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browser.zcml Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,71 +0,0 @@
-<configure xmlns="http://namespaces.zope.org/zope"
- xmlns:browser="http://namespaces.zope.org/browser">
-
- <browser:page
- for="*"
- name="absolute_url"
- class=".browser.AbsoluteURL"
- permission="zope.Public"
- allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
- />
-
- <browser:page
- for="*"
- template="five_template.pt"
- name="five_template"
- permission="zope.Public"
- />
-
- <browser:page
- for="*"
- name="standard_macros"
- permission="zope2.View"
- class=".skin.StandardMacros"
- allowed_interface="zope.interface.common.mapping.IItemMapping"
- />
-
- <browser:page
- for="*"
- name="form_macros"
- permission="zope2.View"
- class=".skin.FormMacros"
- allowed_interface="zope.interface.common.mapping.IItemMapping"
- />
-
- <view
- for="*"
- factory=".browser.AbsoluteURL"
- type="zope.publisher.interfaces.http.IHTTPRequest"
- permission="zope.Public"
- provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
- />
-
- <browser:page
- for="zope.app.traversing.interfaces.IContainmentRoot"
- name="absolute_url"
- class=".browser.SiteAbsoluteURL"
- permission="zope.Public"
- allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
- />
-
- <view
- for="zope.app.traversing.interfaces.IContainmentRoot"
- factory=".browser.SiteAbsoluteURL"
- type="zope.publisher.interfaces.http.IHTTPRequest"
- permission="zope.Public"
- provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
- />
-
- <browser:view
- for=".interfaces.IObjectManager"
- name="+"
- class=".adding.ContentAdding"
- permission="zope2.ViewManagementScreens"
- >
-
- <browser:page name="index.html" template="adding.pt" />
- <browser:page name="action.html" attribute="action" />
-
- </browser:view>
-
-</configure>
Copied: z3/Five/branch/philikon-restructuring/browser/__init__.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/__init__.py Tue Apr 19 01:22:53 2005
@@ -11,35 +11,10 @@
$Id$
"""
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
import Acquisition
-from Acquisition import aq_inner, aq_parent, aq_base
from AccessControl import ClassSecurityInfo
from Globals import InitializeClass
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
class BrowserView(Acquisition.Explicit):
security = ClassSecurityInfo()
@@ -51,242 +26,3 @@
# as this makes Zope 2 traverse into that first!
InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def __init__(self, context, request):
- self.context, self.request = context, request
-
- implements(IAbsoluteURL)
-
- def __str__(self):
- context = aq_inner(self.context)
- return context.absolute_url()
-
- __call__ = __str__
-
- def breadcrumbs(self):
- context = self.context.aq_inner
- container = context.aq_parent
- request = self.request
-
- name = context.getId()
-
- if container is None or self._isVirtualHostRoot() \
- or not ITraversable.providedBy(container):
- return (
- {'name': name, 'url': context.absolute_url()},)
-
- view = getViewProviding(container, IAbsoluteURL, request)
- base = tuple(view.breadcrumbs())
- base += (
- {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
- return base
-
- def _isVirtualHostRoot(self):
- virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
- if virtualrootpath is None:
- return False
- context = self.context.aq_inner
- return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- This one is just used to stop breadcrumbs from crumbing up
- to the Zope root.
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def breadcrumbs(self):
- context = self.context
- request = self.request
-
- return ({'name': context.getId(),
- 'url': context.absolute_url()
- },)
-
-class EditView(BrowserView):
- """Simple edit-view base class
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- errors = ()
- update_status = None
- label = ''
-
- # Fall-back field names computes from schema
- fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
- # Fall-back template
- generated_form = FivePageTemplateFile('edit.pt')
-
- def __init__(self, context, request):
- BrowserView.__init__(self, context, request)
- self._setUpWidgets()
-
- def _setUpWidgets(self):
- adapted = self.schema(self.context)
- if adapted is not self.context:
- if not ILocation.providedBy(adapted):
- adapted = LocationProxy(adapted)
- adapted.__parent__ = self.context
- self.adapted = adapted
- setUpEditWidgets(self, self.schema, source=self.adapted,
- names=self.fieldNames)
-
- def setPrefix(self, prefix):
- for widget in self.widgets():
- widget.setPrefix(prefix)
-
- def widgets(self):
- return [getattr(self, name+'_widget')
- for name in self.fieldNames]
-
- def changed(self):
- # This method is overridden to execute logic *after* changes
- # have been made.
- pass
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the status we previously
- # computed.
- return self.update_status
-
- status = ''
-
- content = self.adapted
-
- if Update in self.request.form.keys():
- changed = False
- try:
- changed = applyWidgetsChanges(self, self.schema,
- target=content, names=self.fieldNames)
- # We should not generate events when an adapter is used.
- # That's the adapter's job.
- if changed and self.context is self.adapted:
- notify(ObjectModifiedEvent(content))
- except WidgetsError, errors:
- self.errors = errors
- status = "An error occured."
- get_transaction().abort()
- else:
- setUpEditWidgets(self, self.schema, source=self.adapted,
- ignoreStickyValues=True,
- names=self.fieldNames)
- if changed:
- self.changed()
- # XXX: Needs i18n support:
- # formatter = self.request.locale.dates.getFormatter(
- # 'dateTime', 'medium')
- # status = _("Updated on ${date_time}")
- # status.mapping = {'date_time': formatter.format(
- # datetime.utcnow())}
- status = "Updated on %s" % str(datetime.utcnow())
-
- self.update_status = status
- return status
-
-class AddView(EditView):
- """Simple edit-view base class.
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- def _setUpWidgets(self):
- setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the previous result.
- return self.update_status
-
- if self.request.form.has_key(Update):
-
- self.update_status = ''
- try:
- data = getWidgetsData(self, self.schema, names=self.fieldNames)
- self.createAndAdd(data)
- except WidgetsError, errors:
- self.errors = errors
- self.update_status = "An error occured."
- return self.update_status
-
- self.request.response.redirect(self.nextURL())
-
- return self.update_status
-
- def create(self, *args, **kw):
- """Do the actual instantiation."""
- # hack to please typical Zope 2 factories, which expect id and title
- args = ('tmp_id', 'Temporary title') + args
- return self._factory(*args, **kw)
-
- def createAndAdd(self, data):
- """Add the desired object using the data in the data argument.
-
- The data argument is a dictionary with the data entered in the form.
- """
-
- args = []
- if self._arguments:
- for name in self._arguments:
- args.append(data[name])
-
- kw = {}
- if self._keyword_arguments:
- for name in self._keyword_arguments:
- if name in data:
- kw[str(name)] = data[name]
-
- content = self.create(*args, **kw)
- adapted = self.schema(content)
-
- errors = []
-
- if self._set_before_add:
- for name in self._set_before_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- notify(ObjectCreatedEvent(content))
-
- content = self.add(content)
-
- adapted = self.schema(content)
-
- if self._set_after_add:
- for name in self._set_after_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- return content
-
- def add(self, content):
- return self.context.add(content)
-
- def nextURL(self):
- return self.context.nextURL()
Copied: z3/Five/branch/philikon-restructuring/browser/absoluteurl.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/absoluteurl.py Tue Apr 19 01:22:53 2005
@@ -6,51 +6,13 @@
# License (ZPL) v2.1. See COPYING.txt for more information.
#
##############################################################################
-"""Provide basic browser functionality
+"""Absolute URL
$Id$
"""
-
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
-import Acquisition
-from Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
from zope.interface import implements
-from zope.component import getViewProviding
from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
- security = ClassSecurityInfo()
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
-
- # XXX do not create any methods on the subclass called index_html,
- # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
+from Products.Five.browser import BrowserView
class AbsoluteURL(BrowserView):
"""An adapter for Zope3-style absolute_url using Zope2 methods
@@ -111,182 +73,3 @@
return ({'name': context.getId(),
'url': context.absolute_url()
},)
-
-class EditView(BrowserView):
- """Simple edit-view base class
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- errors = ()
- update_status = None
- label = ''
-
- # Fall-back field names computes from schema
- fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
- # Fall-back template
- generated_form = FivePageTemplateFile('edit.pt')
-
- def __init__(self, context, request):
- BrowserView.__init__(self, context, request)
- self._setUpWidgets()
-
- def _setUpWidgets(self):
- adapted = self.schema(self.context)
- if adapted is not self.context:
- if not ILocation.providedBy(adapted):
- adapted = LocationProxy(adapted)
- adapted.__parent__ = self.context
- self.adapted = adapted
- setUpEditWidgets(self, self.schema, source=self.adapted,
- names=self.fieldNames)
-
- def setPrefix(self, prefix):
- for widget in self.widgets():
- widget.setPrefix(prefix)
-
- def widgets(self):
- return [getattr(self, name+'_widget')
- for name in self.fieldNames]
-
- def changed(self):
- # This method is overridden to execute logic *after* changes
- # have been made.
- pass
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the status we previously
- # computed.
- return self.update_status
-
- status = ''
-
- content = self.adapted
-
- if Update in self.request.form.keys():
- changed = False
- try:
- changed = applyWidgetsChanges(self, self.schema,
- target=content, names=self.fieldNames)
- # We should not generate events when an adapter is used.
- # That's the adapter's job.
- if changed and self.context is self.adapted:
- notify(ObjectModifiedEvent(content))
- except WidgetsError, errors:
- self.errors = errors
- status = "An error occured."
- get_transaction().abort()
- else:
- setUpEditWidgets(self, self.schema, source=self.adapted,
- ignoreStickyValues=True,
- names=self.fieldNames)
- if changed:
- self.changed()
- # XXX: Needs i18n support:
- # formatter = self.request.locale.dates.getFormatter(
- # 'dateTime', 'medium')
- # status = _("Updated on ${date_time}")
- # status.mapping = {'date_time': formatter.format(
- # datetime.utcnow())}
- status = "Updated on %s" % str(datetime.utcnow())
-
- self.update_status = status
- return status
-
-class AddView(EditView):
- """Simple edit-view base class.
-
- Subclasses should provide a schema attribute defining the schema
- to be edited.
- """
-
- def _setUpWidgets(self):
- setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
- def update(self):
- if self.update_status is not None:
- # We've been called before. Just return the previous result.
- return self.update_status
-
- if self.request.form.has_key(Update):
-
- self.update_status = ''
- try:
- data = getWidgetsData(self, self.schema, names=self.fieldNames)
- self.createAndAdd(data)
- except WidgetsError, errors:
- self.errors = errors
- self.update_status = "An error occured."
- return self.update_status
-
- self.request.response.redirect(self.nextURL())
-
- return self.update_status
-
- def create(self, *args, **kw):
- """Do the actual instantiation."""
- # hack to please typical Zope 2 factories, which expect id and title
- args = ('tmp_id', 'Temporary title') + args
- return self._factory(*args, **kw)
-
- def createAndAdd(self, data):
- """Add the desired object using the data in the data argument.
-
- The data argument is a dictionary with the data entered in the form.
- """
-
- args = []
- if self._arguments:
- for name in self._arguments:
- args.append(data[name])
-
- kw = {}
- if self._keyword_arguments:
- for name in self._keyword_arguments:
- if name in data:
- kw[str(name)] = data[name]
-
- content = self.create(*args, **kw)
- adapted = self.schema(content)
-
- errors = []
-
- if self._set_before_add:
- for name in self._set_before_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- notify(ObjectCreatedEvent(content))
-
- content = self.add(content)
-
- adapted = self.schema(content)
-
- if self._set_after_add:
- for name in self._set_after_add:
- if name in data:
- field = self.schema[name]
- try:
- field.set(adapted, data[name])
- except ValidationError:
- errors.append(sys.exc_info()[1])
-
- if errors:
- raise WidgetsError(*errors)
-
- return content
-
- def add(self, content):
- return self.context.add(content)
-
- def nextURL(self):
- return self.context.nextURL()
Copied: z3/Five/branch/philikon-restructuring/browser/adding.py (from r10836, z3/Five/branch/philikon-restructuring/adding.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/adding.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/adding.py Tue Apr 19 01:22:53 2005
@@ -36,7 +36,7 @@
from Products.Five import BrowserView
from Products.Five.traversable import Traversable
-from Products.Five.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
from Acquisition import Implicit
from OFS.SimpleItem import SimpleItem
Copied: z3/Five/branch/philikon-restructuring/browser/configure.zcml (from r10836, z3/Five/branch/philikon-restructuring/browser.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.zcml (original)
+++ z3/Five/branch/philikon-restructuring/browser/configure.zcml Tue Apr 19 01:22:53 2005
@@ -4,37 +4,14 @@
<browser:page
for="*"
name="absolute_url"
- class=".browser.AbsoluteURL"
+ class=".absoluteurl.AbsoluteURL"
permission="zope.Public"
allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
/>
- <browser:page
- for="*"
- template="five_template.pt"
- name="five_template"
- permission="zope.Public"
- />
-
- <browser:page
- for="*"
- name="standard_macros"
- permission="zope2.View"
- class=".skin.StandardMacros"
- allowed_interface="zope.interface.common.mapping.IItemMapping"
- />
-
- <browser:page
- for="*"
- name="form_macros"
- permission="zope2.View"
- class=".skin.FormMacros"
- allowed_interface="zope.interface.common.mapping.IItemMapping"
- />
-
<view
for="*"
- factory=".browser.AbsoluteURL"
+ factory=".absoluteurl.AbsoluteURL"
type="zope.publisher.interfaces.http.IHTTPRequest"
permission="zope.Public"
provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
@@ -43,21 +20,21 @@
<browser:page
for="zope.app.traversing.interfaces.IContainmentRoot"
name="absolute_url"
- class=".browser.SiteAbsoluteURL"
+ class=".absoluteurl.SiteAbsoluteURL"
permission="zope.Public"
allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
/>
<view
for="zope.app.traversing.interfaces.IContainmentRoot"
- factory=".browser.SiteAbsoluteURL"
+ factory=".absoluteurl.SiteAbsoluteURL"
type="zope.publisher.interfaces.http.IHTTPRequest"
permission="zope.Public"
provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
/>
<browser:view
- for=".interfaces.IObjectManager"
+ for="Products.Five.interfaces.IObjectManager"
name="+"
class=".adding.ContentAdding"
permission="zope2.ViewManagementScreens"
@@ -68,4 +45,10 @@
</browser:view>
+ <adapter
+ for="Products.Five.interfaces.IObjectManager"
+ factory=".adding.ObjectManagerNameChooser"
+ provides="zope.app.container.interfaces.INameChooser"
+ />
+
</configure>
Copied: z3/Five/branch/philikon-restructuring/browser/meta.zcml (from r10836, z3/Five/branch/philikon-restructuring/meta.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/meta.zcml (original)
+++ z3/Five/branch/philikon-restructuring/browser/meta.zcml Tue Apr 19 01:22:53 2005
@@ -2,129 +2,42 @@
xmlns="http://namespaces.zope.org/zope"
xmlns:meta="http://namespaces.zope.org/meta">
- <meta:directives namespace="http://namespaces.zope.org/zope">
-
- <meta:directive
- name="permission"
- schema="zope.app.security.metadirectives.IDefinePermissionDirective"
- handler="zope.app.security.metaconfigure.definePermission"
- />
-
- <meta:directive
- name="redefinePermission"
- schema="zope.app.security.metadirectives.IRedefinePermission"
- handler="zope.app.security.metaconfigure.redefinePermission"
- />
-
- <meta:directive
- name="interface"
- schema="zope.app.component.metadirectives.IInterfaceDirective"
- handler="zope.app.component.metaconfigure.interface"
- />
-
- <meta:directive
- name="view"
- schema="zope.app.component.metadirectives.IViewDirective"
- handler="zope.app.component.metaconfigure.view"
- />
-
- <meta:directive
- name="adapter"
- schema="zope.app.component.metadirectives.IAdapterDirective"
- handler="zope.app.component.metaconfigure.adapter"
- />
-
- <meta:directive
- name="subscriber"
- schema="zope.app.component.metadirectives.ISubscriberDirective"
- handler="zope.app.component.metaconfigure.subscriber"
- />
-
- <meta:directive
- name="utility"
- schema="zope.app.component.metadirectives.IUtilityDirective"
- handler="zope.app.component.metaconfigure.utility"
- />
+ <meta:directives namespace="http://namespaces.zope.org/browser">
<meta:directive
- name="serviceType"
- schema="zope.app.component.metadirectives.IServiceTypeDirective"
- handler="zope.app.component.metaconfigure.serviceType"
+ name="layer"
+ schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
+ handler="zope.app.publisher.browser.metaconfigure.layer"
/>
<meta:directive
- name="service"
- schema="zope.app.component.metadirectives.IServiceDirective"
- handler="zope.app.component.metaconfigure.service"
+ name="skin"
+ schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
+ handler="zope.app.publisher.browser.metaconfigure.skin"
/>
- <meta:complexDirective
- name="content"
- schema="zope.app.component.metadirectives.IClassDirective"
- handler=".metaconfigure.ContentDirective"
- >
-
- <meta:subdirective
- name="implements"
- schema="zope.app.component.metadirectives.IImplementsSubdirective"
- />
-
- <meta:subdirective
- name="require"
- schema="zope.app.component.metadirectives.IRequireSubdirective"
- />
-
- <meta:subdirective
- name="allow"
- schema="zope.app.component.metadirectives.IAllowSubdirective"
- />
-
- </meta:complexDirective>
-
<meta:directive
- name="vocabulary"
- schema="zope.app.schema.metadirectives.IVocabularyDirective"
- handler="zope.app.schema.metaconfigure.vocabulary"
+ name="defaultSkin"
+ schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
+ handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
/>
- </meta:directives>
-
- <meta:directives namespace="http://namespaces.zope.org/browser">
-
- <meta:directive
- name="layer"
- schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
- handler="zope.app.publisher.browser.metaconfigure.layer"
- />
-
- <meta:directive
- name="skin"
- schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
- handler="zope.app.publisher.browser.metaconfigure.skin"
- />
-
- <meta:directive
- name="defaultSkin"
- schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
- handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
- />
-
<meta:directive
name="defaultView"
schema="zope.app.publisher.browser.metadirectives.IDefaultViewDirective"
- handler=".browserconfigure.defaultView"
+ handler=".metaconfigure.defaultView"
/>
<meta:directive
name="page"
schema="zope.app.publisher.browser.metadirectives.IPageDirective"
- handler=".browserconfigure.page"
+ handler=".metaconfigure.page"
/>
<meta:complexDirective
name="pages"
schema="zope.app.publisher.browser.metadirectives.IPagesDirective"
- handler=".browserconfigure.pages"
+ handler=".metaconfigure.pages"
>
<meta:subdirective
@@ -137,13 +50,13 @@
<meta:directive
name="resource"
schema="zope.app.publisher.browser.metadirectives.IResourceDirective"
- handler=".browserconfigure.resource"
+ handler=".metaconfigure.resource"
/>
<meta:directive
name="resourceDirectory"
schema="zope.app.publisher.browser.metadirectives.IResourceDirectoryDirective"
- handler=".browserconfigure.resourceDirectory"
+ handler=".metaconfigure.resourceDirectory"
/>
<meta:directive
@@ -174,7 +87,7 @@
<meta:complexDirective
name="view"
schema="zope.app.publisher.browser.metadirectives.IViewDirective"
- handler=".browserconfigure.view"
+ handler=".metaconfigure.view"
>
<meta:subdirective
@@ -189,101 +102,6 @@
</meta:complexDirective>
- <meta:complexDirective
- name="editform"
- schema="zope.app.form.browser.metadirectives.IEditFormDirective"
- handler=".browserconfigure.EditFormDirective"
- >
-
- <meta:subdirective
- name="widget"
- schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
- />
-
- </meta:complexDirective>
-
- <meta:complexDirective
- name="addform"
- schema="zope.app.form.browser.metadirectives.IAddFormDirective"
- handler=".browserconfigure.AddFormDirective"
- >
-
- <meta:subdirective
- name="widget"
- schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
- />
-
- </meta:complexDirective>
-
- </meta:directives>
-
-
- <meta:directives namespace="http://namespaces.zope.org/five">
-
- <!-- specific to Five -->
-
- <meta:directive
- name="loadProducts"
- schema="zope.interface.Interface"
- handler=".fiveconfigure.loadProducts"
- />
-
- <meta:directive
- name="loadProductsOverrides"
- schema="zope.interface.Interface"
- handler=".fiveconfigure.loadProductsOverrides"
- />
-
- <meta:directive
- name="implements"
- schema=".fivedirectives.IImplementsDirective"
- handler=".fiveconfigure.implements"
- />
-
- <meta:directive
- name="defaultViewable"
- schema=".fivedirectives.IDefaultViewableDirective"
- handler=".fiveconfigure.defaultViewable"
- />
-
- <meta:directive
- name="traversable"
- schema=".fivedirectives.ITraversableDirective"
- handler=".fiveconfigure.traversable"
- />
-
- <meta:directive
- name="sendEvents"
- schema=".fivedirectives.ISendEventsDirective"
- handler=".eventconfigure.sendEvents"
- />
-
- <meta:directive
- name="sizable"
- schema=".fivedirectives.ISendEventsDirective"
- handler=".sizeconfigure.sizable"
- />
-
- <meta:directive
- name="pagesFromDirectory"
- schema=".fivedirectives.IPagesFromDirectoryDirective"
- handler=".fiveconfigure.pagesFromDirectory"
- />
-
- <!-- viewable is deprecated, use traversable instead -->
-
- <meta:directive
- name="viewable"
- schema=".fivedirectives.ITraversableDirective"
- handler=".fiveconfigure.viewable"
- />
-
- <meta:directive
- name="bridge"
- schema=".fivedirectives.IBridgeDirective"
- handler=".fiveconfigure.bridge"
- />
-
</meta:directives>
</configure>
Copied: z3/Five/branch/philikon-restructuring/browser/metaconfigure.py (from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browserconfigure.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/metaconfigure.py Tue Apr 19 01:22:53 2005
@@ -26,17 +26,16 @@
menuItemDirective
from zope.app.component.metaconfigure import handler
from zope.app.component.interface import provideInterface
-from zope.app.form.browser.metaconfigure import BaseFormDirective
from zope.app.container.interfaces import IAdding
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
- initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser import BrowserView
+from Products.Five.browser.resource import FileResourceFactory, ImageResourceFactory
+from Products.Five.browser.resource import PageTemplateResourceFactory
+from Products.Five.browser.resource import DirectoryResourceFactory
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.metaclass import makeClass
+from Products.Five.security import getSecurityInfo, protectClass, \
+ protectName, initializeClass
import ExtensionClass
@@ -420,174 +419,6 @@
args = (new_class,)
)
-
-#
-# Form generation from schema
-#
-def EditViewFactory(name, schema, label, permission, layer,
- template, default_template, bases, for_, fields,
- fulledit_path=None, fulledit_label=None, menu=u''):
- s = getGlobalService(Presentation)
- class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
- class_.schema = schema
- class_.label = label
- class_.fieldNames = fields
-
- class_.fulledit_path = fulledit_path
- if fulledit_path and (fulledit_label is None):
- fulledit_label = "Full edit"
-
- class_.fulledit_label = fulledit_label
-
- class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-
- s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-
-class FiveFormDirective(BaseFormDirective):
-
- def _processWidgets(self):
- if self._widgets:
- customWidgetsObject = makeClass('CustomWidgetsMixin', (ExtensionClass.Base,), self._widgets)
- self.bases = self.bases + (customWidgetsObject,)
-
-class EditFormDirective(FiveFormDirective):
-
- view = EditView
- default_template = 'edit.pt'
- title = 'Edit'
-
- def _handle_menu(self):
- if self.menu:
- menuItemDirective(
- self._context, self.menu, self.for_ or self.schema,
- '@@' + self.name, self.title, permission=self.permission)
-
- def __call__(self):
- self._processWidgets()
- self._handle_menu()
- self._context.action(
- discriminator=self._discriminator(),
- callable=EditViewFactory,
- args=self._args(),
- kw={'menu': self.menu},
- )
-
-def AddViewFactory(name, schema, label, permission, layer,
- template, default_template, bases, for_,
- fields, content_factory, arguments,
- keyword_arguments, set_before_add, set_after_add,
- menu=u''):
-
- s = getGlobalService(Presentation)
- class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-
- class_.schema = schema
- class_.label = label
- class_.fieldNames = fields
- class_._factory = content_factory
- class_._arguments = arguments
- class_._keyword_arguments = keyword_arguments
- class_._set_before_add = set_before_add
- class_._set_after_add = set_after_add
-
- class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
- s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-class AddFormDirective(FiveFormDirective):
-
- view = AddView
- default_template = 'add.pt'
- for_ = IAdding
-
- # default add form information
- description = None
- content_factory = None
- arguments = None
- keyword_arguments = None
- set_before_add = None
- set_after_add = None
-
- def _handle_menu(self):
- if self.menu or self.title:
- if (not self.menu) or (not self.title):
- raise ValueError("If either menu or title are specified, "
- "they must both be specified")
- # Add forms are really for IAdding components, so do not use
- # for=self.schema.
- menuItemDirective(
- self._context, self.menu, self.for_, '@@' + self.name,
- self.title, permission=self.permission,
- description=self.description)
-
- def _handle_arguments(self, leftover=None):
- schema = self.schema
- fields = self.fields
- arguments = self.arguments
- keyword_arguments = self.keyword_arguments
- set_before_add = self.set_before_add
- set_after_add = self.set_after_add
-
- if leftover is None:
- leftover = fields
-
- if arguments:
- missing = [n for n in arguments if n not in fields]
- if missing:
- raise ValueError("Some arguments are not included in the form",
- missing)
- optional = [n for n in arguments if not schema[n].required]
- if optional:
- raise ValueError("Some arguments are optional, use"
- " keyword_arguments for them",
- optional)
- leftover = [n for n in leftover if n not in arguments]
-
- if keyword_arguments:
- missing = [n for n in keyword_arguments if n not in fields]
- if missing:
- raise ValueError(
- "Some keyword_arguments are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in keyword_arguments]
-
- if set_before_add:
- missing = [n for n in set_before_add if n not in fields]
- if missing:
- raise ValueError(
- "Some set_before_add are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in set_before_add]
-
- if set_after_add:
- missing = [n for n in set_after_add if n not in fields]
- if missing:
- raise ValueError(
- "Some set_after_add are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in set_after_add]
-
- self.set_after_add += leftover
-
- else:
- self.set_after_add = leftover
-
- def __call__(self):
- self._processWidgets()
- self._handle_menu()
- self._handle_arguments()
-
- self._context.action(
- discriminator=self._discriminator(),
- callable=AddViewFactory,
- args=self._args()+(self.content_factory, self.arguments,
- self.keyword_arguments,
- self.set_before_add, self.set_after_add),
- kw={'menu': self.menu},
- )
-
#
# mixin classes / class factories
#
Copied: z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py (from r10836, z3/Five/branch/philikon-restructuring/pagetemplatefile.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/pagetemplatefile.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py Tue Apr 19 01:22:53 2005
@@ -1,18 +1,25 @@
-'''A 'PageTemplateFile' without security restrictions.'''
+##############################################################################
+#
+# Copyright (c) 2005 Five Contributors. All rights reserved.
+#
+# This software is distributed under the terms of the Zope Public
+# License (ZPL) v2.1. See COPYING.txt for more information.
+#
+##############################################################################
+"""A 'PageTemplateFile' without security restrictions.
+$Id$
+"""
import os, sys
-# Zope 2
from Globals import package_home
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
-# Zope 3
from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
-# Five
-from ReuseUtils import rebindFunction
-from TrustedExpression import getEngine, ModuleImporter
+from Products.Five.ReuseUtils import rebindFunction
+from Products.Five.TrustedExpression import getEngine, ModuleImporter
class ZopeTwoPageTemplateFile(PageTemplateFile):
"""A strange hybrid between Zope 2 and Zope 3 page template.
Copied: z3/Five/branch/philikon-restructuring/browser/resource.py (from r10836, z3/Five/branch/philikon-restructuring/resource.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/resource.py (original)
+++ z3/Five/branch/philikon-restructuring/browser/resource.py Tue Apr 19 01:22:53 2005
@@ -10,14 +10,13 @@
$Id: browser.py 5259 2004-06-23 15:59:52Z philikon $
"""
-
import os
import urllib
from Acquisition import Explicit, aq_inner, aq_parent
from ComputedAttribute import ComputedAttribute
-from browser import BrowserView
from OFS.Traversable import Traversable as OFSTraversable
+
from zope.exceptions import NotFoundError
from zope.interface import implements
from zope.component.interfaces import IResource
@@ -29,6 +28,8 @@
from zope.app.publisher.pagetemplateresource import PageTemplate
from zope.app.publisher.browser.resources import empty
+from Products.Five.browser import BrowserView
+
_marker = []
class Resource(Explicit):
Deleted: /z3/Five/branch/philikon-restructuring/browserconfigure.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browserconfigure.py Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,634 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Five Contributors. All rights reserved.
-#
-# This software is distributed under the terms of the Zope Public
-# License (ZPL) v2.1. See COPYING.txt for more information.
-#
-##############################################################################
-"""Browser directives
-
-Directives to emulate the 'http://namespaces.zope.org/browser'
-namespace in ZCML known from zope.app.
-
-$Id$
-"""
-import os
-
-from zope.interface import Interface
-from zope.component import getGlobalService, ComponentLookupError
-from zope.configuration.exceptions import ConfigurationError
-from zope.component.servicenames import Presentation
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.app.publisher.browser.viewmeta import pages as zope_app_pages
-from zope.app.publisher.browser.viewmeta import view as zope_app_view
-from zope.app.publisher.browser.globalbrowsermenuservice import\
- menuItemDirective
-from zope.app.component.metaconfigure import handler
-from zope.app.component.interface import provideInterface
-from zope.app.form.browser.metaconfigure import BaseFormDirective
-from zope.app.container.interfaces import IAdding
-
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
- initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
-
-import ExtensionClass
-
-def page(_context, name, permission, for_,
- layer='default', template=None, class_=None,
- allowed_interface=None, allowed_attributes=None,
- attribute='__call__', menu=None, title=None,
- ):
-
- try:
- s = getGlobalService(Presentation)
- except ComponentLookupError, err:
- pass
-
- _handle_menu(_context, menu, title, [for_], name, permission)
-
- if not (class_ or template):
- raise ConfigurationError("Must specify a class or template")
- if allowed_attributes is None:
- allowed_attributes = []
- if allowed_interface is not None:
- for interface in allowed_interface:
- attrs = [n for n, d in interface.namesAndDescriptions(1)]
- allowed_attributes.extend(attrs)
-
- if attribute != '__call__':
- if template:
- raise ConfigurationError(
- "Attribute and template cannot be used together.")
-
- if not class_:
- raise ConfigurationError(
- "A class must be provided if attribute is used")
-
- if template:
- template = os.path.abspath(str(_context.path(template)))
- if not os.path.isfile(template):
- raise ConfigurationError("No such file", template)
-
- if class_:
- # new-style classes do not work with Five. As we want to import
- # packages from z3 directly, we ignore new-style classes for now.
- if type(class_) == type:
- return
- if attribute != '__call__':
- if not hasattr(class_, attribute):
- raise ConfigurationError(
- "The provided class doesn't have the specified attribute "
- )
- cdict = getSecurityInfo(class_)
- if template:
- new_class = makeClassForTemplate(template, bases=(class_, ),
- cdict=cdict)
- elif attribute != "__call__":
- # we're supposed to make a page for an attribute (read:
- # method) and it's not __call__. We thus need to create a
- # new class using our mixin for attributes.
- cdict.update({'__page_attribute__': attribute})
- new_class = makeClass(class_.__name__,
- (class_, ViewMixinForAttributes),
- cdict)
-
- # in case the attribute does not provide a docstring,
- # ZPublisher refuses to publish it. So, as a workaround,
- # we provide a stub docstring
- func = getattr(new_class, attribute)
- if not func.__doc__:
- # cannot test for MethodType/UnboundMethod here
- # because of ExtensionClass
- if hasattr(func, 'im_func'):
- # you can only set a docstring on functions, not
- # on method objects
- func = func.im_func
- func.__doc__ = "Stub docstring to make ZPublisher work"
- else:
- # we could use the class verbatim here, but we'll execute
- # some security declarations on it so we really shouldn't
- # modify the original. So, instead we make a new class
- # with just one base class -- the original
- new_class = makeClass(class_.__name__, (class_,), cdict)
-
- else:
- # template
- new_class = makeClassForTemplate(template)
-
- _handle_for(_context, for_)
-
- _context.action(
- discriminator = ('view', for_, name, IBrowserRequest, layer),
- callable = handler,
- args = (Presentation, 'provideAdapter',
- IBrowserRequest, new_class, name, [for_], Interface, layer,
- _context.info),
- )
- _context.action(
- discriminator = ('five:protectClass', new_class),
- callable = protectClass,
- args = (new_class, permission)
- )
- if allowed_attributes:
- for attr in allowed_attributes:
- _context.action(
- discriminator = ('five:protectName', new_class, attr),
- callable = protectName,
- args = (new_class, attr, permission)
- )
- _context.action(
- discriminator = ('five:initialize:class', new_class),
- callable = initializeClass,
- args = (new_class,)
- )
-
-class pages(zope_app_pages):
-
- def page(self, _context, name, attribute='__call__', template=None,
- menu=None, title=None):
- return page(_context,
- name=name,
- attribute=attribute,
- template=template,
- menu=menu, title=title,
- **(self.opts))
-
-def defaultView(_context, name, for_=None):
-
- type = IBrowserRequest
-
- _context.action(
- discriminator = ('defaultViewName', for_, type, name),
- callable = handler,
- args = (Presentation,
- 'setDefaultViewName', for_, type, name),
- )
-
- _handle_for(_context, for_)
-
-# view (named view with pages)
-
-class view(zope_app_view):
-
- def __call__(self):
- (_context, name, for_, permission, layer, class_,
- allowed_interface, allowed_attributes) = self.args
-
- required = {}
-
- cdict = {}
- pages = {}
-
- for pname, attribute, template in self.pages:
- try:
- s = getGlobalService(Presentation)
- except ComponentLookupError, err:
- pass
-
- if template:
- cdict[pname] = ZopeTwoPageTemplateFile(template)
- if attribute and attribute != name:
- cdict[attribute] = cdict[pname]
- else:
- if not hasattr(class_, attribute):
- raise ConfigurationError("Undefined attribute",
- attribute)
-
- attribute = attribute or pname
- required[pname] = permission
-
- pages[pname] = attribute
-
- # This should go away, but noone seems to remember what to do. :-(
- if hasattr(class_, 'publishTraverse'):
-
- def publishTraverse(self, request, name,
- pages=pages, getattr=getattr):
-
- if name in pages:
- return getattr(self, pages[name])
- view = zapi.queryView(self, name, request)
- if view is not None:
- return view
-
- m = class_.publishTraverse.__get__(self)
- return m(request, name)
-
- else:
- def publishTraverse(self, request, name,
- pages=pages, getattr=getattr):
-
- if name in pages:
- return getattr(self, pages[name])
- view = zapi.queryView(self, name, request)
- if view is not None:
- return view
-
- raise NotFoundError(self, name, request)
-
- cdict['publishTraverse'] = publishTraverse
-
- if not hasattr(class_, 'browserDefault'):
- if self.default or self.pages:
- default = self.default or self.pages[0][0]
- cdict['browserDefault'] = (
- lambda self, request, default=default:
- (self, (default, ))
- )
- elif providesCallable(class_):
- cdict['browserDefault'] = (
- lambda self, request: (self, ())
- )
-
- if class_ is not None:
- bases = (class_, ViewMixinForTemplates)
- else:
- bases = (ViewMixinForTemplates)
-
- try:
- cname = str(name)
- except:
- cname = "GeneratedClass"
-
- newclass = makeClass(cname, bases, cdict)
-
- _handle_for(_context, for_)
-
- if self.provides is not None:
- _context.action(
- discriminator = None,
- callable = provideInterface,
- args = ('', self.provides)
- )
-
- _context.action(
- discriminator = ('view', for_, name, IBrowserRequest, layer,
- self.provides),
- callable = handler,
- args = (Presentation, 'provideAdapter',
- IBrowserRequest, newclass, name, [for_], self.provides,
- layer, _context.info),
- )
-
-def _handle_for(_context, for_):
- if for_ is not None:
- _context.action(
- discriminator = None,
- callable = provideInterface,
- args = ('', for_)
- )
-
-def _handle_menu(_context, menu, title, for_, name, permission):
- if menu or title:
- if not (menu and title):
- raise ConfigurationError(
- "If either menu or title are specified, they must "
- "both be specified.")
-
- if len(for_) != 1:
- raise ConfigurationError(
- "Menus can be specified only for single-view, not for "
- "multi-views.")
-
- return menuItemDirective(
- _context, menu, for_[0], '@@' + str(name), title,
- permission=permission)
-
- return []
-
-_factory_map = {'image':{'prefix':'ImageResource',
- 'count':0,
- 'factory':ImageResourceFactory},
- 'file':{'prefix':'FileResource',
- 'count':0,
- 'factory':FileResourceFactory},
- 'template':{'prefix':'PageTemplateResource',
- 'count':0,
- 'factory':PageTemplateResourceFactory}
- }
-
-def resource(_context, name, layer='default', permission='zope.Public',
- file=None, image=None, template=None):
-
- if ((file and image) or (file and template) or
- (image and template) or not (file or image or template)):
- raise ConfigurationError(
- "Must use exactly one of file or image or template"
- "attributes for resource directives"
- )
-
- res = file or image or template
- res_type = ((file and 'file') or
- (image and 'image') or
- (template and 'template'))
- factory_info = _factory_map.get(res_type)
- factory_info['count'] += 1
- res_factory = factory_info['factory']
- class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
- new_class = makeClass(class_name, (res_factory.resource,), {})
- factory = res_factory(name, res, resource_factory=new_class)
-
- _context.action(
- discriminator = ('resource', name, IBrowserRequest, layer),
- callable = handler,
- args = (Presentation, 'provideResource',
- name, IBrowserRequest, factory, layer),
- )
- _context.action(
- discriminator = ('five:protectClass', new_class),
- callable = protectClass,
- args = (new_class, permission)
- )
- _context.action(
- discriminator = ('five:initialize:class', new_class),
- callable = initializeClass,
- args = (new_class,)
- )
-
-_rd_map = {ImageResourceFactory:{'prefix':'DirContainedImageResource',
- 'count':0},
- FileResourceFactory:{'prefix':'DirContainedFileResource',
- 'count':0},
- PageTemplateResourceFactory:{'prefix':'DirContainedPTResource',
- 'count':0},
- DirectoryResourceFactory:{'prefix':'DirectoryResource',
- 'count':0}
- }
-
-def resourceDirectory(_context, name, directory, layer='default',
- permission='zope.Public'):
-
- if not os.path.isdir(directory):
- raise ConfigurationError(
- "Directory %s does not exist" % directory
- )
-
- resource = DirectoryResourceFactory.resource
- f_cache = {}
- resource_factories = dict(resource.resource_factories)
- resource_factories['default'] = resource.default_factory
- for ext, factory in resource_factories.items():
- if f_cache.get(factory) is not None:
- continue
- factory_info = _rd_map.get(factory)
- factory_info['count'] += 1
- class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
- factory_name = '%s%s' % (factory.__name__, factory_info['count'])
- f_resource = makeClass(class_name, (factory.resource,), {})
- f_cache[factory] = makeClass(factory_name, (factory,),
- {'resource':f_resource})
- for ext, factory in resource_factories.items():
- resource_factories[ext] = f_cache[factory]
- default_factory = resource_factories['default']
- del resource_factories['default']
-
- cdict = {'resource_factories':resource_factories,
- 'default_factory':default_factory}
-
- factory_info = _rd_map.get(DirectoryResourceFactory)
- factory_info['count'] += 1
- class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
- dir_factory = makeClass(class_name, (resource,), cdict)
- factory = DirectoryResourceFactory(name, directory,
- resource_factory=dir_factory)
-
- new_classes = [dir_factory,
- ] + [f.resource for f in f_cache.values()]
-
- _context.action(
- discriminator = ('resource', name, IBrowserRequest, layer),
- callable = handler,
- args = (Presentation, 'provideResource',
- name, IBrowserRequest, factory, layer),
- )
- for new_class in new_classes:
- _context.action(
- discriminator = ('five:protectClass', new_class),
- callable = protectClass,
- args = (new_class, permission)
- )
- _context.action(
- discriminator = ('five:initialize:class', new_class),
- callable = initializeClass,
- args = (new_class,)
- )
-
-
-#
-# Form generation from schema
-#
-def EditViewFactory(name, schema, label, permission, layer,
- template, default_template, bases, for_, fields,
- fulledit_path=None, fulledit_label=None, menu=u''):
- s = getGlobalService(Presentation)
- class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
- class_.schema = schema
- class_.label = label
- class_.fieldNames = fields
-
- class_.fulledit_path = fulledit_path
- if fulledit_path and (fulledit_label is None):
- fulledit_label = "Full edit"
-
- class_.fulledit_label = fulledit_label
-
- class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-
- s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-
-class FiveFormDirective(BaseFormDirective):
-
- def _processWidgets(self):
- if self._widgets:
- customWidgetsObject = makeClass('CustomWidgetsMixin', (ExtensionClass.Base,), self._widgets)
- self.bases = self.bases + (customWidgetsObject,)
-
-class EditFormDirective(FiveFormDirective):
-
- view = EditView
- default_template = 'edit.pt'
- title = 'Edit'
-
- def _handle_menu(self):
- if self.menu:
- menuItemDirective(
- self._context, self.menu, self.for_ or self.schema,
- '@@' + self.name, self.title, permission=self.permission)
-
- def __call__(self):
- self._processWidgets()
- self._handle_menu()
- self._context.action(
- discriminator=self._discriminator(),
- callable=EditViewFactory,
- args=self._args(),
- kw={'menu': self.menu},
- )
-
-def AddViewFactory(name, schema, label, permission, layer,
- template, default_template, bases, for_,
- fields, content_factory, arguments,
- keyword_arguments, set_before_add, set_after_add,
- menu=u''):
-
- s = getGlobalService(Presentation)
- class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-
- class_.schema = schema
- class_.label = label
- class_.fieldNames = fields
- class_._factory = content_factory
- class_._arguments = arguments
- class_._keyword_arguments = keyword_arguments
- class_._set_before_add = set_before_add
- class_._set_after_add = set_after_add
-
- class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
- s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-class AddFormDirective(FiveFormDirective):
-
- view = AddView
- default_template = 'add.pt'
- for_ = IAdding
-
- # default add form information
- description = None
- content_factory = None
- arguments = None
- keyword_arguments = None
- set_before_add = None
- set_after_add = None
-
- def _handle_menu(self):
- if self.menu or self.title:
- if (not self.menu) or (not self.title):
- raise ValueError("If either menu or title are specified, "
- "they must both be specified")
- # Add forms are really for IAdding components, so do not use
- # for=self.schema.
- menuItemDirective(
- self._context, self.menu, self.for_, '@@' + self.name,
- self.title, permission=self.permission,
- description=self.description)
-
- def _handle_arguments(self, leftover=None):
- schema = self.schema
- fields = self.fields
- arguments = self.arguments
- keyword_arguments = self.keyword_arguments
- set_before_add = self.set_before_add
- set_after_add = self.set_after_add
-
- if leftover is None:
- leftover = fields
-
- if arguments:
- missing = [n for n in arguments if n not in fields]
- if missing:
- raise ValueError("Some arguments are not included in the form",
- missing)
- optional = [n for n in arguments if not schema[n].required]
- if optional:
- raise ValueError("Some arguments are optional, use"
- " keyword_arguments for them",
- optional)
- leftover = [n for n in leftover if n not in arguments]
-
- if keyword_arguments:
- missing = [n for n in keyword_arguments if n not in fields]
- if missing:
- raise ValueError(
- "Some keyword_arguments are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in keyword_arguments]
-
- if set_before_add:
- missing = [n for n in set_before_add if n not in fields]
- if missing:
- raise ValueError(
- "Some set_before_add are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in set_before_add]
-
- if set_after_add:
- missing = [n for n in set_after_add if n not in fields]
- if missing:
- raise ValueError(
- "Some set_after_add are not included in the form",
- missing)
- leftover = [n for n in leftover if n not in set_after_add]
-
- self.set_after_add += leftover
-
- else:
- self.set_after_add = leftover
-
- def __call__(self):
- self._processWidgets()
- self._handle_menu()
- self._handle_arguments()
-
- self._context.action(
- discriminator=self._discriminator(),
- callable=AddViewFactory,
- args=self._args()+(self.content_factory, self.arguments,
- self.keyword_arguments,
- self.set_before_add, self.set_after_add),
- kw={'menu': self.menu},
- )
-
-#
-# mixin classes / class factories
-#
-
-class ViewMixinForAttributes(BrowserView):
-
- # we have an attribute that we can simply tell ZPublisher to go to
- def __browser_default__(self, request):
- return self, (self.__page_attribute__,)
-
- # this is technically not needed because ZPublisher finds our
- # attribute through __browser_default__; but we also want to be
- # able to call pages from python modules, PythonScripts or ZPT
- def __call__(self, *args, **kw):
- attr = self.__page_attribute__
- meth = getattr(self, attr)
- return meth(*args, **kw)
-
-class ViewMixinForTemplates(BrowserView):
-
- # short cut to get to macros more easily
- def __getitem__(self, name):
- if name == 'macros':
- return self.index.macros
- return self.index.macros[name]
-
- # make the template publishable
- def __call__(self, *args, **kw):
- return self.index(self, *args, **kw)
-
-def makeClassForTemplate(src, template=None, used_for=None,
- bases=(), cdict=None):
- # XXX needs to deal with security from the bases?
- if cdict is None:
- cdict = {}
- cdict.update({'index': ZopeTwoPageTemplateFile(src, template)})
- bases += (ViewMixinForTemplates,)
- class_ = makeClass("SimpleViewClass from %s" % src, bases, cdict)
-
- if used_for is not None:
- class_.__used_for__ = used_for
-
- return class_
-
Modified: z3/Five/branch/philikon-restructuring/configure.zcml
==============================================================================
--- z3/Five/branch/philikon-restructuring/configure.zcml (original)
+++ z3/Five/branch/philikon-restructuring/configure.zcml Tue Apr 19 01:22:53 2005
@@ -6,7 +6,9 @@
<include file="services.zcml" />
<include file="interfaces.zcml" />
<include file="permissions.zcml" />
- <include file="browser.zcml" />
+ <include package=".browser" />
+ <include package=".form" />
+ <include package=".skin" />
<include package="zope.app.traversing" />
<include package="zope.app.form.browser" />
@@ -30,12 +32,6 @@
provides=".interfaces.IBrowserDefault"
/>
- <adapter
- for=".interfaces.IObjectManager"
- factory=".adding.ObjectManagerNameChooser"
- provides="zope.app.container.interfaces.INameChooser"
- />
-
<!-- this is really lying, but it's to please checkContainer -->
<five:implements class="OFS.ObjectManager.ObjectManager"
interface="zope.app.container.interfaces.IContainer" />
Deleted: /z3/Five/branch/philikon-restructuring/edit.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/edit.pt Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,65 +0,0 @@
-<tal:tag condition="view/update"/>
-<html metal:use-macro="context/@@standard_macros/page">
-<body metal:fill-slot="body">
-
- <div metal:define-macro="body">
-
- <form action="." tal:attributes="action request/URL" method="POST"
- enctype="multipart/form-data">
-
- <div metal:define-macro="formbody">
-
- <h3 tal:condition="view/label"
- tal:content="view/label"
- metal:define-slot="heading"
- >Edit something</h3>
-
- <p tal:define="status view/update"
- tal:condition="status"
- tal:content="status" />
-
- <p tal:condition="view/errors" i18n:translate="">
- There are <strong tal:content="python:len(view.errors)"
- i18n:name="num_errors">6</strong> input errors.
- </p>
-
- <div metal:define-slot="extra_info" tal:replace="nothing">
- </div>
-
- <div class="row"
- metal:define-slot="extra_top" tal:replace="nothing">
- <div class="label">Extra top</div>
- <div class="field"><input type="text" style="width:100%" /></div>
- </div>
-
- <div metal:use-macro="context/@@widget_macros/widget_rows" />
-
- <div class="separator"></div>
-
- <div class="row"
- metal:define-slot="extra_bottom" tal:replace="nothing">
- <div class="label">Extra bottom</div>
- <div class="field"><input type="text" style="width:100%" /></div>
- </div>
- <div class="separator"></div>
- </div>
-
- <div class="row">
- <div class="controls">
- <input type="submit" value="Refresh"
- i18n:attributes="value refresh-button" />
- <input type="submit" name="UPDATE_SUBMIT" value="Change"
- i18n:attributes="value submit-button"/>
- </div>
- </div>
- <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
- </div>
-
- <div class="separator"></div>
-
- </form>
-
- </div>
- </body>
-
-</html>
Deleted: /z3/Five/branch/philikon-restructuring/five_template.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/five_template.pt Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,10 +0,0 @@
-<html metal:define-macro="page">
-<head>
-<metal:block define-slot="style_slot">
-</metal:block>
-</head>
-<body>
-<metal:block define-slot="body">
-</metal:block>
-</body>
-</html>
Modified: z3/Five/branch/philikon-restructuring/fiveconfigure.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/fiveconfigure.py (original)
+++ z3/Five/branch/philikon-restructuring/fiveconfigure.py Tue Apr 19 01:22:53 2005
@@ -12,17 +12,18 @@
$Id$
"""
-
import os
import glob
import warnings
+
from zope.interface import classImplements
from zope.configuration import xmlconfig
from zope.app.component.interface import provideInterface
+
from viewable import Viewable
from traversable import Traversable
from bridge import fromZ2Interface
-from browserconfigure import page
+from browser.metaconfigure import page
def findProducts():
import Products
Copied: z3/Five/branch/philikon-restructuring/form/__init__.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py (original)
+++ z3/Five/branch/philikon-restructuring/form/__init__.py Tue Apr 19 01:22:53 2005
@@ -6,111 +6,29 @@
# License (ZPL) v2.1. See COPYING.txt for more information.
#
##############################################################################
-"""Provide basic browser functionality
+"""Add and edit views
$Id$
"""
-
-# python
import sys
from datetime import datetime
-# Zope 2
import Acquisition
-from Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
+
+from zope.event import notify
+from zope.schema.interfaces import ValidationError
from zope.app.location.interfaces import ILocation
from zope.app.location import LocationProxy
from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
from zope.app.form.browser.submit import Update
from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
from zope.app.form.utility import setUpWidgets, getWidgetsData
from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
- security = ClassSecurityInfo()
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
-
- # XXX do not create any methods on the subclass called index_html,
- # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def __init__(self, context, request):
- self.context, self.request = context, request
-
- implements(IAbsoluteURL)
-
- def __str__(self):
- context = aq_inner(self.context)
- return context.absolute_url()
-
- __call__ = __str__
-
- def breadcrumbs(self):
- context = self.context.aq_inner
- container = context.aq_parent
- request = self.request
-
- name = context.getId()
-
- if container is None or self._isVirtualHostRoot() \
- or not ITraversable.providedBy(container):
- return (
- {'name': name, 'url': context.absolute_url()},)
-
- view = getViewProviding(container, IAbsoluteURL, request)
- base = tuple(view.breadcrumbs())
- base += (
- {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
- return base
-
- def _isVirtualHostRoot(self):
- virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
- if virtualrootpath is None:
- return False
- context = self.context.aq_inner
- return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
- """An adapter for Zope3-style absolute_url using Zope2 methods
-
- This one is just used to stop breadcrumbs from crumbing up
- to the Zope root.
-
- (original: zope.app.traversing.browser.absoluteurl)
- """
-
- def breadcrumbs(self):
- context = self.context
- request = self.request
-
- return ({'name': context.getId(),
- 'url': context.absolute_url()
- },)
+from Products.Five.interfaces import ITraversable
+from Products.Five.browser import BrowserView
+from Products.Five.browser.pagetemplatefile import FivePageTemplateFile
class EditView(BrowserView):
"""Simple edit-view base class
Added: z3/Five/branch/philikon-restructuring/form/configure.zcml
==============================================================================
--- (empty file)
+++ z3/Five/branch/philikon-restructuring/form/configure.zcml Tue Apr 19 01:22:53 2005
@@ -0,0 +1,12 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser">
+
+ <browser:page
+ for="*"
+ name="form_macros"
+ permission="zope2.View"
+ class=".macros.FormMacros"
+ allowed_interface="zope.interface.common.mapping.IItemMapping"
+ />
+
+</configure>
\ No newline at end of file
Copied: z3/Five/branch/philikon-restructuring/form/macros.py (from r10836, z3/Five/branch/philikon-restructuring/skin.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/skin.py (original)
+++ z3/Five/branch/philikon-restructuring/form/macros.py Tue Apr 19 01:22:53 2005
@@ -1,51 +1,16 @@
##############################################################################
#
-# Copyright (c) 2004 Five Contributors. All rights reserved.
+# Copyright (c) 2005 Five Contributors. All rights reserved.
#
# This software is distributed under the terms of the Zope Public
# License (ZPL) v2.1. See COPYING.txt for more information.
#
##############################################################################
-"""Mimick the Zope 3 skinning system in Five.
+"""Form macros
$Id$
"""
-from zope.interface.common.mapping import IItemMapping
-from zope.interface import implements
-from zope.component import getView
-from Products.Five.browser import BrowserView
-
-# this is a verbatim copy of zope.app.basicskin except that it doesn't
-# derive from ``object``
-class Macros:
- implements(IItemMapping)
-
- macro_pages = ()
- aliases = {
- 'view': 'page',
- 'dialog': 'page',
- 'addingdialog': 'page'
- }
-
- def __getitem__(self, key):
- key = self.aliases.get(key, key)
- context = self.context
- request = self.request
- for name in self.macro_pages:
- page = getView(context, name, request)
- try:
- v = page[key]
- except KeyError:
- pass
- else:
- return v
- raise KeyError, key
-
-
-class StandardMacros(BrowserView, Macros):
- macro_pages = ('five_template',
- 'widget_macros',
- 'form_macros',)
+from Products.Five.skin.standardmacros import StandardMacros
# copy of zope.app.form.browser.macros.FormMacros
class FormMacros(StandardMacros):
Copied: z3/Five/branch/philikon-restructuring/form/meta.zcml (from r10836, z3/Five/branch/philikon-restructuring/meta.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/meta.zcml (original)
+++ z3/Five/branch/philikon-restructuring/form/meta.zcml Tue Apr 19 01:22:53 2005
@@ -2,197 +2,12 @@
xmlns="http://namespaces.zope.org/zope"
xmlns:meta="http://namespaces.zope.org/meta">
- <meta:directives namespace="http://namespaces.zope.org/zope">
-
- <meta:directive
- name="permission"
- schema="zope.app.security.metadirectives.IDefinePermissionDirective"
- handler="zope.app.security.metaconfigure.definePermission"
- />
-
- <meta:directive
- name="redefinePermission"
- schema="zope.app.security.metadirectives.IRedefinePermission"
- handler="zope.app.security.metaconfigure.redefinePermission"
- />
-
- <meta:directive
- name="interface"
- schema="zope.app.component.metadirectives.IInterfaceDirective"
- handler="zope.app.component.metaconfigure.interface"
- />
-
- <meta:directive
- name="view"
- schema="zope.app.component.metadirectives.IViewDirective"
- handler="zope.app.component.metaconfigure.view"
- />
-
- <meta:directive
- name="adapter"
- schema="zope.app.component.metadirectives.IAdapterDirective"
- handler="zope.app.component.metaconfigure.adapter"
- />
-
- <meta:directive
- name="subscriber"
- schema="zope.app.component.metadirectives.ISubscriberDirective"
- handler="zope.app.component.metaconfigure.subscriber"
- />
-
- <meta:directive
- name="utility"
- schema="zope.app.component.metadirectives.IUtilityDirective"
- handler="zope.app.component.metaconfigure.utility"
- />
-
- <meta:directive
- name="serviceType"
- schema="zope.app.component.metadirectives.IServiceTypeDirective"
- handler="zope.app.component.metaconfigure.serviceType"
- />
-
- <meta:directive
- name="service"
- schema="zope.app.component.metadirectives.IServiceDirective"
- handler="zope.app.component.metaconfigure.service"
- />
-
- <meta:complexDirective
- name="content"
- schema="zope.app.component.metadirectives.IClassDirective"
- handler=".metaconfigure.ContentDirective"
- >
-
- <meta:subdirective
- name="implements"
- schema="zope.app.component.metadirectives.IImplementsSubdirective"
- />
-
- <meta:subdirective
- name="require"
- schema="zope.app.component.metadirectives.IRequireSubdirective"
- />
-
- <meta:subdirective
- name="allow"
- schema="zope.app.component.metadirectives.IAllowSubdirective"
- />
-
- </meta:complexDirective>
-
- <meta:directive
- name="vocabulary"
- schema="zope.app.schema.metadirectives.IVocabularyDirective"
- handler="zope.app.schema.metaconfigure.vocabulary"
- />
-
- </meta:directives>
-
<meta:directives namespace="http://namespaces.zope.org/browser">
- <meta:directive
- name="layer"
- schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
- handler="zope.app.publisher.browser.metaconfigure.layer"
- />
-
- <meta:directive
- name="skin"
- schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
- handler="zope.app.publisher.browser.metaconfigure.skin"
- />
-
- <meta:directive
- name="defaultSkin"
- schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
- handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
- />
-
- <meta:directive
- name="defaultView"
- schema="zope.app.publisher.browser.metadirectives.IDefaultViewDirective"
- handler=".browserconfigure.defaultView"
- />
-
- <meta:directive
- name="page"
- schema="zope.app.publisher.browser.metadirectives.IPageDirective"
- handler=".browserconfigure.page"
- />
-
- <meta:complexDirective
- name="pages"
- schema="zope.app.publisher.browser.metadirectives.IPagesDirective"
- handler=".browserconfigure.pages"
- >
-
- <meta:subdirective
- name="page"
- schema="zope.app.publisher.browser.metadirectives.IPagesPageSubdirective"
- />
-
- </meta:complexDirective>
-
- <meta:directive
- name="resource"
- schema="zope.app.publisher.browser.metadirectives.IResourceDirective"
- handler=".browserconfigure.resource"
- />
-
- <meta:directive
- name="resourceDirectory"
- schema="zope.app.publisher.browser.metadirectives.IResourceDirectoryDirective"
- handler=".browserconfigure.resourceDirectory"
- />
-
- <meta:directive
- name="menu"
- schema="zope.app.publisher.browser.metadirectives.IMenuDirective"
- handler="zope.app.publisher.browser.globalbrowsermenuservice.menuDirective"
- />
-
- <meta:directive
- name="menuItem"
- schema="zope.app.publisher.browser.metadirectives.IMenuItemDirective"
- handler="zope.app.publisher.browser.globalbrowsermenuservice.menuItemDirective"
- />
-
- <meta:complexDirective
- name="menuItems"
- schema="zope.app.publisher.browser.metadirectives.IMenuItemsDirective"
- handler="zope.app.publisher.browser.globalbrowsermenuservice.menuItemsDirective"
- >
-
- <meta:subdirective
- name="menuItem"
- schema="zope.app.publisher.browser.metadirectives.IMenuItemSubdirective"
- />
-
- </meta:complexDirective>
-
- <meta:complexDirective
- name="view"
- schema="zope.app.publisher.browser.metadirectives.IViewDirective"
- handler=".browserconfigure.view"
- >
-
- <meta:subdirective
- name="page"
- schema="zope.app.publisher.browser.metadirectives.IViewPageSubdirective"
- />
-
- <meta:subdirective
- name="defaultPage"
- schema="zope.app.publisher.browser.metadirectives.IViewDefaultPageSubdirective"
- />
-
- </meta:complexDirective>
-
<meta:complexDirective
name="editform"
schema="zope.app.form.browser.metadirectives.IEditFormDirective"
- handler=".browserconfigure.EditFormDirective"
+ handler=".metaconfigure.EditFormDirective"
>
<meta:subdirective
@@ -205,7 +20,7 @@
<meta:complexDirective
name="addform"
schema="zope.app.form.browser.metadirectives.IAddFormDirective"
- handler=".browserconfigure.AddFormDirective"
+ handler=".metaconfigure.AddFormDirective"
>
<meta:subdirective
@@ -217,73 +32,4 @@
</meta:directives>
-
- <meta:directives namespace="http://namespaces.zope.org/five">
-
- <!-- specific to Five -->
-
- <meta:directive
- name="loadProducts"
- schema="zope.interface.Interface"
- handler=".fiveconfigure.loadProducts"
- />
-
- <meta:directive
- name="loadProductsOverrides"
- schema="zope.interface.Interface"
- handler=".fiveconfigure.loadProductsOverrides"
- />
-
- <meta:directive
- name="implements"
- schema=".fivedirectives.IImplementsDirective"
- handler=".fiveconfigure.implements"
- />
-
- <meta:directive
- name="defaultViewable"
- schema=".fivedirectives.IDefaultViewableDirective"
- handler=".fiveconfigure.defaultViewable"
- />
-
- <meta:directive
- name="traversable"
- schema=".fivedirectives.ITraversableDirective"
- handler=".fiveconfigure.traversable"
- />
-
- <meta:directive
- name="sendEvents"
- schema=".fivedirectives.ISendEventsDirective"
- handler=".eventconfigure.sendEvents"
- />
-
- <meta:directive
- name="sizable"
- schema=".fivedirectives.ISendEventsDirective"
- handler=".sizeconfigure.sizable"
- />
-
- <meta:directive
- name="pagesFromDirectory"
- schema=".fivedirectives.IPagesFromDirectoryDirective"
- handler=".fiveconfigure.pagesFromDirectory"
- />
-
- <!-- viewable is deprecated, use traversable instead -->
-
- <meta:directive
- name="viewable"
- schema=".fivedirectives.ITraversableDirective"
- handler=".fiveconfigure.viewable"
- />
-
- <meta:directive
- name="bridge"
- schema=".fivedirectives.IBridgeDirective"
- handler=".fiveconfigure.bridge"
- />
-
- </meta:directives>
-
</configure>
Copied: z3/Five/branch/philikon-restructuring/form/metaconfigure.py (from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browserconfigure.py (original)
+++ z3/Five/branch/philikon-restructuring/form/metaconfigure.py Tue Apr 19 01:22:53 2005
@@ -6,424 +6,25 @@
# License (ZPL) v2.1. See COPYING.txt for more information.
#
##############################################################################
-"""Browser directives
-
-Directives to emulate the 'http://namespaces.zope.org/browser'
-namespace in ZCML known from zope.app.
+"""Edit form directives
$Id$
"""
-import os
+import ExtensionClass
-from zope.interface import Interface
-from zope.component import getGlobalService, ComponentLookupError
-from zope.configuration.exceptions import ConfigurationError
+from zope.component import getGlobalService
from zope.component.servicenames import Presentation
from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.app.publisher.browser.viewmeta import pages as zope_app_pages
-from zope.app.publisher.browser.viewmeta import view as zope_app_view
-from zope.app.publisher.browser.globalbrowsermenuservice import\
+from zope.app.publisher.browser.globalbrowsermenuservice import \
menuItemDirective
-from zope.app.component.metaconfigure import handler
-from zope.app.component.interface import provideInterface
from zope.app.form.browser.metaconfigure import BaseFormDirective
from zope.app.container.interfaces import IAdding
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
- initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
-
-import ExtensionClass
-
-def page(_context, name, permission, for_,
- layer='default', template=None, class_=None,
- allowed_interface=None, allowed_attributes=None,
- attribute='__call__', menu=None, title=None,
- ):
-
- try:
- s = getGlobalService(Presentation)
- except ComponentLookupError, err:
- pass
-
- _handle_menu(_context, menu, title, [for_], name, permission)
-
- if not (class_ or template):
- raise ConfigurationError("Must specify a class or template")
- if allowed_attributes is None:
- allowed_attributes = []
- if allowed_interface is not None:
- for interface in allowed_interface:
- attrs = [n for n, d in interface.namesAndDescriptions(1)]
- allowed_attributes.extend(attrs)
-
- if attribute != '__call__':
- if template:
- raise ConfigurationError(
- "Attribute and template cannot be used together.")
-
- if not class_:
- raise ConfigurationError(
- "A class must be provided if attribute is used")
-
- if template:
- template = os.path.abspath(str(_context.path(template)))
- if not os.path.isfile(template):
- raise ConfigurationError("No such file", template)
-
- if class_:
- # new-style classes do not work with Five. As we want to import
- # packages from z3 directly, we ignore new-style classes for now.
- if type(class_) == type:
- return
- if attribute != '__call__':
- if not hasattr(class_, attribute):
- raise ConfigurationError(
- "The provided class doesn't have the specified attribute "
- )
- cdict = getSecurityInfo(class_)
- if template:
- new_class = makeClassForTemplate(template, bases=(class_, ),
- cdict=cdict)
- elif attribute != "__call__":
- # we're supposed to make a page for an attribute (read:
- # method) and it's not __call__. We thus need to create a
- # new class using our mixin for attributes.
- cdict.update({'__page_attribute__': attribute})
- new_class = makeClass(class_.__name__,
- (class_, ViewMixinForAttributes),
- cdict)
-
- # in case the attribute does not provide a docstring,
- # ZPublisher refuses to publish it. So, as a workaround,
- # we provide a stub docstring
- func = getattr(new_class, attribute)
- if not func.__doc__:
- # cannot test for MethodType/UnboundMethod here
- # because of ExtensionClass
- if hasattr(func, 'im_func'):
- # you can only set a docstring on functions, not
- # on method objects
- func = func.im_func
- func.__doc__ = "Stub docstring to make ZPublisher work"
- else:
- # we could use the class verbatim here, but we'll execute
- # some security declarations on it so we really shouldn't
- # modify the original. So, instead we make a new class
- # with just one base class -- the original
- new_class = makeClass(class_.__name__, (class_,), cdict)
-
- else:
- # template
- new_class = makeClassForTemplate(template)
-
- _handle_for(_context, for_)
-
- _context.action(
- discriminator = ('view', for_, name, IBrowserRequest, layer),
- callable = handler,
- args = (Presentation, 'provideAdapter',
- IBrowserRequest, new_class, name, [for_], Interface, layer,
- _context.info),
- )
- _context.action(
- discriminator = ('five:protectClass', new_class),
- callable = protectClass,
- args = (new_class, permission)
- )
- if allowed_attributes:
- for attr in allowed_attributes:
- _context.action(
- discriminator = ('five:protectName', new_class, attr),
- callable = protectName,
- args = (new_class, attr, permission)
- )
- _context.action(
- discriminator = ('five:initialize:class', new_class),
- callable = initializeClass,
- args = (new_class,)
- )
-
-class pages(zope_app_pages):
-
- def page(self, _context, name, attribute='__call__', template=None,
- menu=None, title=None):
- return page(_context,
- name=name,
- attribute=attribute,
- template=template,
- menu=menu, title=title,
- **(self.opts))
-
-def defaultView(_context, name, for_=None):
-
- type = IBrowserRequest
-
- _context.action(
- discriminator = ('defaultViewName', for_, type, name),
- callable = handler,
- args = (Presentation,
- 'setDefaultViewName', for_, type, name),
- )
-
- _handle_for(_context, for_)
-
-# view (named view with pages)
+from Products.Five.form import EditView, AddView
+from Products.Five.metaclass import makeClass
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser.metaconfigure import makeClassForTemplate
-class view(zope_app_view):
-
- def __call__(self):
- (_context, name, for_, permission, layer, class_,
- allowed_interface, allowed_attributes) = self.args
-
- required = {}
-
- cdict = {}