[Zope3-checkins] CVS: Zope3/src/zope/app/browser/form - metadirectives.py:1.3 add.py:1.27 addwizard.py:1.7 editview.py:1.32 editwizard.py:1.10 meta.zcml:1.20 schemadisplay.py:1.8

Philipp von Weitershausen philikon at philikon.de
Sat Aug 2 23:13:40 EDT 2003


Update of /cvs-repository/Zope3/src/zope/app/browser/form
In directory cvs.zope.org:/tmp/cvs-serv23732/browser/form

Modified Files:
	add.py addwizard.py editview.py editwizard.py meta.zcml 
	schemadisplay.py 
Added Files:
	metadirectives.py 
Log Message:
Here we go again. All tests have been run twice and passed. Sorry again for
the trouble I've caused. Anthony and Steve, I owe you guys are beer.

Converted the three most important packages that define ZCML directives
to the new ZCML architecture (using schemas):

- zope.app.component

- zope.app.browser.form

- zope.app.publisher.browser


=== Zope3/src/zope/app/browser/form/metadirectives.py 1.2 => 1.3 ===
--- /dev/null	Sat Aug  2 22:13:38 2003
+++ Zope3/src/zope/app/browser/form/metadirectives.py	Sat Aug  2 22:13:02 2003
@@ -0,0 +1,306 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+
+from zope.interface import Interface
+from zope.configuration.fields import GlobalObject, Tokens, Path, \
+     Bool, PythonIdentifier
+from zope.schema import Text, TextLine, Id
+
+from zope.app.component.metadirectives import IBasicViewInformation
+
+class ICommonInformation(Interface):
+    """
+    Common information for all successive directives
+    """
+
+    name = TextLine(
+        title=u"Name",
+        description=u"The name of the generated view.",
+        required=True
+        )
+
+    schema = GlobalObject(
+        title=u"Schema",
+        description=u"The schema from which the form is generated.",
+        required=True
+        )
+
+    for_ = GlobalObject(
+        title=u"Interface",
+        description=u"""
+        The interface this page (view) applies to.
+
+        The view will be for all objects that implement this
+        interface. The schema is used if the for attribute is not
+        specified.
+
+        If the for attribute is specified, then the objects views must
+        implement or be adaptable to the schema.""",
+        required=False
+        )
+
+    permission = Id(
+        title=u"Permission",
+        description=u"The permission needed to use the view.",
+        required=True
+        )
+
+    layer = TextLine(
+        title=u"Layer",
+        description=u"The later the view is in. Default: 'default'",
+        required=False
+        )
+
+    template = Path(
+        title=u"Template",
+        description=u"An alternate template to use for the form.",
+        required=False
+        )
+
+    class_ = GlobalObject(
+        title=u"Class",
+        description=u"""
+        A class to provide custom widget definitions or methods to be
+        used by a custom template.
+
+        This class is used as a mix-in class. As a result, it needn't
+        subclass any special classes, such as BrowserView.""",
+        required=False
+        )
+
+class ICommonFormInformation(ICommonInformation):
+    """
+    Common information for browser forms
+    """
+
+    title = TextLine(
+        title=u"Title",
+        description=u"The browser menu label for the form.",
+        required=False
+        )
+
+    label = TextLine(
+        title=u"Label",
+        description=u"A label to be used as the heading for the form.",
+        required=False
+        )
+
+    menu = TextLine(
+        title=u"The browser menu to include the form in.",
+        description=u"""
+        Many views are included in menus. It's convenient to name the
+        menu in the page directive, rather than having to give a
+        separate menuItem directive.""",
+        required=False
+        )
+
+    fields = Tokens(
+        title=u"Fields",
+        description=u"""
+        The fields and the order in which to display them.  If this is
+        not specified, all schema fields will be displayed in the
+        order specified in the schema itself.""",
+        required=False,
+        value_type=PythonIdentifier()
+        )
+
+class ICommonWizardInformation(ICommonInformation):
+    """
+    Common information for browser wizards
+    """
+
+    menu = TextLine(
+        title=u"The browser menu to include the form in.",
+        description=u"""
+        Many views are included in menus. It's convenient to name the
+        menu in the page directive, rather than having to give a
+        separate menuItem directive.""",
+        required=False
+        )
+
+    description = Text(
+        title=u"A longer description of the add form.",
+        description=u"""
+        A UI may display this with the item or display it when the
+        user requests more assistance.""",
+        required=False
+        )
+
+    use_session = Bool(
+        title=u"Use session",
+        description=u"""
+        If 'no', hidden input controls are used to maintain state
+        between panes in the wizard. Only simple data types can
+        be propagated with this method.
+
+        Defaults to 'yes'.""",
+        required=False
+        )
+
+class ICommonAddInformation(Interface):
+    """
+    Common information for add forms/wizards
+    """
+
+    content_factory = GlobalObject(
+        title=u"Content factory",
+        description=u"""
+        An object to call to create new content objects.
+
+        This attribute isn't used if a class is specified that
+        implements createAndAdd.""",
+        required=False
+        )
+
+    arguments = Tokens(
+        title=u"Arguments",
+        description=u"""
+        A list of field names to supply as positional arguments to the
+        factory.""",
+        required=False,
+        value_type=PythonIdentifier()
+        )
+
+    keyword_arguments = Tokens(
+        title=u"Keyword arguments",
+        description=u"""
+        A list of field names to supply as keyword arguments to the
+        factory.""",
+        required=False,
+        value_type=PythonIdentifier()
+        )
+
+    set_before_add = Tokens(
+        title=u"Set before add",
+        description=u"""
+        A list of fields to be assigned to the newly created object
+        before it is added.""",
+        required=False,
+        value_type=PythonIdentifier()        
+        )
+
+    set_after_add = Tokens(
+        title=u"Set after add",
+        description=u"""
+        A list of fields to be assigned to the newly created object
+        after it is added.""",
+        required=False,
+        value_type=PythonIdentifier()
+        )
+
+class IAddWizardDirective(ICommonWizardInformation, ICommonAddInformation):
+    """
+    Define an automatically generated add wizard (multi-page form)
+
+    The addwizard directive creates and registers a view for adding an
+    object based on a schema.
+
+    Adding an object is a bit trickier than editing an object, because
+    the object the schema applies to isn't available when forms are
+    being rendered.  The addwizard directive provides an customization
+    interface to overcome this difficulty.
+
+    See zope.app.interfaces.browser.form.IAddFormCustomization.
+    """
+
+class IEditWizardDirective(ICommonWizardInformation):
+    """
+    Define an automatically generated edit wizard (multi-page form).
+
+    The editwizard directive creates and register's a view for editing
+    an object based on a schema.
+    """
+
+    title = TextLine(
+        title=u"The browser menu label for the edit form",
+        description=u"This attribute defaults to 'Edit'.",
+        required=False
+        )
+
+class IPaneSubdirective(Interface):
+    """
+    Define a Pane (page) of the wizard
+    """
+
+    label = TextLine(
+        title=u"Label",
+        description=u"The label used as the heading on this pane",
+        required=False,
+        )
+
+class IEditFormDirective(ICommonFormInformation):
+    """
+    Define an automatically generated edit form
+
+    The editform directive creates and register's a view for editing
+    an object based on a schema.
+    """
+
+#XXX this is sooo not used
+class ISubeditFormDirective(ICommonInformation):
+    """
+    Define a subedit form
+    """
+
+    label = TextLine(
+        title=u"Label",
+        description=u"A label to be used as the heading for the form.",
+        required=False
+        )
+
+    #XXX what's this?
+    fulledit = Text()
+
+    #XXX what's this?
+    fulledit_label = Text()
+
+class IAddFormDirective(ICommonFormInformation, ICommonAddInformation):
+    """
+    Define an automatically generated add form
+
+    The addform directive creates and registers a view for adding an
+    object based on a schema.
+
+    Adding an object is a bit trickier than editing an object, because
+    the object the schema applies to isn't available when forms are
+    being rendered.  The addform directive provides an customization
+    interface to overcome this difficulty.
+
+    See zope.app.interfaces.browser.form.IAddFormCustomization.
+    """
+
+    description = Text(
+        title=u"A longer description of the add form.",
+        description=u"""
+        A UI may display this with the item or display it when the
+        user requests more assistance.""",
+        required=False
+        )
+
+class ISchemaDisplayDirective(ICommonFormInformation):
+    """
+    Define an automatically generated display form.
+
+    The schemadisplay directive creates and register's a view for
+    displaying an object based on a schema.
+    """
+
+    title = TextLine(
+        title=u"The browser menu label for the edit form",
+        description=u"This attribute defaults to 'Edit'.",
+        required=False
+        )


