From b87aef6cbb083e2afec7500ba76b6b38737045c8 Mon Sep 17 00:00:00 2001
From: Sebastien Robin <seb@nexedi.com>
Date: Fri, 8 Jun 2007 14:18:59 +0000
Subject: [PATCH] added support for float format, also updated test

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@14749 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Catalog/tests/testERP5Catalog.py | 16 ++++++++++++++++
 product/ZSQLCatalog/SQLCatalog.py            | 11 ++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/product/ERP5Catalog/tests/testERP5Catalog.py b/product/ERP5Catalog/tests/testERP5Catalog.py
index 0b3c877247..66c8f0a614 100644
--- a/product/ERP5Catalog/tests/testERP5Catalog.py
+++ b/product/ERP5Catalog/tests/testERP5Catalog.py
@@ -1785,6 +1785,22 @@ class TestERP5Catalog(ERP5TypeTestCase, LogInterceptor):
     self.failUnless(isinstance(uid, long))
     self.assertEquals(organisation.uid, uid)
 
+  def test_55_FloatFormat(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    if not quiet:
+      message = 'Float Format'
+      ZopeTestCase._print('\n%s ' % message)
+      LOG('Testing... ',0,message)
+    org_a = self._makeOrganisation(title='org_a')
+    org_b = self._makeOrganisation(title='org_b')
+    sql_connection = self.getSQLConnection()
+    # Add a method in order to directly put values we want into
+    # the catalog.
+    catalog_kw = {'uid':{'query':'2 567.54',
+                               'format':'1 234.12',
+                               'type':'float'}}
+    sql_src = self.getCatalogTool()(src__=1,**catalog_kw)
+    self.failUnless('TRUNCATE(catalog.uid,2) = 2567.54' in sql_src)
 
 if __name__ == '__main__':
     framework()
diff --git a/product/ZSQLCatalog/SQLCatalog.py b/product/ZSQLCatalog/SQLCatalog.py
index 22b6ebaba3..61ea9086f9 100644
--- a/product/ZSQLCatalog/SQLCatalog.py
+++ b/product/ZSQLCatalog/SQLCatalog.py
@@ -205,6 +205,9 @@ class QueryMixin:
           value = value.strftime(format)
         if isinstance(value, basestring):
           value = "STR_TO_DATE('%s','%s')" % (value, format)
+      if type == 'float':
+        # Make sure there is no space in float values
+        value = value.replace(' ','')
     else:
       if hasattr(value, 'ISO'):
         value = "'%s'" % value.ISO()
@@ -222,13 +225,19 @@ class QueryMixin:
     if format is not None and type is not None:
       if type == 'date':
         key = "STR_TO_DATE(DATE_FORMAT(%s,'%s'),'%s')" % (key, format, format)
+      if type == 'float':
+        float_format = format.replace(' ','')
+        if float_format.find('.') >= 0:
+          precision = len(float_format.split('.')[1])
+          key = "TRUNCATE(%s,%s)" % (key, precision)
     return key
 
 class Query(QueryMixin):
   """
   This allow to define constraints on a sql column
 
-  format - %d/%m/%Y
+  format - type date : %d/%m/%Y
+           type float : 1 234.12
   """
   def __init__(self, format=None, operator=None, range=None,
                      search_mode=None, table_alias_list=None, type=None, **kw):
-- 
2.30.9