diff --git a/product/ERP5Type/Utils.py b/product/ERP5Type/Utils.py index dcdae378879742f1106d02c65d459a69bf70d1e0..7cebb57904c82e0512ad4d6da3d4c208b81841fd 100755 --- a/product/ERP5Type/Utils.py +++ b/product/ERP5Type/Utils.py @@ -65,9 +65,61 @@ from Accessor.TypeDefinition import * # Generic sort method ##################################################### -def sortOnId(sort_id): - return lambda a,b: cmp(a[1].getProperty(sort_id), b[1].getProperty(sort_id)) - +def sortValueList(value_list, sort_on=None, sort_order=None, **kw): + """Sort values in a way compatible with ZSQLCatalog. + """ + if sort_on is not None: + if type(sort_on) == type(''): + sort_on = (sort_on,) + reverse = (sort_order in ('descending', 'reverse', 'DESC')) + new_sort_on = [] + for key in sort_on: + if type(key) == type(''): + new_sort_on.append((key, reverse, None)) + else: + if len(key) == 1: + new_sort_on.append((key[0], reverse, None)) + elif len(key) == 2: + new_sort_on.append((key[0], + key[1] in ('descending', 'reverse', 'DESC'), + None)) + else: + # Emulate MySQL types + as_type = key[2].lower() + if as_type in ('int', 'bigint'): + f=int + elif as_type in ('float', 'real', 'double'): + f=float + else: + # XXX: For an unknown type, use a string. + f=str + new_sort_on.append((key[0], + key[1] in ('descending', 'reverse', 'DESC'), + f)) + sort_on = new_sort_on + + def sortValues(a, b): + result = 0 + for key, reverse, as_type in sort_on: + x = a.getProperty(key, None) + y = b.getProperty(key, None) + if as_type is not None: + try: + x = as_type(x) + y = as_type(y) + except TypeError: + pass + result = cmp(x, y) + if reverse: + result = -result + if result != 0: + break + return result + + value_list.sort(sortValues) + + return value_list + ##################################################### # Useful methods #####################################################