[IMP] ORM: Coalesce NULL boolean values to false when generating ORDER BY
authorOlivier Dony <odo@openerp.com>
Tue, 12 Aug 2014 10:07:10 +0000 (12:07 +0200)
committerOlivier Dony <odo@openerp.com>
Tue, 12 Aug 2014 10:32:35 +0000 (12:32 +0200)
After commit f28be81, boolean columns may have more
NULL entries than before. In the (rare) cases where
a boolean column was used for an ORDER clause
(e.g. in the /shop page of website_sale), this
causes a change of the resulting ordering.

By coalescing NULL values to false in SQL,
we make the ordering consistent with what the
framework does for domain expressions with booleans,
and when reading boolean values, that is, NULL is
the same as False.

openerp/models.py

index 664186b..e8b531a 100644 (file)
@@ -4420,6 +4420,7 @@ class BaseModel(object):
                 order_split = order_part.strip().split(' ')
                 order_field = order_split[0].strip()
                 order_direction = order_split[1].strip() if len(order_split) == 2 else ''
+                order_column = None
                 inner_clause = None
                 if order_field == 'id':
                     order_by_elements.append('"%s"."%s" %s' % (self._table, order_field, order_direction))
@@ -4442,6 +4443,8 @@ class BaseModel(object):
                         continue  # ignore non-readable or "non-joinable" fields
                 else:
                     raise ValueError( _("Sorting field %s not found on model %s") %( order_field, self._name))
+                if order_column and order_column._type == 'boolean':
+                    inner_clause = "COALESCE(%s, false)" % inner_clause
                 if inner_clause:
                     if isinstance(inner_clause, list):
                         for clause in inner_clause: