Raphael Collet (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-server/trunk-bug-related-field-rco into 
lp:openobject-server.

Requested reviews:
  Raphael Collet (OpenERP) (rco-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-related-field-rco/+merge/98218

Fix (and simplify!) search on related fields.
It was simply wrong when the related field has a single indirection, like: 
fields.related('foo', type=...).

-- 
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-related-field-rco/+merge/98218
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-server/trunk-bug-related-field-rco.
=== modified file 'openerp/osv/fields.py'
--- openerp/osv/fields.py	2012-02-22 09:39:37 +0000
+++ openerp/osv/fields.py	2012-03-19 15:34:41 +0000
@@ -1161,20 +1161,10 @@
     """
 
     def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None):
-        self._field_get2(cr, uid, obj, context)
-        i = len(self._arg)-1
-        sarg = name
-        while i>0:
-            if type(sarg) in [type([]), type( (1,) )]:
-                where = [(self._arg[i], 'in', sarg)]
-            else:
-                where = [(self._arg[i], '=', sarg)]
-            if domain:
-                where = map(lambda x: (self._arg[i],x[1], x[2]), domain)
-                domain = []
-            sarg = obj.pool.get(self._relations[i]['object']).search(cr, uid, where, context=context)
-            i -= 1
-        return [(self._arg[0], 'in', sarg)]
+        # assume self._arg = ('foo', 'bar', 'baz')
+        # domain = [(name, op, val)]   =>   search [('foo.bar.baz', op, val)]
+        field = '.'.join(self._arg)
+        return map(lambda x: (field, x[1], x[2]), domain)
 
     def _fnct_write(self,obj,cr, uid, ids, field_name, values, args, context=None):
         self._field_get2(cr, uid, obj, context=context)

=== modified file 'openerp/tests/__init__.py'
--- openerp/tests/__init__.py	2012-03-01 13:46:08 +0000
+++ openerp/tests/__init__.py	2012-03-19 15:34:41 +0000
@@ -11,6 +11,7 @@
 import test_expression
 import test_ir_sequence
 import test_orm
+import test_fields
 
 fast_suite = [
     test_ir_sequence,
@@ -19,6 +20,7 @@
 checks = [
     test_expression,
     test_orm,
+    test_fields,
     ]
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'openerp/tests/test_fields.py'
--- openerp/tests/test_fields.py	1970-01-01 00:00:00 +0000
+++ openerp/tests/test_fields.py	2012-03-19 15:34:41 +0000
@@ -0,0 +1,82 @@
+#
+# test cases for fields access, etc.
+#
+
+import unittest2
+import common
+
+import openerp
+from openerp.osv import fields
+
+class TestRelatedField(common.TransactionCase):
+
+    def setUp(self):
+        super(TestRelatedField, self).setUp()
+        self.partner = self.registry('res.partner')
+        self.company = self.registry('res.company')
+
+    def test_0_related(self):
+        """ test an usual related field """
+        # add a related field test_related_company_id on res.partner
+        old_columns = self.partner._columns
+        self.partner._columns = dict(old_columns)
+        self.partner._columns.update({
+            'related_company_partner_id': fields.related('company_id', 'partner_id', type='many2one', obj='res.partner'),
+        })
+
+        # find a company with a non-null partner_id
+        ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
+        id = ids[0]
+
+        # find partners that satisfy [('partner_id.company_id', '=', id)]
+        company_ids = self.company.search(self.cr, self.uid, [('partner_id', '=', id)])
+        partner_ids1 = self.partner.search(self.cr, self.uid, [('company_id', 'in', company_ids)])
+        partner_ids2 = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', id)])
+        self.assertEqual(partner_ids1, partner_ids2)
+
+        # restore res.partner fields
+        self.partner._columns = old_columns
+
+    def do_test_company_field(self, field):
+        # get a partner with a non-null company_id
+        ids = self.partner.search(self.cr, self.uid, [('company_id', '!=', False)], limit=1)
+        partner = self.partner.browse(self.cr, self.uid, ids[0])
+
+        # check reading related field
+        self.assertEqual(partner[field], partner.company_id)
+
+        # check that search on related field is equivalent to original field
+        ids1 = self.partner.search(self.cr, self.uid, [('company_id', '=', partner.company_id.id)])
+        ids2 = self.partner.search(self.cr, self.uid, [(field, '=', partner.company_id.id)])
+        self.assertEqual(ids1, ids2)
+
+    def test_1_single_related(self):
+        """ test a related field with a single indirection like fields.related('foo') """
+        # add a related field test_related_company_id on res.partner
+        old_columns = self.partner._columns
+        self.partner._columns = dict(old_columns)
+        self.partner._columns.update({
+            'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
+        })
+
+        self.do_test_company_field('single_related_company_id')
+
+        # restore res.partner fields
+        self.partner._columns = old_columns
+
+    def test_2_related_related(self):
+        """ test a related field referring to a related field """
+        # add a related field on a related field on res.partner
+        old_columns = self.partner._columns
+        self.partner._columns = dict(old_columns)
+        self.partner._columns.update({
+            'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
+            'related_related_company_id': fields.related('single_related_company_id', type='many2one', obj='res.company'),
+        })
+
+        self.do_test_company_field('related_related_company_id')
+
+        # restore res.partner fields
+        self.partner._columns = old_columns
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to