[Formed-commits] r294 - in trunk: . formed/formed/io formed/formed/model formed/formed/plugins/web

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Nov 10 12:33:13 CET 2008


Author: torsten
Date: 2008-11-10 12:33:03 +0100 (Mon, 10 Nov 2008)
New Revision: 294

Modified:
   trunk/ChangeLog
   trunk/formed/formed/io/document.py
   trunk/formed/formed/model/data.py
   trunk/formed/formed/plugins/web/view_renderer.py
Log:
Implemented radio-matrix elements.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-11-05 10:25:24 UTC (rev 293)
+++ trunk/ChangeLog	2008-11-10 11:33:03 UTC (rev 294)
@@ -1,3 +1,14 @@
+2008-11-10	Torsten Irländer <torsten.irlaender at intevation.de>
+
+	Implemented radio-matrix elements. radio elelement having the same
+	options can now be rendered in table form. 
+
+	* formed/formed/model/data.py,
+	  formed/formed/io/document.py: Added new radio-matrix element to the
+	  model and gui
+	* formed/formed/plugins/web/view_renderer.py: Write html-renderer for
+	  the radio-matrix element. 
+
 2008-11.03	Torsten Irländer <torsten.irlaender at intevation.de>
 
 	* formed/formed/model/data.py: Fixed import error

Modified: trunk/formed/formed/io/document.py
===================================================================
--- trunk/formed/formed/io/document.py	2008-11-05 10:25:24 UTC (rev 293)
+++ trunk/formed/formed/io/document.py	2008-11-10 11:33:03 UTC (rev 294)
@@ -23,6 +23,7 @@
 DOCUMENT_TAG        = u"document"
 PAGE_TAG            = u"page"
 GROUP_TAG           = u"group"
+MATRIX_TAG          = u"radio-matrix"
 RADIO_TAG           = u"radio"
 BOOL_TAG            = u"bool"
 INT_TAG             = u"int"
@@ -38,6 +39,7 @@
     DOCUMENT_TAG:        RootNode,
     PAGE_TAG:            PageNode,
     GROUP_TAG:           GroupNode,
+    MATRIX_TAG:          MatrixNode,
     RADIO_TAG:           RadioNode,
     BOOL_TAG:            BoolLeaf,
     CHOICE_TAG:          ChoiceNode,
@@ -53,6 +55,7 @@
     DOCUMENT_TAG:        SimpleCreator(DocumentFactory,      RootNode),
     PAGE_TAG:            SimpleCreator(NodeFactory,          PageNode),
     GROUP_TAG:           SimpleCreator(NodeFactory,          GroupNode),
+    MATRIX_TAG:          SimpleCreator(NodeFactory,          MatrixNode),
     RADIO_TAG:           SimpleCreator(NodeFactory,          RadioNode),
     CHOICE_TAG:          SimpleCreator(NodeFactory,          ChoiceNode),
     EXT_CHOICE_LIST_TAG: SimpleCreator(NodeComponentFactory, ExternalChoiceListLeaf),
@@ -68,6 +71,7 @@
     RootNode:               DOCUMENT_TAG,
     PageNode:               PAGE_TAG,
     GroupNode:              GROUP_TAG,
+    MatrixNode:             MATRIX_TAG,
     RadioNode:              RADIO_TAG,
     ChoiceNode:             CHOICE_TAG,
     IntLeaf:                INT_TAG,

Modified: trunk/formed/formed/model/data.py
===================================================================
--- trunk/formed/formed/model/data.py	2008-11-05 10:25:24 UTC (rev 293)
+++ trunk/formed/formed/model/data.py	2008-11-10 11:33:03 UTC (rev 294)
@@ -66,7 +66,6 @@
 #                    widgets.append(nc)
 #
 #        return widgets
-
 class GroupNode(Node):
     def __init__(self):
         Node.__init__(self)
@@ -108,6 +107,10 @@
 
         return widgets
 
+class MatrixNode(GroupNode):
+    def __init__(self):
+        GroupNode.__init__(self)
+
 class RadioNode(Node):
     def __init__(self):
         Node.__init__(self)

