[z3-checkins] r8221 - z3/Five/branch/regebro-forms_support

regebro at codespeak.net regebro at codespeak.net
Tue Jan 11 18:14:51 MET 2005


Author: regebro
Date: Tue Jan 11 18:14:51 2005
New Revision: 8221

Modified:
   z3/Five/branch/regebro-forms_support/browser.py
   z3/Five/branch/regebro-forms_support/browserconfigure.py
   z3/Five/branch/regebro-forms_support/configure.zcml
   z3/Five/branch/regebro-forms_support/edit.pt
Log:
Support for widget macros and a default edit form.


Modified: z3/Five/branch/regebro-forms_support/browser.py
==============================================================================
--- z3/Five/branch/regebro-forms_support/browser.py	(original)
+++ z3/Five/branch/regebro-forms_support/browser.py	Tue Jan 11 18:14:51 2005
@@ -21,6 +21,11 @@
 from zope.component import getView
 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.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 
 
 class BrowserView(Acquisition.Explicit):
@@ -89,6 +94,89 @@
                  '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 = ViewPageTemplateFile('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()
+                    formatter = self.request.locale.dates.getFormatter(
+                        'dateTime', 'medium')
+                    status = _("Updated on ${date_time}")
+                    status.mapping = {'date_time': formatter.format(
+                        datetime.utcnow())}
+
+        self.update_status = status
+        return status
+
+
 class Macros:
 
     implements(IItemMapping)
@@ -115,3 +203,4 @@
         raise KeyError, key
 
 class StandardMacros(BrowserView, Macros): pass
+

Modified: z3/Five/branch/regebro-forms_support/browserconfigure.py
==============================================================================
--- z3/Five/branch/regebro-forms_support/browserconfigure.py	(original)
+++ z3/Five/branch/regebro-forms_support/browserconfigure.py	Tue Jan 11 18:14:51 2005
@@ -24,11 +24,12 @@
 from zope.app.publisher.browser.viewmeta import pages as zope_app_pages
 from zope.app.component.metaconfigure import handler
 from zope.app.component.interface import provideInterface
+from zope.app.form.browser.metaconfigure import BaseFormDirective
 
 from resource import FileResourceFactory, ImageResourceFactory
 from resource import PageTemplateResourceFactory
 from resource import DirectoryResourceFactory
-from browser import BrowserView
+from browser import BrowserView, EditView
 from metaclass import makeClass
 from security import getSecurityInfo, protectClass, protectName, initializeClass
 
@@ -292,93 +293,6 @@
 #
 # Form generation from schema
 #
-from zope.app.form.browser.metaconfigure import BaseFormDirective
-from zope.app.location.interfaces import ILocation
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-
-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 = ViewPageTemplateFile('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()
-                    formatter = self.request.locale.dates.getFormatter(
-                        'dateTime', 'medium')
-                    status = _("Updated on ${date_time}")
-                    status.mapping = {'date_time': formatter.format(
-                        datetime.utcnow())}
-
-        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''):
@@ -406,7 +320,7 @@
 
     s.provideView(for_, name, IBrowserRequest, class_, layer)
 
-                    
+
 class EditFormDirective(BaseFormDirective):
 
     view = EditView
@@ -428,7 +342,7 @@
             args=self._args(),
             kw={'menu': self.menu},
         )
-                    
+
 #
 # mixin classes / class factories
 #
@@ -471,4 +385,3 @@
 
     return class_
 
-    
\ No newline at end of file

Modified: z3/Five/branch/regebro-forms_support/configure.zcml
==============================================================================
--- z3/Five/branch/regebro-forms_support/configure.zcml	(original)
+++ z3/Five/branch/regebro-forms_support/configure.zcml	Tue Jan 11 18:14:51 2005
@@ -8,6 +8,7 @@
   <include file="permissions.zcml" />
 
   <include package="zope.app.traversing" />
+  <include package="zope.app.form.browser" />
 
   <!-- do 'traditional' traversing by default; needed by ZPT -->
   <adapter

Modified: z3/Five/branch/regebro-forms_support/edit.pt
==============================================================================
--- z3/Five/branch/regebro-forms_support/edit.pt	(original)
+++ z3/Five/branch/regebro-forms_support/edit.pt	Tue Jan 11 18:14:51 2005
@@ -1,7 +1,7 @@
 <tal:tag condition="view/update"/>
-<html metal:use-macro="context/@@standard_macros/view">
+<html>
   <body>
-  <div metal:fill-slot="body">
+  <div>
 
   <div metal:define-macro="body">
 
@@ -32,11 +32,11 @@
           <div class="label">Extra top</div>
           <div class="field"><input type="text" style="width:100%" /></div>
         </div>
-        
-        <div metal:use-macro="context/@@form_macros/widget_rows" />
-        
+
+        <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>
@@ -47,9 +47,9 @@
 
       <div class="row">
         <div class="controls">
-          <input type="submit" value="Refresh" 
+          <input type="submit" value="Refresh"
               i18n:attributes="value refresh-button" />
-          <input type="submit" name="UPDATE_SUBMIT" value="Change" 
+          <input type="submit" name="UPDATE_SUBMIT" value="Change"
               i18n:attributes="value submit-button"/>
         </div>
       </div>


More information about the z3-checkins mailing list