[Checkins] SVN: z3c.form/branches/adamg-objectwidget/src/z3c/form/ moved subform creation to an adapter

Adam Groszer agroszer at gmail.com
Mon Oct 13 12:38:10 EDT 2008


Log message for revision 92123:
  moved subform creation to an adapter
  

Changed:
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/configure.zcml
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/interfaces.py
  U   z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py
  A   z3c.form/branches/adamg-objectwidget/src/z3c/form/object.zcml

-=-
Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt	2008-10-13 16:28:51 UTC (rev 92122)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/browser/object.txt	2008-10-13 16:38:09 UTC (rev 92123)
@@ -31,6 +31,10 @@
   >>> registerFactoryAdapter(IMySubObject, MySubObject)
   >>> registerFactoryAdapter(IMySecond, MySecond)
 
+  >>> from z3c.form.object import SubformAdapter
+  >>> zope.component.provideAdapter(SubformAdapter)
+
+
   >>> from z3c.form.error import MultipleErrorViewSnippet
   >>> zope.component.provideAdapter(MultipleErrorViewSnippet)
 

Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/configure.zcml
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/configure.zcml	2008-10-13 16:28:51 UTC (rev 92122)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/configure.zcml	2008-10-13 16:38:09 UTC (rev 92123)
@@ -74,9 +74,6 @@
   <adapter
       factory=".converter.MultiConverter"
       />
-  <adapter
-      factory=".object.ObjectConverter"
-      />
 
   <!-- ITerms -->
   <adapter
@@ -212,6 +209,8 @@
         />
   </configure>
 
+  <include file="object.zcml" />
+
   <include package=".browser" />
 
   <i18n:registerTranslations directory="locales" />

Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/interfaces.py
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/interfaces.py	2008-10-13 16:28:51 UTC (rev 92122)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/interfaces.py	2008-10-13 16:38:09 UTC (rev 92123)
@@ -338,6 +338,17 @@
         """
 
 
+# ----[ Subform factory ]-----------------------------------------------------
+
+class ISubformFactory(zope.interface.Interface):
+    """Factory that will instatiate our subforms for ObjectWidget
+    """
+
+    def __call__():
+        """return a default object created to be populated
+        """
+
+
 # ----[ Widgets ]------------------------------------------------------------
 
 class IWidget(ILocation):

Modified: z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py	2008-10-13 16:28:51 UTC (rev 92122)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/object.py	2008-10-13 16:38:09 UTC (rev 92123)
@@ -30,12 +30,15 @@
 from z3c.form.error import MultipleErrors
 from z3c.form.i18n import MessageFactory as _
 
+def getIfName(iface):
+    return iface.__module__+'.'+iface.__name__
+
 class ObjectSubForm(form.BaseForm):
     zope.interface.implements(interfaces.ISubForm)
 
-    def __init__(self, context, parentWidget):
+    def __init__(self, context, request, parentWidget):
         self.context = context
-        self.request = parentWidget.request
+        self.request = request
         self.__parent__ = parentWidget
         self.parentForm = parentWidget.form
 
@@ -113,7 +116,7 @@
         #value here is the raw extracted from the widget's subform
         #in the form of a dict key:fieldname, value:fieldvalue
 
-        name = self.field.schema.__module__+'.'+self.field.schema.__name__
+        name = getIfName(self.field.schema)
         creator = zope.component.queryMultiAdapter(
             (self.widget.context, self.widget.request,
              self.widget.form, self.widget),
@@ -173,12 +176,23 @@
     _value = interfaces.NOVALUE
     _updating = False
 
+    def _getForm(self, content):
+        #self.subform = ObjectSubForm(content, self)
+        #from pub.dbgpclient import brk; brk('192.168.32.1')
+
+        form = getattr(self, 'form', None)
+        self.subform = zope.component.getMultiAdapter(
+            (content, self.request,
+             self.context,
+             form, self, self.field),
+            interfaces.ISubformFactory)()
+
     def updateWidgets(self):
         if self._value is not interfaces.NOVALUE:
-            self.subform = ObjectSubForm(self._value, self)
+            self._getForm(self._value)
             ignore = None
         else:
-            self.subform = ObjectSubForm(None, self)
+            self._getForm(None)
             ignore = True
 
         self.subform.update(ignore)
@@ -232,8 +246,38 @@
         else:
             return default
 
+
+######## default adapters
+
+class SubformAdapter(object):
+    """Most basic-default subform factory adapter"""
+
+    zope.interface.implements(interfaces.ISubformFactory)
+    zope.component.adapts(zope.interface.Interface, interfaces.IFormLayer,
+                          zope.interface.Interface,
+                          zope.interface.Interface, interfaces.IObjectWidget,
+                          zope.interface.Interface)
+
+    factory = ObjectSubForm
+
+    def __init__(self, context, request, widgetContext, form, widget, field):
+        self.context = context
+        self.request = request
+        self.widgetContext = widgetContext
+        self.form = form
+        self.widget = widget
+        self.field = field
+
+    def __call__(self):
+        #value is the extracted data from the form
+        obj = self.factory(self.context, self.request, self.widget)
+        return obj
+
+    def __repr__(self):
+        return '<%s %r>' % (self.__class__.__name__, self.__name__)
+
 class FactoryAdapter(object):
-    """Most basic-default factory adapter"""
+    """Most basic-default object factory adapter"""
 
     zope.interface.implements(interfaces.IObjectFactory)
     zope.component.adapts(zope.interface.Interface, interfaces.IFormLayer,
@@ -261,7 +305,7 @@
 # arguments. But can probably do that later in a ZCML directive
 def registerFactoryAdapter(for_, klass):
     """register the basic FactoryAdapter for a given interface and class"""
-    name = for_.__module__+'.'+for_.__name__
+    name = getIfName(for_)
     class temp(FactoryAdapter):
         factory = klass
     zope.component.provideAdapter(temp, name=name)
\ No newline at end of file

Added: z3c.form/branches/adamg-objectwidget/src/z3c/form/object.zcml
===================================================================
--- z3c.form/branches/adamg-objectwidget/src/z3c/form/object.zcml	                        (rev 0)
+++ z3c.form/branches/adamg-objectwidget/src/z3c/form/object.zcml	2008-10-13 16:38:09 UTC (rev 92123)
@@ -0,0 +1,16 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:i18n="http://namespaces.zope.org/i18n"
+    i18n_domain="z3c.form">
+
+  <!-- Data Converters -->
+  <adapter
+      factory=".object.ObjectConverter"
+      />
+
+  <!-- Subform default factory -->
+  <adapter
+      factory=".object.SubformAdapter"
+      />
+
+</configure>


Property changes on: z3c.form/branches/adamg-objectwidget/src/z3c/form/object.zcml
___________________________________________________________________
Name: svn:keywords
   + Date Author Id Revision
Name: svn:eol-style
   + native



More information about the Checkins mailing list