[Erp5-report] r9816 - in /erp5/trunk/bt5/erp5_web: SkinTemplateItem/portal_skins/erp5_web/ ...

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Sep 11 17:58:31 CEST 2006


Author: kevin
Date: Mon Sep 11 17:58:28 2006
New Revision: 9816

URL: http://svn.erp5.org?rev=9816&view=rev
Log:
Add the alpha code (still not used) that auto-aggregate some form groups in 1-pass for easy custom template creation (see big documentation in the script itself).

Added:
    erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_getGroupList.xml
Modified:
    erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web_default_theme/erp5_web_default_template.xml
    erp5/trunk/bt5/erp5_web/bt/change_log
    erp5/trunk/bt5/erp5_web/bt/revision
    erp5/trunk/bt5/erp5_web/bt/version

Added: erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_getGroupList.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_getGroupList.xml?rev=9816&view=auto
==============================================================================
--- erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_getGroupList.xml (added)
+++ erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_getGroupList.xml Mon Sep 11 17:58:28 2006
@@ -1,0 +1,332 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <tuple>
+          <string>Products.PythonScripts.PythonScript</string>
+          <string>PythonScript</string>
+        </tuple>
+        <none/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Python_magic</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>__ac_local_roles__</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_body</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+"""\n
+Short description:\n
+  This script is able to aggregate form groups automaticcaly, according our own\n
+  rules. This is required to do custom xhtml layout for which a flat rendering\n
+  of groups doesn\'t work.\n
+\n
+Detailed description:\n
+  Actually, without this script, fields groups of the ERP5 form used for layout\n
+  are rendered in a flat way like this:\n
+\n
+    <html>\n
+      <body>\n
+\n
+        <div class="group1" id="group1">\n
+          <div class="field" id="field10">(...)</div>\n
+          <div class="field" id="field11">(...)</div>\n
+          <div class="field" id="field12">(...)</div>\n
+          (...)\n
+        </div>\n
+\n
+        <div class="group2" id="group2">\n
+          <div class="field" id="field20">(...)</div>\n
+          <div class="field" id="field21">(...)</div>\n
+          (...)\n
+        </div>\n
+\n
+        <div class="group3" id="group3">\n
+          <div class="field" id="field30">(...)</div>\n
+          (...)\n
+        </div>\n
+\n
+        (...)\n
+\n
+      </body>\n
+    </html>\n
+\n
+  This job is done by the erp5_web_default_template Page Template. The output\n
+  is pure flat xhtml which, thanks to the default css file\n
+  (erp5_web_default.css), is rendered as a "3-column + 1 footer" layout with\n
+  ordered content (= main content is at the top of the page, which is a good SEO\n
+  trick).\n
+\n
+  But sometimes we need to do more complex layouts and those layout cannot be\n
+  built via pure css on top of flat xhtml div like above. Instead, we need <div>\n
+  wrappers with some level depth to control finely the box model of the page.\n
+\n
+  Here is were this script help us solve the problem: it is able to aggregate\n
+  some fields groups according our own rules. Then, the returned aggregation is\n
+  rendered with wrapper to make custom layouts.\n
+\n
+  To avoid performance issues, this script must respect the constraint of 1-pass\n
+  parsing of the group list to generate the group structure.\n
+\n
+\n
+Rules:\n
+  1 - If the group id don\'t match any group_by_criterion string, the group will\n
+      be added in the last aggregate (see \'footer\' group in exemple below).\n
+  2 - A group can\'t be in two differrent aggregate (no duplicate).\n
+  3 - group_by_criterion parameter is ordered and the returned dict respect that\n
+      order.\n
+  4 - If multiples criterion match one group, the first matched criterion will be\n
+      applied (see \'bottom right\' in the exemple below, where it\'s in the \'bottom\'\n
+      aggregate and not in \'right\' one).\n
+  5 - This script is compatible with group titles set in parenthesis (handled by\n
+      ERP5XhtmlStyle_getFormGroupTitleAndId script): the matching process will\n
+      ignore the group title (look at \'(Discount on Right Handed Tools) left\n
+      discount\').\n
+  6 - Matching process between criterion and group id is not case sensitive.\n
+  7 - Group naming should respect naming convention (everything in lower case for\n
+      id and classe, no special char (only ascii and numbers), nything allowed as\n
+      title, is classes separated by spaces).\n
+\n
+  -> TODO: implement naming convention test.\n
+\n
+\n
+Example:\n
+\n
+  Form group list:\n
+    * left column\n
+    * left ad\n
+    * (Discount on Right Handed Tools) left discount\n
+    * metadata right\n
+    * right ad\n
+    * bottom content\n
+    * footer\n
+    * bottom right\n
+\n
+  Script parameter:\n
+    group_by_criterion = [\'left\', \'right\', \'center\', \'bottom\']\n
+\n
+  Returned data:\n
+    [ [\'left\',   [ (\'left column\', \'left column\', \'left column\')\n
+                 , (\'left ad\', \'left ad\', \'left ad\')\n
+                 , (\'left discount\', \'Discount on Right Handed Tools\', \'(Discount on Right Handed Tools) left discount\')\n
+                 ]]\n
+    , [\'right\',  [ (\'metadata right\', \'metadata right\', \'metadata right\')\n
+                 , (\'right ad\', \'right ad\', \'right ad\')\n
+                 ]]\n
+    , [\'center\', [\n
+                 ]]\n
+    , [\'bottom\', [ (\'bottom content\', \'bottom content\', \'bottom content\')\n
+                 , (\'footer\', \'footer\', \'footer\')\n
+                 , (\'bottom right\', \'bottom right\', \'bottom right\')\n
+                 ]]\n
+    ]\n
+\n
+  In fact the aggregate list of groups is a list of tuple, each tuple contain\n
+  informations returned by ERP5XhtmlStyle_getFormGroupTitleAndId().\n
+"""\n
+\n
+aggregate_list = []  # Returned data structure\n
+\n
+if not len(group_by_criterion):\n
+  return aggregate_list\n
+\n
+aggregate_dict = {}  # Temporary data structure for easy grouping\n
+layout_form = context\n
+\n
+# Initialize aggregate dict\n
+for criterion in group_by_criterion:\n
+  aggregate_dict[criterion] = []\n
+\n
+# Put each group in an aggregate\n
+for group_id in layout_form.get_groups(include_empty=0):                      # Rule (2)\n
+\n
+  # TODO: save id title and original id in the returned dict to not recalculate them\n
+  group_details     = context.ERP5XhtmlStyle_getFormGroupTitleAndId(group_id) # Rule (5)\n
+  group_css_classes = group_details[0]\n
+\n
+  # Criterion matching status\n
+  matched = False\n
+\n
+  # Parse the string from left to right\n
+  for group_class in group_css_classes.lower().split(\' \'):                    # Rule (6) & (7)\n
+    # Let criterion match group\n
+    if group_class in group_by_criterion:\n
+      # Put the group in the right aggregate\n
+      aggregate_dict[group_class] = aggregate_dict[group_class] + [group_details]\n
+      matched = True\n
+      break                                                                   # Rule (4)\n
+\n
+  if not matched:                                                             # Rule (1)\n
+    # No \'group by\' criterion found in group id, so put it in the last one\n
+    last_aggregate = group_by_criterion[-1]\n
+    aggregate_dict[last_aggregate] = aggregate_dict[last_aggregate] + [group_details]\n
+\n
+\n
+# Reorder the list                                                            # Rule (3)\n
+aggregate_list = []\n
+for criterion in group_by_criterion:\n
+  aggregate = [ criterion\n
+              , aggregate_dict[criterion]\n
+              ]\n
+  aggregate_list.append(aggregate)\n
+\n
+return aggregate_list\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>_code</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>_filepath</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>group_by_criterion=[\'left\', \'right\', \'center\', \'bottom\', \'hidden\']</string> </value>
+        </item>
+        <item>
+            <key> <string>errors</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>func_code</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>co_argcount</string> </key>
+                        <value> <int>1</int> </value>
+                    </item>
+                    <item>
+                        <key> <string>co_varnames</string> </key>
+                        <value>
+                          <tuple>
+                            <string>group_by_criterion</string>
+                            <string>aggregate_list</string>
+                            <string>len</string>
+                            <string>aggregate_dict</string>
+                            <string>context</string>
+                            <string>layout_form</string>
+                            <string>_getiter_</string>
+                            <string>criterion</string>
+                            <string>_write_</string>
+                            <string>_getattr_</string>
+                            <string>group_id</string>
+                            <string>group_details</string>
+                            <string>_getitem_</string>
+                            <string>group_css_classes</string>
+                            <string>False</string>
+                            <string>matched</string>
+                            <string>group_class</string>
+                            <string>True</string>
+                            <string>last_aggregate</string>
+                            <string>aggregate</string>
+                          </tuple>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>func_defaults</string> </key>
+            <value>
+              <tuple>
+                <list>
+                  <string>left</string>
+                  <string>right</string>
+                  <string>center</string>
+                  <string>bottom</string>
+                  <string>hidden</string>
+                </list>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>WebSite_getGroupList</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Form Group\'s auto-aggregator</string> </value>
+        </item>
+        <item>
+            <key> <string>warnings</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>

Modified: erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web_default_theme/erp5_web_default_template.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web_default_theme/erp5_web_default_template.xml?rev=9816&r1=9815&r2=9816&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web_default_theme/erp5_web_default_template.xml (original)
+++ erp5/trunk/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web_default_theme/erp5_web_default_template.xml Mon Sep 11 17:58:28 2006
@@ -121,6 +121,45 @@
         </tal:block>\n
       </tal:block>\n
 \n
+\n
+<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXX NEXT VERSION ?? XXXXXXXXXXXXXXXXXXXXXXXXXXXX -->\n
+\n
+<!--tal:block tal:condition="python: layout_form is not None"\n
+           tal:define="field_errors   python: request.get(\'field_errors\', {});\n
+                       dummy          python: request.set(\'editable_mode\', 1);\n
+                       aggregate_list python: layout_form.WebSite_getGroupList()">\n
+\n
+  <tal:block tal:define="template python: here.developper_shortcut_render">\n
+    <tal:block metal:use-macro="template/macros/form"/>\n
+  </tal:block-->\n
+\n
+  <!-- Each aggregate of groups is a <div> wrapper -->\n
+  <!--tal:block tal:repeat="aggregate aggregate_list">\n
+    <div tal:define="aggregate_name   python: aggregate[0];\n
+                     aggregate_groups python: aggregate[1];"\n
+         tal:condition="python: len(aggregate_groups)"\n
+         tal:attributes="class python: \'wrapper %s\' % aggregate_name;\n
+                         id    python: \'wrapper_%s\' % aggregate_name;">\n
+\n
+      <tal:block tal:repeat="group_details aggregate_groups">\n
+        <div tal:define="group_css_classes python: group_details[0]"\n
+             tal:attributes="class python: group_css_classes;\n
+                             id    python: group_css_classes.replace(\' \', \'_\');\n
+                             title python: group_details[1];">\n
+\n
+          <tal:block tal:repeat="field python: layout_form.get_fields_in_group(group_details[2])">\n
+            <tal:block metal:use-macro="here/field_render/macros/field_render"/>\n
+          </tal:block>\n
+\n
+        </div>\n
+      </tal:block>\n
+\n
+    </div>\n
+  </tal:block>\n
+\n
+</tal:block-->\n
+<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -->\n
+\n
     </form>\n
   </body>\n
 \n

Modified: erp5/trunk/bt5/erp5_web/bt/change_log
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_web/bt/change_log?rev=9816&r1=9815&r2=9816&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_web/bt/change_log (original)
+++ erp5/trunk/bt5/erp5_web/bt/change_log Mon Sep 11 17:58:28 2006
@@ -1,5 +1,6 @@
 2006-09-11 Kevin
 * Split css in two parts: the generic classes for web forms and the specific classes for the theme.
+* Add the alpha code (still not used) that auto-aggregate some form groups in 1-pass for easy custom template creation (see big documentation in the script itself).
 
 2006-09-08 Kevin
 * Use group id for the layout.

Modified: erp5/trunk/bt5/erp5_web/bt/revision
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_web/bt/revision?rev=9816&r1=9815&r2=9816&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_web/bt/revision (original)
+++ erp5/trunk/bt5/erp5_web/bt/revision Mon Sep 11 17:58:28 2006
@@ -1,1 +1,1 @@
-376
+378

Modified: erp5/trunk/bt5/erp5_web/bt/version
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_web/bt/version?rev=9816&r1=9815&r2=9816&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_web/bt/version (original)
+++ erp5/trunk/bt5/erp5_web/bt/version Mon Sep 11 17:58:28 2006
@@ -1,1 +1,1 @@
-0.3.30
+0.3.31




More information about the Erp5-report mailing list