=== Zope3/src/zope/app/browser/form/add.py 1.26 => 1.27 ===
--- Zope3/src/zope/app/browser/form/add.py:1.26	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/add.py	Sat Aug  2 22:13:02 2003
@@ -19,11 +19,11 @@
 
 from zope.schema.interfaces import ValidationError
 
+from zope.app.interfaces.container import IAdding
 from zope.app.event import publish
 from zope.app.event.objectevent import ObjectCreatedEvent
 from zope.app.interfaces.form import WidgetsError
 from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.configuration.action import Action
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 from zope.security.checker import defineChecker, NamesChecker
 from zope.component import getAdapter
@@ -81,26 +81,29 @@
         """
         
         args = []
-        for name in self._arguments:
-            args.append(data[name])
+        if self._arguments:
+            for name in self._arguments:
+                args.append(data[name])
 
         kw = {}
-        for name in self._keyword_arguments:
-            if name in data:
-                kw[str(name)] = data[name]
+        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 = getAdapter(content, self.schema, context=self.context)
 
         errors = []
 
-        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 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)
@@ -111,13 +114,14 @@
 
         adapted = getAdapter(content, self.schema)
 
-        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 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)
@@ -165,12 +169,10 @@
 
 def add(_context, name, schema, content_factory='', label='',
         permission = 'zope.Public', layer = "default",
-        class_ = None, for_ = 'zope.app.interfaces.container.IAdding',
-        template = None, omit=None, fields=None,
-        arguments='', keyword_arguments='',
-        set_before_add='', set_after_add='',
-        menu=None, title=None, description='',
-        ):
+        class_ = None, for_ = IAdding,
+        template = None, fields=None, arguments=None, keyword_arguments=None,
+        set_before_add=None, set_after_add=None,
+        menu=None, title=None, description=''):
 
     # Handle menu attrs. We do this now to rather than later becaise
     # menuItemDirective expects a dotted name for for_. 
@@ -178,24 +180,16 @@
         if (not menu) or (not title):
             raise ValueError("If either menu or title are specified, "
                              "they must both be specified")
-        actions = menuItemDirective(
+        menuItemDirective(
             _context, menu, for_, '@@' + name, title,
             permission=permission, description=description)
-    else:
-        actions = []
-
 
-    content_factory = (content_factory and _context.resolve(content_factory)
-                       or None)
-
-    schema, for_, bases, template, fields = normalize(
-        _context, schema, for_, class_, template, 'add.pt', fields, omit,
-        AddView)
+    for_, bases, template, fields = normalize(
+        for_, schema, class_, template, 'add.pt', fields, AddView)
 
     leftover = fields
 
     if arguments:
-        arguments = arguments.split()
         missing = [n for n in arguments if n not in fields]
         if missing:
             raise ValueError("Some arguments are not included in the form",
@@ -208,7 +202,6 @@
         leftover = [n for n in leftover if n not in arguments]
 
     if keyword_arguments:
-        keyword_arguments = keyword_arguments.split()
         missing = [n for n in keyword_arguments if n not in fields]
         if missing:
             raise ValueError(
@@ -217,7 +210,6 @@
         leftover = [n for n in leftover if n not in keyword_arguments]
 
     if set_before_add:
-        set_before_add = set_before_add.split()
         missing = [n for n in set_before_add if n not in fields]
         if missing:
             raise ValueError(
@@ -226,7 +218,6 @@
         leftover = [n for n in leftover if n not in set_before_add]
 
     if set_after_add:
-        set_after_add = set_after_add.split()
         missing = [n for n in set_after_add if n not in fields]
         if missing:
             raise ValueError(
@@ -237,19 +228,12 @@
         set_after_add += leftover
 
     else:
-
         set_after_add = leftover
 
-        
-
-    actions += [
-        Action(
+    _context.action(
         discriminator = ('view', for_, name, IBrowserPresentation, layer),
         callable = AddViewFactory,
         args = (name, schema, label, permission, layer, template, 'add.pt',
                 bases, for_, fields, content_factory, arguments,
                 keyword_arguments, set_before_add, set_after_add),
         )
-        ]
-
-    return actions


=== Zope3/src/zope/app/browser/form/addwizard.py 1.6 => 1.7 ===
--- Zope3/src/zope/app/browser/form/addwizard.py:1.6	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/addwizard.py	Sat Aug  2 22:13:02 2003
@@ -24,7 +24,6 @@
 from zope.app.event.objectevent import ObjectCreatedEvent
 from zope.app.interfaces.form import WidgetsError
 from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.configuration.action import Action
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 from zope.security.checker import defineChecker, NamesChecker
 from zope.component import getAdapter
@@ -176,21 +175,16 @@
             if (not menu) or (not title):
                 raise ValueError("If either menu or title are specified, "
                                 "they must both be specified")
-            actions = menuItemDirective(
+            menuItemDirective(
                 _context, menu, for_, '@@' + name, title,
                 permission=permission, description=description)
-        else:
-            actions = []
 
-        self.content_factory = (
-            content_factory and _context.resolve(content_factory) or None
-            )
+        self.content_factory = content_factory
 
-        schema, for_, bases, template, fields = normalize(
-            _context, schema, for_, class_, template, 'addwizard.pt', 
-            fields=None, omit=None, view=AddWizardView
-            )
+        for_, bases, template, fields = normalize(
+            for_, schema, class_, template, 'addwizard.pt', view=AddWizardView)
 
+        self._context = _context
         self.schema = schema
         self.for_ = for_
         self.bases = bases
@@ -201,10 +195,8 @@
         self.keyword_arguments = keyword_arguments
  
         self.panes = []
-        self.actions = actions
 
     def pane(self, _context, fields, label=''):
-        fields = [str(f) for f in fields.split(' ')]
         for f in fields:
             if f not in self.all_fields:
                 raise ValueError(
@@ -212,7 +204,6 @@
                     name, self.schema
                     )
         self.panes.append(Pane(fields, label))
-        return []
 
     def __call__(self):
 
@@ -224,7 +215,6 @@
 
         arguments = self.arguments
         if arguments:
-            arguments = arguments.split()
             missing = [n for n in arguments if n not in fields]
             if missing:
                 raise ValueError("Some arguments are not included in the form",
@@ -238,7 +228,6 @@
 
         keyword_arguments = self.keyword_arguments
         if keyword_arguments:
-            keyword_arguments = keyword_arguments.split()
             missing = [n for n in keyword_arguments if n not in fields]
             if missing:
                 raise ValueError(
@@ -248,7 +237,6 @@
 
         set_before_add = self.set_before_add
         if set_before_add:
-            set_before_add = set_before_add.split()
             missing = [n for n in set_before_add if n not in fields]
             if missing:
                 raise ValueError(
@@ -258,7 +246,6 @@
 
         set_after_add = self.set_after_add
         if set_after_add:
-            set_after_add = set_after_add.split()
             missing = [n for n in set_after_add if n not in fields]
             if missing:
                 raise ValueError(
@@ -272,22 +259,13 @@
 
             set_after_add = leftover
 
-        self.actions.append(
-            Action(
-                discriminator=(
-                    'view', self.for_, self.name, IBrowserPresentation, 
-                    self.layer
-                    ),
-                callable=AddWizardViewFactory,
-                args=(
-                    self.name, self.schema, self.permission, self.layer, 
-                    self.panes, self.all_fields, self.template, 'editwizard.pt',
-                    self.bases, self.for_, self.content_factory, arguments,
-                    keyword_arguments, self.set_before_add, self.set_after_add,
-                    self.use_session,
-                    )
-                )
+        self._context.action(
+            discriminator=('view', self.for_, self.name, IBrowserPresentation, 
+                           self.layer),
+            callable=AddWizardViewFactory,
+            args=(self.name, self.schema, self.permission, self.layer, 
+                  self.panes, self.all_fields, self.template, 'editwizard.pt',
+                  self.bases, self.for_, self.content_factory, arguments,
+                  keyword_arguments, self.set_before_add, self.set_after_add,
+                  self.use_session)
             )
-        return self.actions
-
-


=== Zope3/src/zope/app/browser/form/editview.py 1.31 => 1.32 ===
--- Zope3/src/zope/app/browser/form/editview.py:1.31	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/editview.py	Sat Aug  2 22:13:02 2003
@@ -25,7 +25,6 @@
 
 from zope.interface import classProvides, implements
 
-from zope.configuration.action import Action
 from zope.app.context import ContextWrapper
 from zope.publisher.interfaces.browser import IBrowserPresentation
 from zope.publisher.browser import BrowserView
@@ -34,7 +33,6 @@
 from zope.component import getAdapter
 
 from zope.app.interfaces.form import WidgetsError
-from zope.app.component.metaconfigure import resolveInterface
 from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
 from zope.app.browser.form.submit import Update
 from zope.app.event import publish
@@ -45,7 +43,6 @@
 from zope.app.publisher.browser.globalbrowsermenuservice \
      import menuItemDirective, globalBrowserMenuService
 
-
 class EditView(BrowserView):
     """Simple edit-view base class
 
