From 203054d650efced6025cd610f601932aeda99467 Mon Sep 17 00:00:00 2001
From: Alexandre Boeglin <alex@nexedi.com>
Date: Mon, 4 Jul 2005 11:50:31 +0000
Subject: [PATCH] Added two more parameter lists :

- Force Alignment
  Usage : 'id | right' to have the id aligned to the right,
    'title | center' to have the title centered ... right is the default
    for int and float, left is the default for other types

- Float Rounding (used only if type is float)
  Usage : 'getTotalQuantity | 4' displays '1234.5000' for 1234.5,
    'price | 0' displays '42' for 41.5


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3390 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Form/ListBox.py | 68 +++++++++++++++++++++++++++++++++----
 1 file changed, 61 insertions(+), 7 deletions(-)

diff --git a/product/ERP5Form/ListBox.py b/product/ERP5Form/ListBox.py
index 3c17b690bb..f610582a8c 100755
--- a/product/ERP5Form/ListBox.py
+++ b/product/ERP5Form/ListBox.py
@@ -254,6 +254,7 @@ class ListBoxWidget(Widget.Widget):
     property_names = Widget.Widget.property_names +\
                      ['lines', 'columns', 'all_columns', 'search_columns', 'sort_columns', 'sort',
                       'editable_columns', 'all_editable_columns', 'stat_columns', 'url_columns', 'global_attributes',
+                      'force_alignment', 'float_rounding',
                       'list_method', 'count_method', 'stat_method', 'selection_name',
                       'meta_types', 'portal_types', 'default_params',
                       'search', 'select',
@@ -406,6 +407,20 @@ class ListBoxWidget(Widget.Widget):
                                  default=[],
                                  required=0)
 
+    force_alignment = fields.ListTextAreaField('force_alignment',
+                                 title="Force Alignment",
+                                 description=(
+        "An optional list of alignment values used when defined"),
+                                 default=[],
+                                 required=0)
+
+    float_rounding = fields.ListTextAreaField('float_rounding',
+                                 title="Float Rounding",
+                                 description=(
+        "An optional list of rounding values used for float fields"),
+                                 default=[],
+                                 required=0)
+
     domain_tree = fields.CheckBoxField('domain_tree',
                                  title='Domain Tree',
                                  description=('Selection Tree'),
@@ -495,6 +510,8 @@ class ListBoxWidget(Widget.Widget):
         all_editable_columns = field.get_value('all_editable_columns')
         stat_columns = field.get_value('stat_columns')
         url_columns = field.get_value('url_columns')
+        force_alignment = field.get_value('force_alignment')
+        float_rounding = field.get_value('float_rounding')
         search_columns = field.get_value('search_columns')
         sort_columns = field.get_value('sort_columns')
         domain_tree = field.get_value('domain_tree')
@@ -568,6 +585,12 @@ class ListBoxWidget(Widget.Widget):
         if not url_columns:
           url_columns = []
 
+        if not force_alignment:
+          force_alignment = []
+
+        if not float_rounding:
+          float_rounding = []
+
         has_catalog_path = None
         for (k, v) in all_columns:
           if k == 'catalog.path' or k == 'path':
@@ -1659,20 +1682,41 @@ onChange="submitAction(this.form,'%s/portal_selections/setReportRoot')">
                     attribute_value = "Could not evaluate"
                     attribute_original_value = None
                 #LOG('ListBox', 0, 'o = %s' % repr(dir(o)))
+                # Alignment
+                if sql in [x[0] for x in force_alignment]:
+                  try:
+                    alignment_index = [x[0] for x in force_alignment].index(sql)
+                    forced_alignment = force_alignment[alignment_index][1]
+                  except ValueError:
+                    forced_alignment = left
+                  td_align = forced_alignment
+                elif type(attribute_value) is type(0.0):
+                  td_align = "right"
+                elif type(attribute_value) is type(1):
+                  td_align = "right"
+                else:
+                  td_align = "left"
+                # Float numbers rounding
                 if type(attribute_value) is type(0.0):
                   attribute_original_value = attribute_value
                   if sql in editable_column_ids and form.has_field('%s_%s' % (field.id, alias) ):
                     # Do not truncate if editable
                     pass
                   else:
-                    #attribute_original_value = attribute_value
-                    attribute_value = "%.2f" % attribute_value
-                  td_align = "right"
+                    if sql in [x[0] for x in float_rounding]:
+                      try:
+                        rounding_index = [x[0] for x in float_rounding].index(sql)
+                        round = float_rounding[rounding_index][1]
+                      except:
+                        round = 2
+                    else:
+                      round = 2
+                    try:
+                      attribute_value = "%%.%sf" % round % attribute_value
+                    except ValueError:
+                      attribute_value = "%.2f" % attribute_value
                 elif type(attribute_value) is type(1):
                   attribute_original_value = attribute_value
-                  td_align = "right"
-                else:
-                  td_align = "left"
                 # It is safer to convert attribute_value to an unicode string, because
                 # it might be utf-8.
                 if type(attribute_value) == type(''):
@@ -1708,7 +1752,17 @@ onChange="submitAction(this.form,'%s/portal_selections/setReportRoot')">
                   if type(cell_body) == type(''):
                     cell_body = unicode(cell_body, 'utf-8')
                   #LOG('ListBox', 0, 'cell_body = %r, error_message = %r' % (cell_body, error_message))
-                  list_body += ('<td class=\"%s%s\">%s%s</td>' % (td_css, error_css, cell_body, error_message))
+                  # Alignment
+                  if sql in [x[0] for x in force_alignment]:
+                    try:
+                      alignment_index = [x[0] for x in force_alignment].index(sql)
+                      forced_alignment = force_alignment[alignment_index][1]
+                    except ValueError:
+                      forced_alignment = left
+                    td_align = forced_alignment
+                  else:
+                    td_align = "left"
+                  list_body += ('<td class=\"%s%s\" align=\"%s\">%s%s</td>' % (td_css, error_css, td_align, cell_body, error_message))
                   
   
                   # Add item to list_result_item for list render format
-- 
2.30.9