2 # test cases for fields access, etc.
6 from openerp.osv import fields
8 class TestRelatedField(common.TransactionCase):
11 super(TestRelatedField, self).setUp()
12 self.partner = self.registry('res.partner')
13 self.company = self.registry('res.company')
15 def test_0_related(self):
16 """ test an usual related field """
17 # add a related field test_related_company_id on res.partner
18 old_columns = self.partner._columns
19 self.partner._columns = dict(old_columns)
20 self.partner._columns.update({
21 'related_company_partner_id': fields.related('company_id', 'partner_id', type='many2one', obj='res.partner'),
24 # find a company with a non-null partner_id
25 ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
28 # find partners that satisfy [('partner_id.company_id', '=', id)]
29 company_ids = self.company.search(self.cr, self.uid, [('partner_id', '=', id)])
30 partner_ids1 = self.partner.search(self.cr, self.uid, [('company_id', 'in', company_ids)])
31 partner_ids2 = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', id)])
32 self.assertEqual(partner_ids1, partner_ids2)
34 # restore res.partner fields
35 self.partner._columns = old_columns
37 def do_test_company_field(self, field):
38 # get a partner with a non-null company_id
39 ids = self.partner.search(self.cr, self.uid, [('company_id', '!=', False)], limit=1)
40 partner = self.partner.browse(self.cr, self.uid, ids[0])
42 # check reading related field
43 self.assertEqual(partner[field], partner.company_id)
45 # check that search on related field is equivalent to original field
46 ids1 = self.partner.search(self.cr, self.uid, [('company_id', '=', partner.company_id.id)])
47 ids2 = self.partner.search(self.cr, self.uid, [(field, '=', partner.company_id.id)])
48 self.assertEqual(ids1, ids2)
50 def test_1_single_related(self):
51 """ test a related field with a single indirection like fields.related('foo') """
52 # add a related field test_related_company_id on res.partner
53 # and simulate a _inherits_reload() to populate _all_columns.
54 old_columns = self.partner._columns
55 old_all_columns = self.partner._all_columns
56 self.partner._columns = dict(old_columns)
57 self.partner._all_columns = dict(old_all_columns)
58 self.partner._columns.update({
59 'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
61 self.partner._all_columns.update({
62 'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None)
65 self.do_test_company_field('single_related_company_id')
67 # restore res.partner fields
68 self.partner._columns = old_columns
69 self.partner._all_columns = old_all_columns
71 def test_2_related_related(self):
72 """ test a related field referring to a related field """
73 # add a related field on a related field on res.partner
74 # and simulate a _inherits_reload() to populate _all_columns.
75 old_columns = self.partner._columns
76 old_all_columns = self.partner._all_columns
77 self.partner._columns = dict(old_columns)
78 self.partner._all_columns = dict(old_all_columns)
79 self.partner._columns.update({
80 'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
81 'related_related_company_id': fields.related('single_related_company_id', type='many2one', obj='res.company'),
83 self.partner._all_columns.update({
84 'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None),
85 'related_related_company_id': fields.column_info('related_related_company_id', self.partner._columns['related_related_company_id'], None, None, None)
88 self.do_test_company_field('related_related_company_id')
90 # restore res.partner fields
91 self.partner._columns = old_columns
92 self.partner._all_columns = old_all_columns
94 def test_3_read_write(self):
95 """ write on a related field """
96 # add a related field test_related_company_id on res.partner
97 old_columns = self.partner._columns
98 self.partner._columns = dict(old_columns)
99 self.partner._columns.update({
100 'related_company_partner_id': fields.related('company_id', 'partner_id', type='many2one', obj='res.partner'),
103 # find a company with a non-null partner_id
104 company_ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
105 company = self.company.browse(self.cr, self.uid, company_ids[0])
107 # find partners that satisfy [('partner_id.company_id', '=', company.id)]
108 partner_ids = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', company.id)])
109 partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
111 # create a new partner, and assign it to company
112 new_partner_id = self.partner.create(self.cr, self.uid, {'name': 'Foo'})
113 partner.write({'related_company_partner_id': new_partner_id})
115 company = self.company.browse(self.cr, self.uid, company_ids[0])
116 self.assertEqual(company.partner_id.id, new_partner_id)
118 partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
119 self.assertEqual(partner.related_company_partner_id.id, new_partner_id)
121 # restore res.partner fields
122 self.partner._columns = old_columns
124 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: