qdp (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-server/trunk-test-search-qdp into 
lp:openobject-server.

Requested reviews:
  OpenERP Core Team (openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-test-search-qdp/+merge/135414

fix some problems related to the use of 'order' argument in search() function:
*cannot do an 'order by ID desc'
*cannot compose an 'order by' composed with 'ID' and another field (like 'order 
by sequence ASC, ID')

it also includes a python test suit to ensure the good behavior of the orm in 
the future
-- 
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-test-search-qdp/+merge/135414
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-server/trunk-test-search-qdp.
=== modified file 'openerp/addons/base/tests/__init__.py'
--- openerp/addons/base/tests/__init__.py	2012-10-26 10:08:19 +0000
+++ openerp/addons/base/tests/__init__.py	2012-11-21 13:54:21 +0000
@@ -1,7 +1,8 @@
-import test_base, test_expression, test_ir_values
+import test_base, test_expression, test_search, test_ir_values
 
 checks = [
     test_base,
     test_expression,
+    test_search,
     test_ir_values,
 ]

=== added file 'openerp/addons/base/tests/test_search.py'
--- openerp/addons/base/tests/test_search.py	1970-01-01 00:00:00 +0000
+++ openerp/addons/base/tests/test_search.py	2012-11-21 13:54:21 +0000
@@ -0,0 +1,55 @@
+import unittest2
+
+import openerp.tests.common as common
+
+class test_expression(common.TransactionCase):
+
+    def test_search_order(self):
+
+        registry, cr, uid = self.registry, self.cr, self.uid
+
+        # Create 6 partners with a given name, and a given creation order to ensure the order of their ID. Some are set as unactive to verify they are by default excluded from the searchs and to provide a second order argument
+
+        partners = registry('res.partner')
+        c = partners.create(cr, uid, {'name': 'test_search_order_C'})
+        d = partners.create(cr, uid, {'name': 'test_search_order_D', 'active': False})
+        a = partners.create(cr, uid, {'name': 'test_search_order_A'})
+        b = partners.create(cr, uid, {'name': 'test_search_order_B'})
+        ab = partners.create(cr, uid, {'name': 'test_search_order_AB'})
+        e = partners.create(cr, uid, {'name': 'test_search_order_E', 'active': False})
+
+        # The tests.
+
+        # The basic searchs should exclude records that have active = False. The order of ids returned 
+        # should be given by the 'order' parameter of search()
+
+        name_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="name asc")
+        self.assertEqual([a, ab, b, c], name_asc, "Search with 'NAME ASC' order failed.")
+        name_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="name desc")
+        self.assertEqual([c, b, ab, a], name_desc, "Search with 'NAME DESC' order failed.")
+        id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="id asc")
+        self.assertEqual([c, a, b, ab], id_asc, "Search with 'ID ASC' order failed.")
+        id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%')], order="id desc")
+        self.assertEqual([ab, b, a, c], id_desc, "Search with 'ID DESC' order failed.")
+
+        # The inactive records shouldn't be ecxluded as soon as a condition on this field is present in the domain 
+        # criteria. The 'order' parameter of search() should support any valable coma-separated value
+
+        active_asc_id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active asc, id asc")
+        self.assertEqual([d, e, c, a, b, ab], active_asc_id_asc, "Search with 'ACTIVE ASC, ID ASC' order failed.")
+        active_desc_id_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active desc, id asc")
+        self.assertEqual([c, a, b, ab, d, e], active_desc_id_asc, "Search with 'ACTIVE DESC, ID ASC' order failed.")
+        active_asc_id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active asc, id desc")
+        self.assertEqual([e, d, ab, b, a, c], active_asc_id_desc, "Search with 'ACTIVE ASC, ID DESC' order failed.")
+        active_desc_id_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="active desc, id desc")
+        self.assertEqual([ab, b, a, c, e, d], active_desc_id_desc, "Search with 'ACTIVE DESC, ID DESC' order failed.")
+        id_asc_active_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id asc, active asc")
+        self.assertEqual([c, d, a, b, ab, e], id_asc_active_asc, "Search with 'ID ASC, ACTIVE ASC' order failed.")
+        id_asc_active_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id asc, active desc")
+        self.assertEqual([c, d, a, b, ab, e], id_asc_active_desc, "Search with 'ID ASC, ACTIVE DESC' order failed.")
+        id_desc_active_asc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id desc, active asc")
+        self.assertEqual([e, ab, b, a, d, c], id_desc_active_asc, "Search with 'ID DESC, ACTIVE ASC' order failed.")
+        id_desc_active_desc = partners.search(cr, uid, [('name', 'like', 'test_search_order%'), '|', ('active', '=', True), ('active', '=', False)], order="id desc, active desc")
+        self.assertEqual([e, ab, b, a, d, c], id_desc_active_desc, "Search with 'ID DESC, ACTIVE DESC' order failed.")
+
+

=== modified file 'openerp/osv/orm.py'
--- openerp/osv/orm.py	2012-11-20 13:22:30 +0000
+++ openerp/osv/orm.py	2012-11-21 13:54:21 +0000
@@ -4722,7 +4722,7 @@
                 order_direction = order_split[1].strip() if len(order_split) == 2 else ''
                 inner_clause = None
                 if order_field == 'id':
-                    order_by_clause = '"%s"."%s"' % (self._table, order_field)
+                    order_by_elements.append('"%s"."id" %s' % (self._table, order_direction))
                 elif order_field in self._columns:
                     order_column = self._columns[order_field]
                     if order_column._classic_read:

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : openerp-dev-gtk@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to