Modified: trunk/formed/formed/plugins/web/view_renderer.py
===================================================================
--- trunk/formed/formed/plugins/web/view_renderer.py	2008-11-05 10:25:24 UTC (rev 293)
+++ trunk/formed/formed/plugins/web/view_renderer.py	2008-11-10 11:33:03 UTC (rev 294)
@@ -176,6 +176,62 @@
         #self.toTarget(Text('<br class="newline">\n'), node.getTarget())
 
     @checkMode
+    def _renderMatrix(self, node):
+        description = node.getDescription()
+        name        = node.getName()
+
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        legend      = []
+
+        out = []
+        
+        error = self.formdata.getData(name)
+        if node.isInvisible():
+            if description:
+                out.append("<!-- %s -->\n" % escape(description))
+            if error:
+                out.append('<p class="errormsg">%s</p>' % escape(error))
+
+            out.append(self._renderRecursive(node))
+        else:
+            if error:
+                out.append('<p class="errormsg">%s</p>\n' % error)
+            try:
+                out.append('<table class="formed-radiomatrix">')
+                # write table header take
+                out.append("<tr>")
+                out.append('<th class="formed-radiomatrix-label">%s</th>' % description)
+                for hcol in node.children[0].children:
+                    alternative = hcol.getAlternative()
+                    description = hcol.getDescription()
+                    if alternative == '':
+                        header = description
+                    else:
+                        header = alternative 
+                        legend.append("<strong>%s</strong>:%s" % (alternative, description))
+                    out.append("<th>%s</th>" % header )
+                out.append("</tr>")
+                # write table body 
+                for row in node.children:
+                    out.append("<tr>")
+                    out.append('<td class="formed-radiomatrix-label">%s</td>' % row.getDescription())
+                    self.stateStack.append(self.formdata.getData(row.getName()))
+                    for col in row.children:
+                        out.append("<td>%s</td>" % self._renderRadioMatrixBool(col))
+                    self.stateStack.pop()
+                    out.append("</tr>")
+                # write legend
+                if legend:
+                    out.append('<tr><td colspan=%s><div class="formed-radiomatrix-legend">%s</div></td></tr>' % (len(node.children[0].children)+1, ", ".join(legend)))
+                out.append("</table>")
+            except:
+                pass
+        self.toTarget(Item("".join(out)), node.getTarget())
+        #self.toTarget(Text('<br class="newline">\n'), node.getTarget())
+
+    @checkMode
     def _renderInfo(self, info):
         if info.isInvisible(): return
         text, depth = info.getValue(), visibleDepth(info)
@@ -257,6 +313,35 @@
         out = "<option %s %s>%s</option>\n" % (value, selected, description)
         self.toTarget(Text(out), bool.getTarget());
 
+    def _renderRadioMatrixBool(self, bool):
+        '''Radio cool without any label'''
+
+        name        = bool.getName()
+        pname       = bool.parent.getName()
+        description = bool.getDescription()
+        value       = bool.getValue()
+
+        toCheck = self.stateStack[-1]
+
+        checked = toCheck == value and "checked" or ""
+        
+        if value:
+            value = 'value="%s"' % escape(value, True)
+        else:
+            value = ""
+
+        if   pname: oname = 'name="%s"' % escape(pname, True)
+        elif  name: oname = 'name="%s"' % escape(name, True)
+        else:       oname = ''
+
+        if name: id = 'id="%s"' % escape(name, True)
+        else:    id = ""
+        
+        out = '<input type="radio" %s %s %s %s>\n' % ( oname, id, value, checked)
+
+        return out
+        #self.toTarget(Text(out), bool.getTarget())
+
     def _renderRadioBool(self, bool):
 
         name        = bool.getName()
@@ -509,8 +594,11 @@
     def _renderChild(self, child):
 
         if isinstance(child, Node):
-            if isinstance(child, data.GroupNode):
+            if isinstance(child, data.MatrixNode):
                 if not child.isRepeat():
+                    self._renderMatrix(child)
+            elif isinstance(child, data.GroupNode):
+                if not child.isRepeat():
                     self._renderGroup(child)
             elif isinstance(child, data.ChoiceNode):
                 self._renderChoice(child)



More information about the Formed-commits mailing list