@@ -62,7 +59,6 @@
 
     def __init__(self, context, request):
         super(EditView, self).__init__(context, request)
-
         self._setUpWidgets()
 
     def _setUpWidgets(self):
@@ -117,7 +113,6 @@
         self.update_status = status
         return status
 
-
 def EditViewFactory(name, schema, label, permission, layer,
                     template, default_template, bases, for_, fields,
                     fulledit_path=None, fulledit_label=None, menu=u'',
@@ -146,93 +141,68 @@
     provideView(for_, name, IBrowserPresentation, class_, layer)
 
 
-def normalize(_context, schema_, for_, class_, template, default_template,
-              fields, omit, view=EditView):
-    schema = resolveInterface(_context, schema_)
-
+def normalize(for_, schema, class_, template, default_template, fields, view=EditView):
     if for_ is None:
         for_ = schema
-    else:
-        for_ = resolveInterface(_context, for_)
 
     if class_ is None:
         bases = view,
     else:
-        # XXX What about class_.__implements__ ?
-        bases = _context.resolve(class_), view
+        bases = (class_, view)
 
     if template is not None:
-        template = _context.path(template)
         template = os.path.abspath(str(template))
         if not os.path.isfile(template):
             raise ConfigurationError("No such file", template)
     else:
         template = default_template
 
-
-
     names = getFieldNamesInOrder(schema)
 
     if fields:
-        fields = fields.split()
         for name in fields:
             if name not in names:
                 raise ValueError("Field name is not in schema",
-                                 name, schema_)
+                                 name, schema)
     else:
         fields = names
 
