[Checkins] SVN: z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/ Some hackery to integrate wforms into relation list. doesn't really work yet.

Martijn Faassen faassen at infrae.com
Sun Dec 14 13:32:45 EST 2008


Log message for revision 94063:
  Some hackery to integrate wforms into relation list. doesn't really work yet.
  

Changed:
  U   z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/__init__.py
  U   z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/widget.py

-=-
Modified: z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/__init__.py
===================================================================
--- z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/__init__.py	2008-12-14 18:17:06 UTC (rev 94062)
+++ z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/__init__.py	2008-12-14 18:32:45 UTC (rev 94063)
@@ -1 +1 @@
-from z3c.relationfieldui.widget import RelationWidget, RelationDisplayWidget
+from z3c.relationfieldui.widget import RelationWidget, RelationListWidget, RelationDisplayWidget

Modified: z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/widget.py
===================================================================
--- z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/widget.py	2008-12-14 18:17:06 UTC (rev 94062)
+++ z3c.relationfieldui/branches/faassen-relationlist/src/z3c/relationfieldui/widget.py	2008-12-14 18:32:45 UTC (rev 94063)
@@ -3,7 +3,7 @@
 
 from zope.app.form.interfaces import IInputWidget, IDisplayWidget
 from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.app.form.browser import TextWidget, DisplayWidget
+from zope.app.form.browser import TextWidget, DisplayWidget, SimpleInputWidget
 from zope import component
 from zope.component.interfaces import ComponentLookupError
 from zope.app.form.browser.widget import renderElement
@@ -11,8 +11,9 @@
 
 from z3c.objpath.interfaces import IObjectPath
 from hurry.resource import Library, ResourceInclusion
+from hurry.js.wforms import wforms
 
-from z3c.relationfield.schema import IRelation
+from z3c.relationfield.schema import IRelation, IRelationList
 from z3c.relationfield.interfaces import IRelationInfo
 
 relation_lib = Library('z3c.relationfieldui')
@@ -73,3 +74,64 @@
             to_url,
             escape(value.to_path))
 
+class RelationListWidget(grok.MultiAdapter, TextWidget):
+    grok.adapts(IRelationList, IBrowserRequest)
+    grok.provides(IInputWidget)
+
+    def __call__(self):
+        result = '<fieldset class="repeat" id="%s">' % self.name
+#        result += '<div class="oneField">'
+        result += TextWidget.__call__(self)
+        explorer_url = component.getMultiAdapter((self.context.context,
+                                                 self.request),
+                                                 name="explorerurl")()
+        result += renderElement(
+            'input', type='button', value='get relation',
+            onclick="Z3C.relation.popup(this.previousSibling, '%s')" %
+            (explorer_url))
+ #       result += '</div>'
+        result += '</fieldset>'
+        wforms.need()
+        relation_resource.need()
+        return result
+
+    def hasInput(self):
+        # in case of a single response
+        if self.name in self.request.form:
+            return True
+        # if multiple responses are there
+        return self.name + '[0]-RC' in self.request.form
+
+    def repeatCount(self):
+        count = self.request.form.get(self.name + '[0]-RC', None)
+        if count is None:
+            return None
+        return int(count)
+    
+    def _toFieldValue(self, input):
+        c = self.repeatCount()
+        if c is None:
+            # regular single value input
+            if not input:
+                return []
+            paths = [input]
+        else:
+            # multi-value input
+            paths = []
+            for i in range(c):
+                v = self.request.form.get(self.name + '[%s]' % i, None)
+                if v is None:
+                    continue
+                paths.append(v)
+        result = []
+        object_path = component.getUtility(IObjectPath)
+        resolve = object_path.resolve
+        for path in paths:
+            obj = resolve(path)
+            result.append(IRelationInfo(obj).createRelation())
+        return result
+        
+    def _toFormValue(self, value):
+        if value is None:
+            return ''
+        return value.to_path



More information about the Checkins mailing list