[FIX] related fields: fix and simplify search (was wrong with a single indirection)
bzr revid: rco@openerp.com-20120309152938-n467ap8hnw406rau
This commit is contained in:
parent
1ae5913ae8
commit
82f492bc2c
|
@ -1153,20 +1153,10 @@ class related(function):
|
|||
"""
|
||||
|
||||
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)
|
||||
|
|
|
@ -11,6 +11,7 @@ See the :ref:`test-framework` section in the :ref:`features` list.
|
|||
import test_expression
|
||||
import test_ir_sequence
|
||||
import test_orm
|
||||
import test_fields
|
||||
|
||||
fast_suite = [
|
||||
test_ir_sequence,
|
||||
|
@ -19,6 +20,7 @@ fast_suite = [
|
|||
checks = [
|
||||
test_expression,
|
||||
test_orm,
|
||||
test_fields,
|
||||
]
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
#
|
||||
# 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')
|
||||
|
||||
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:
|
Loading…
Reference in New Issue