-    if omit:
-        omit = omit.split()
-        for name in omit:
-            if name not in names:
-                raise ValueError("Field name is not in schema",
-                                 name, schema_)
-        fields = [name for name in fields if name not in omit]
-
-    return schema, for_, bases, template, fields
+    return (for_, bases, template, fields)
 
 def edit(_context, name, schema, permission, label='',
-         layer = "default",
-         class_ = None, for_ = None,
-         template = None, omit=None, fields=None,
+         layer = "default", class_ = None, for_ = None,
+         template = None, fields=None,
          menu=None, title='Edit', usage=u''):
 
     if menu:
-        actions = menuItemDirective(
+        menuItemDirective(
             _context, menu, for_ or schema, '@@' + name, title,
             permission=permission)
-    else:
-        actions = []
 
-    schema, for_, bases, template, fields = normalize(
-        _context, schema, for_, class_, template, 'edit.pt', fields, omit)
+    for_, bases, template, fields = normalize(
+        for_, schema, class_, template, 'edit.pt', fields)
 
-    actions.append(
-        Action(
-        discriminator=('view', for_, name, IBrowserPresentation, layer),
+    _context.action(
+        #XXX added schema to descriminator to make it unique
+        # don't know whether that's a Good Thing(tm) -- philiKON
+        discriminator=('view', for_, name, schema,
+                       IBrowserPresentation, layer),
         callable=EditViewFactory,
         args=(name, schema, label, permission, layer, template, 'edit.pt',
               bases, for_, fields, menu, usage),
         )
-        )
-
-    return actions
 
 def subedit(_context, name, schema, label,
             permission='zope.Public', layer="default",
-            class_=None, for_=None,
-            template=None, omit=None, fields=None,
+            class_=None, for_=None, template=None, fields=None,
             fulledit=None, fulledit_label=None):
 
-    schema, for_, bases, template, fields = normalize(
-        _context, schema, for_, class_, template, 'subedit.pt', fields, omit)
+    for_, bases, template, fields = normalize(
+        for_, schema, class_, template, 'subedit.pt', fields)
 
-    return [
-        Action(
+    _context.action(
         discriminator=('view', for_, name, IBrowserPresentation, layer),
         callable=EditViewFactory,
         args=(name, schema, label, permission, layer, template, 'subedit.pt',
               bases, for_, fields, fulledit, fulledit_label),
         )
-        ]


=== Zope3/src/zope/app/browser/form/editwizard.py 1.9 => 1.10 ===
--- Zope3/src/zope/app/browser/form/editwizard.py:1.9	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/editwizard.py	Sat Aug  2 22:13:02 2003
@@ -22,7 +22,6 @@
 from zope.component import getAdapter
 from zope.app.publisher.browser.globalbrowsermenuservice \
      import menuItemDirective, globalBrowserMenuService
-from zope.configuration.action import Action
 from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 from editview import normalize, EditViewFactory, EditView
@@ -249,11 +248,10 @@
         else:
             actions = []
 
-        schema, for_, bases, template, fields = normalize(
-            _context, schema, for_, class_, template, 'editwizard.pt', 
-            fields=None, omit=None, view=EditWizardView
-            )
+        for_, bases, template, fields = normalize(
+            for_, schema, class_, template, 'editwizard.pt', view=EditWizardView)
 
+        self._context = _context
         self.schema = schema
         self.for_ = for_
         self.bases = bases
@@ -264,8 +262,6 @@
         self.actions = actions
 
     def pane(self, _context, fields, label=''):
-        fields = [str(f) for f in fields.split(' ')]
-
         for f in fields:
             if f not in self.all_fields:
                 raise ValueError(
@@ -273,25 +269,16 @@
                     name, self.schema
                     )
         self.panes.append(Pane(fields, label))
-        return []
 
     def __call__(self):
-        self.actions.append(
-            Action(
-                discriminator=(
-                    'view', self.for_, self.name, IBrowserPresentation, 
-                    self.layer
-                    ),
-                callable=EditWizardViewFactory,
-                args=(
-                    self.name, self.schema, self.permission, self.layer, 
-                    self.panes, self.all_fields, self.template, 'editwizard.pt',
-                    self.bases, self.for_, self.menu, u'', self.use_session
-                    )
-                )
+        self._context.action(
+            discriminator=(
+            'view', self.for_, self.name, IBrowserPresentation, self.layer),
+            callable=EditWizardViewFactory,
+            args=(self.name, self.schema, self.permission, self.layer, 
+                  self.panes, self.all_fields, self.template, 'editwizard.pt',
+                  self.bases, self.for_, self.menu, u'', self.use_session)
             )
-        return self.actions
-
 
 def EditWizardViewFactory(name, schema, permission, layer,
                     panes, fields, template, default_template, bases, for_, 


=== Zope3/src/zope/app/browser/form/meta.zcml 1.19 => 1.20 ===
--- Zope3/src/zope/app/browser/form/meta.zcml:1.19	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/meta.zcml	Sat Aug  2 22:13:02 2003
@@ -1,674 +1,60 @@
-<zopeConfigure xmlns='http://namespaces.zope.org/zope'>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta"
+    >
+
+  <meta:directives namespace="http://namespaces.zope.org/browser">
+
+    <meta:complexDirective
+        name="addwizard"
+        schema=".metadirectives.IAddWizardDirective"
+        handler="zope.app.browser.form.addwizard.AddWizardDirective"
+        >
+
+      <meta:subdirective
+          name="pane"
+          schema=".metadirectives.IPaneSubdirective"
+          />
+
+    </meta:complexDirective>
+
+    <meta:complexDirective
+        name="editwizard"
+        schema=".metadirectives.IEditWizardDirective"
+        handler="zope.app.browser.form.editwizard.EditWizardDirective"
+        >
+
+      <meta:subdirective
+          name="pane"
+          schema=".metadirectives.IPaneSubdirective"
+          />
+
+    </meta:complexDirective>
+
+    <meta:directive
+        name="editform"
+        schema=".metadirectives.IEditFormDirective"
+        handler=".editview.edit"
+        />
+
+    <meta:directive
+        name="subeditform"
+        schema=".metadirectives.ISubeditFormDirective"
+        handler=".editview.subedit"
+        />
+
+    <meta:directive
+        name="addform"
+        schema=".metadirectives.IAddFormDirective"
+        handler=".add.add"
+        />
+
+    <meta:directive
+        name="schemadisplay"
+        schema=".metadirectives.ISchemaDisplayDirective"
+        handler=".schemadisplay.display"
+        />
 
-  <directives namespace="http://namespaces.zope.org/browser">
+  </meta:directives>
 
-    <directive name="addwizard"
-       handler="zope.app.browser.form.addwizard.AddWizardDirective">
-
-      <description>
-        Define an automatically generated add wizard (multi-page form)
-
-        The addwizard directive creates and registers a view for
-        adding an object based on a schema.
-
-        Adding an object is a bit trickier than editing an object,
-        because the object the schema applies to isn't available when
-        forms are being rendered.  The addwizard directive provides an
-        customization interface to overcome this difficulty.
-
-        See zope.app.interfaces.browser.form.IAddFormCustomization.
-      </description>
-
-      <attribute name="name" required="yes">
-        <description>
-          The name of the generated add view.
-        </description>
-      </attribute>
-
-      <attribute name="schema" required="yes">
-        <description>
-        The schema from which the add form is generated.
-
-        A schema is an interface that includes fields.
-        </description>
-      </attribute>
-
-      <attribute name="for" required="no">
-        <description>
-        The interface this page (view) applies to.
-
-        The view will be for all objects that implement this interface.
-
-        zope.app.interfaces.container.IAdding is used if this
-        attribute isn't specified.  If this attribute is specified,
-        then either the named interface must extend IAdding or a class
-        attribute must be used to supply a class implements certain
-        methods described in
-        zope.app.interfaces.browser.form.IAddFormCustomization.
-
-        The schema is used if the for attribute is not specified.
-
-        If the for attribute is specified, then the objects views must
-        implement or be adaptable to the schema.
-        </description>
-      </attribute>
-
-      <attribute name="layer" required="no">
-        <description>
-          The layer the view is in.
-
-          A skin is composed of layers. It is common to put skin specific
-          views in a layer named after the skin. If the 'layer' attribute
-          is not supplied, it defaults to 'default'.
-        </description>
-      </attribute>
-
-      <attribute name="permission" required="yes">
-        <description>
-          The permission needed to use the view. 
-        </description>
-      </attribute>
-
-      <attribute name="template" required="no">
-        <description>
-          An alternate template to use for the add form.
-
-          XXX Need to document how to extend the default.
-        </description>
-      </attribute>
-
-      <attribute name="class" required="no">
-        <description>
-          A class to provide custom widget definitions or methods to be
-          used by a custom template.
-
-          This class can override methods defined in IAddFormCustomization.
-
-          This class is used as a mix-in class. As a result, it needn't
-          subclass any special classes, such as BrowserView.
-        </description>
-      </attribute>
-
-      <attribute name="content_factory" required="no">
-        <description>
-          The dotted name of an object to call to create new content objects.
-
-          This attribute isn't used if a class is specified that
-          implements createAndAdd.
-          </description>
-        </attribute>
-
-      <attribute name="arguments" required="no">
-        <description>
-          A list of field names to supply as positional arguments to
-          the factory.
-        </description>
-      </attribute>
-
-      <attribute name="keyword_arguments" required="no">
-        <description>
-          A list of field names to supply as keyword arguments to
-          the factory.
-        </description>
-      </attribute>
-
-      <attribute name="set_before_add" required="no">
-        <description>
-          A list of fields to be assigned to the newly created object
-          before it is added.
-        </description>
-      </attribute>
-
-      <attribute name="set_after_add" required="no">
-        <description>
-          A list of fields to be assigned to the newly created object
-          after it is added.
-        </description>
-      </attribute>
-
-      <attribute name="menu" required="no">
-        <description>
-          The browser menu to include the add form in.
-
-          Many views are included in menus. It's convenient to name
-          the menu in the page directive, rather than having to give a
-          separate menuItem directive.
-        </description>
-      </attribute>
-
-      <attribute name="description" required="no">
-        <description>
-         A longer description of the add form.
-
-          A UI may display this with the item or display it when the
-          user requests more assistance.
-        </description>
-        </attribute>
-
-
-      <attribute name="use_session" required="no">
-        <description>
-          If 'no', hidden input controls are used to maintain state
-          between panes in the wizard. Only simple data types can
-          be propagated with this method.
-
-          Defaults to 'yes'.
-        </description>
-      </attribute>
-
-      <subdirective name="pane" 
-        description="Define a Pane (page) of the wizard">
-        <attribute name="fields" required="yes">
-          <description>
-            The fields and the order in which to display them.  If this
-            is not specified, all schema fields will be displayed in the
-            order specified in the schema itself.
-          </description>
-        </attribute>
-        <attribute name="label" required="no">
-          <description>
-            The label used as the heading on this pane
-          </description>
-        </attribute>
-      </subdirective>
-
-    </directive>
-
-    <directive name="editwizard" handler=".editwizard.EditWizardDirective">
-      <description>
-        Define an automatically generated edit wizard (multi-page form).
-
-        The editwizard directive creates and register's a view for
-        editing an object based on a schema.
-      </description>
-
-      <attribute name="name" required="yes">
-        <description>
-        The name of the generated View
-        </description>
-      </attribute>
-
-      <attribute name="schema" required="yes">
-        <description>
-        The schema from which the edit form is generated.
-
-        A schema is an interface that includes fields.
-        </description>
-      </attribute>
-
-      <attribute name="for" required="no">
-        <description>
-        The interface this page (view) applies to. 
-
-        The view will be for all objects that implement this interface.
-
-        The schema is used if the for attribute is not specified.
-
-        If the for attribute is specified, then the objects views must
-        implement or be adaptable to the schema.
-        </description>
-      </attribute>
-
-      <attribute name="permission" required="yes">
-        <description>
-        The permission needed to use the view. 
-        </description>
-      </attribute>
-
-      <attribute name="template" required="no">
-        <description>
-        An alternate template to use for the edit form.
-
-        XXX Need to document how to extend the default.
-        </description>
-      </attribute>
-
-      <attribute name="layer" required="no">
-        <description>
-          The layer the view is in. 
-
-          A skin is composed of layers. It is common to put skin specific
-          views in a layer named after the skin. If the 'layer' attribute
-          is not supplied, it defaults to 'default'. 
-        </description>
-      </attribute>
-
-      <attribute name="class" required="no">
-        <description>
-        A class to provide custom widget definitions or methods to be
-        used by a custom template.
-
-        This class is used as a mix-in class. As a result, it needn't
-        subclass any special classes, such as BrowserView.
-        </description>
-        </attribute>
-
-      <attribute name="menu" required="no">
-        <description>
-          The browser menu to include the edit form in.
-
-          Many views are included in menus. It's convenient to name
-          the menu in the page directive, rather than having to give a
-          separate menuItem directive.
-          </description>
-        </attribute>
-
-      <attribute name="title" required="no">
-        <description>
-          The browser menu label for the edit form
-
-          This attribute defaults to "Edit".
-          </description>
-      </attribute>
-
-      <attribute name="use_session" required="no">
-        <description>
-          If 'no', hidden input controls are used to maintain state
-          between panes in the wizard. Only simple data types can
-          be propagated with this method.
-
-          Defaults to 'yes'.
-        </description>
-      </attribute>
-
-      <subdirective name="pane" 
-        description="Define a Pane (page) of the wizard">
-        <attribute name="fields" required="yes">
-          <description>
-          The fields and the order in which to display them.  If this
-          is not specified, all schema fields will be displayed in the
-          order specified in the schema itself.
-          </description>
-        </attribute>
-        <attribute name="label" required="no">
-          <description>
-          The label used as the heading on this pane
-          </description>
-        </attribute>
-      </subdirective>
-
-    </directive>
-
-    <directive name="editform" handler=".editview.edit">
-
-      <description>
-        Define an automatically generated edit form
-
-        The editform directive creates and register's a view for
-        editing an object based on a schema.
-      </description>
-
-      <attribute name="name" required="yes">
-        <description>
-        The name of the generated edit view.
-        </description>
-        </attribute>
-
-      <attribute name="schema" required="yes">
-        <description>
-        The schema from which the edit form is generated.
-
-        A schema is an interface that includes fields.
-        </description>
-        </attribute>
-
-      <attribute name="label" required="no">
-        <description>
-        A label to be used as the heading for the form.
-        </description>
-        </attribute>
-
-      <attribute name="for" required="no">
-        <description>
-        The interface this page (view) applies to. 
-
-        The view will be for all objects that implement this interface.
-
-        The schema is used if the for attribute is not specified.
-
-        If the for attribute is specified, then the objects views must
-        implement or be adaptable to the schema.
-        </description>
-        </attribute>
-
-      <attribute name="fields" required="no">
-        <description>
-        The fields and the order in which to display them.  If this
-        is not specified, all schema fields will be displayed in the
-        order specified in the schema itself.
-        </description>
-      </attribute>
-
-      <attribute name="layer" required="no">
-        <description>
-              The layer the view is in. 
-
-              A skin is composed of layers. It is common to put skin specific
-              views in a layer named after the skin. If the 'layer' attribute
-              is not supplied, it defaults to 'default'. 
-          </description>
-        </attribute>
-
-
-       <attribute name="permission" required="yes">
-        <description>
-              The permission needed to use the view. 
-          </description>
-        </attribute>
-
-      <attribute name="template" required="no">
-        <description>
-        An alternate template to use for the edit form.
-
-        XXX Need to document how to extend the default.
-        </description>
-        </attribute>
-
-      <attribute name="class" required="no">
-        <description>
-        A class to provide custom widget definitions or methods to be
-        used by a custom template.
-
-        This class is used as a mix-in class. As a result, it needn't
-        subclass any special classes, such as BrowserView.
-        </description>
-        </attribute>
-
-
-      <attribute name="menu" required="no">
-        <description>
-          The browser menu to include the edit form in.
-
-          Many views are included in menus. It's convenient to name
-          the menu in the page directive, rather than having to give a
-          separate menuItem directive.
-          </description>
-        </attribute>
-
-      <attribute name="title" required="no">
-        <description>
-          The browser menu label for the edit form
-
-          This attribute defaults to "Edit".
-          </description>
-        </attribute>
-
-      </directive>
-
-    <directive
-       name="subeditform"
-       attributes="name schema label for layer permission class template
-                   fulledit fulledit_label"
-       handler="zope.app.browser.form.editview.subedit"
-       />
-
-    <directive
-       name="addform"
-       handler="zope.app.browser.form.add.add"
-       attributes="menu title"
-       >
-      <description>
-        Define an automatically generated add form
-
-        The addform directive creates and registers a view for
-        adding an object based on a schema.
-
-        Adding an object is a bit trickier than editing an object,
-        because the object the schema applies to isn't available when
-        forms are being rendered.  The addform directive provides an
-        customization interface to overcome this difficulty.
-
-        See zope.app.interfaces.browser.form.IAddFormCustomization.
-      </description>
-
-      <attribute name="name" required="yes">
-        <description>
-        The name of the generated add view.
-        </description>
-        </attribute>
-
-      <attribute name="schema" required="yes">
-        <description>
-        The schema from which the add form is generated.
-
-        A schema is an interface that includes fields.
-        </description>
-        </attribute>
-
-      <attribute name="label" required="no">
-        <description>
-        A label to be used as the heading for the form.
-        </description>
-        </attribute>
-
-      <attribute name="description" required="no">
-        <description>
-         A longer description of the add form.
-
-          A UI may display this with the item or display it when the
-          user requests more assistance.
-        </description>
-        </attribute>
-
-      <attribute name="for" required="no">
-        <description>
-        The interface this page (view) applies to.
-
-        The view will be for all objects that implement this interface.
-
-        zope.app.interfaces.container.IAdding is used if this
-        attribute isn't specified.  If this attribute is specified,
-        then either the named interface must extend IAdding or a class
-        attribute must be used to supply a class implements certain
-        methods described in
-        zope.app.interfaces.browser.form.IAddFormCustomization.
-
-        The schema is used if the for attribute is not specified.
-
-        If the for attribute is specified, then the objects views must
-        implement or be adaptable to the schema.
-        </description>
-        </attribute>
-
-      <attribute name="fields" required="no">
-        <description>
-        The fields and the order in which to display them.  If this
-        is not specified, all schema fields will be displayed in the
-        order specified in the schema itself.
-        </description>
-      </attribute>
-
-      <attribute name="layer" required="no">
-        <description>
-              The layer the view is in.
-
-              A skin is composed of layers. It is common to put skin specific
-              views in a layer named after the skin. If the 'layer' attribute
-              is not supplied, it defaults to 'default'.
-          </description>
-        </attribute>
-
-
-       <attribute name="permission" required="yes">
-        <description>
-              The permission needed to use the view. 
-          </description>
-        </attribute>
-
-      <attribute name="template" required="no">
-        <description>
-        An alternate template to use for the add form.
-
-        XXX Need to document how to extend the default.
-        </description>
-        </attribute>
-
-      <attribute name="class" required="no">
-        <description>
-        A class to provide custom widget definitions or methods to be
-        used by a custom template.
-
-        This class can override methods defined in IAddFormCustomization.
-
-        This class is used as a mix-in class. As a result, it needn't
-        subclass any special classes, such as BrowserView.
-        </description>
-        </attribute>
-
-
-      <attribute name="content_factory" required="no">
-        <description>
-          The dotted name of an object to call to create new content objects.
-
-          This attribute isn't used if a class is specified that
-          implements createAndAdd.
-          </description>
-        </attribute>
-
-      <attribute name="arguments" required="no">
-        <description>
-          A list of field names to supply as positional arguments to
-          the factory.
-        </description>
-      </attribute>
-
-      <attribute name="keyword_arguments" required="no">
-        <description>
-          A list of field names to supply as keyword arguments to
-          the factory.
-        </description>
-      </attribute>
-
-      <attribute name="set_before_add" required="no">
-        <description>
-          A list of fields to be assigned to the newly created object
-          before it is added.
-        </description>
-      </attribute>
-
-      <attribute name="set_after_add" required="no">
-        <description>
-          A list of fields to be assigned to the newly created object
-          after it is added.
-        </description>
-      </attribute>
-
-      <attribute name="menu" required="no">
-        <description>
-          The browser menu to include the add form in.
-
-          Many views are included in menus. It's convenient to name
-          the menu in the page directive, rather than having to give a
-          separate menuItem directive.
-          </description>
-        </attribute>
-
-      </directive>
-
-    <directive name="schemadisplay" handler=".schemadisplay.display">
-
-      <description>
-        Define an automatically generated display form.
-
-        The schemadisplay directive creates and register's a view for
-        displaying an object based on a schema.
-      </description>
-
-      <attribute name="name" required="yes">
-        <description>
-        The name of the generated display view.
-        </description>
-        </attribute>
-
-      <attribute name="schema" required="yes">
-        <description>
-        The schema from which the display form is generated.
-
-        A schema is an interface that includes fields.
-        </description>
-        </attribute>
-
-      <attribute name="label" required="no">
-        <description>
-        A label to be used as the heading for the form.
-        </description>
-        </attribute>
-
-      <attribute name="for" required="no">
-        <description>
-        The interface this page (view) applies to. 
-
-        The view will be for all objects that implement this interface.
-
-        The schema is used if the for attribute is not specified.
-
-        If the for attribute is specified, then the objects views must
-        implement or be adaptable to the schema.
-        </description>
-        </attribute>
-
-      <attribute name="fields" required="no">
-        <description>
-        The fields and the order in which to display them.  If this
-        is not specified, all schema fields will be displayed in the
-        order specified in the schema itself.
-        </description>
-      </attribute>
-
-      <attribute name="layer" required="no">
-        <description>
-        The layer the view is in. 
-
-        A skin is composed of layers. It is common to put skin specific
-        views in a layer named after the skin. If the 'layer' attribute
-        is not supplied, it defaults to 'default'. 
-        </description>
-        </attribute>
-
-      <attribute name="permission" required="yes">
-        <description>
-        The permission needed to use the view. 
-        </description>
-        </attribute>
-
-      <attribute name="template" required="no">
-        <description>
-        An alternate template to use for the display form.
-
-        XXX Need to document how to extend the default.
-        </description>
-        </attribute>
-
-      <attribute name="class" required="no">
-        <description>
-        A class to provide custom widget definitions or methods to be
-        used by a custom template.
-
-        This class is used as a mix-in class. As a result, it needn't
-        subclass any special classes, such as BrowserView.
-        </description>
-        </attribute>
-
-      <attribute name="menu" required="no">
-        <description>
-        The browser menu to include the display form in.
-
-        Many views are included in menus. It's convenient to name
-        the menu in the page directive, rather than having to give a
-        separate menuItem directive.
-        </description>
-        </attribute>
-
-      <attribute name="title" required="no">
-        <description>
-        The browser menu label for the display form
-
-        This attribute defaults to "Display".
-        </description>
-        </attribute>
-
-      </directive>
-
-  </directives>
-
-</zopeConfigure>
+</configure>


=== Zope3/src/zope/app/browser/form/schemadisplay.py 1.7 => 1.8 ===
--- Zope3/src/zope/app/browser/form/schemadisplay.py:1.7	Sat Aug  2 05:11:08 2003
+++ Zope3/src/zope/app/browser/form/schemadisplay.py	Sat Aug  2 22:13:02 2003
@@ -19,7 +19,6 @@
 
 from zope.schema import getFieldNamesInOrder
 
-from zope.configuration.action import Action
 from zope.app.context import ContextWrapper
 from zope.publisher.interfaces.browser import IBrowserPresentation
 from zope.publisher.browser import BrowserView
@@ -34,9 +33,7 @@
 from zope.app.publisher.browser.globalbrowsermenuservice \
      import menuItemDirective, globalBrowserMenuService
 
-# XXX perhaps a little too intimate?
-from zope.app.browser.form.editview import normalize
-
+from editview import normalize
 
 class DisplayView(BrowserView):
     """Simple display-view base class.
@@ -95,25 +92,21 @@
                                permission))
     provideView(for_, name, IBrowserPresentation, class_, layer)
 
-
 def display(_context, name, schema, permission, label='',
-            layer="default",
-            class_=None, for_=None,
-            template=None, omit=None, fields=None,
+            layer="default", class_=None, for_=None,
+            template=None, fields=None,
             menu=None, title='Display', usage=u''):
-    actions = []
     if menu:
         actions = menuItemDirective(
             _context, menu, for_ or schema, '@@' + name, title,
             permission=permission)
 
-    schema, for_, bases, template, fields = normalize(
-        _context, schema, for_, class_, template, 'display.pt', fields, omit,
-        DisplayView)
+    for_, bases, template, fields = normalize(
+        for_, schema, class_, template, 'display.pt', fields, DisplayView)
 
-    actions.append(Action(
+    _context.action(
         discriminator=('view', for_, name, IBrowserPresentation, layer),
         callable=DisplayViewFactory,
         args=(name, schema, label, permission, layer, template, 'display.pt',
-              bases, for_, fields, menu, usage)))
-    return actions
+              bases, for_, fields, menu, usage)
+        )




More information about the Zope3-Checkins mailing list