[MERGE] forward port of branch saas-2 up to revid 5014 mat@openerp.com-20140220145701...
authorChristophe Simonis <chs@openerp.com>
Thu, 20 Feb 2014 16:05:48 +0000 (17:05 +0100)
committerChristophe Simonis <chs@openerp.com>
Thu, 20 Feb 2014 16:05:48 +0000 (17:05 +0100)
bzr revid: chs@openerp.com-20140220160548-0rhulha4cml6t08v

1  2 
openerp/addons/base/ir/ir_actions.py
openerp/addons/base/res/res_company.py
openerp/addons/base/res/res_company_view.xml
openerp/addons/base/tests/test_base.py
openerp/addons/base/tests/test_fields.py
openerp/osv/orm.py

@@@ -910,29 -912,33 +912,36 @@@ class ir_actions_server(osv.osv)
          if action.link_new_record and action.link_field_id:
              self.pool[action.model_id.model].write(cr, uid, [context.get('active_id')], {action.link_field_id.name: res_id})
  
 -    def _eval_context_for_action(self, cr, uid, action, context=None):
 -        if context is None:
 -            context = {}
 -        model = self.pool[action.model_id.model]
 -        active_id = context.get('active_id')
 -        active_ids = context.get('active_ids', [active_id] if active_id else [])
 -        target_record = None
 -        if context.get('active_model') == action.model_id.model and active_id:
 -            context = dict(context, active_ids=active_ids, active_id=active_id)
 -            target_record = model.browse(cr, uid, active_id, context=context) if active_id else None
 -        user = self.pool['res.users'].browse(cr, uid, uid)
 -        eval_context = {
 -            'self': model,
 -            'object': target_record,
 -            'obj': target_record,
 +    def _get_eval_context(self, cr, uid, action, context=None):
 +        """ Prepare the context used when evaluating python code, like the
 +        condition or code server actions.
 +
 +        :param action: the current server action
 +        :type action: browse record
 +        :returns: dict -- evaluation context given to (safe_)eval """
 +        user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
 +        obj_pool = self.pool[action.model_id.model]
 +        obj = None
 +        if context.get('active_model') == action.model_id.model and context.get('active_id'):
 +            obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
 +        return {
 +            'self': obj_pool,
 +            'object': obj,
 +            'obj': obj,
              'pool': self.pool,
              'time': time,
+             'datetime': datetime,
+             'dateutil': dateutil,
              'cr': cr,
              'uid': uid,
              'user': user,
+             'context': context,
          }
 +
++        }
+         return eval_context
      def run(self, cr, uid, ids, context=None):
          """ Runs the server action. For each server action, the condition is
          checked. Note that a void (``False``) condition is considered as always
          if context is None:
              context = {}
          res = False
-         active_ids = context.get('active_ids', [context.get('active_id')])
          for action in self.browse(cr, uid, ids, context):
 -            eval_context = self._eval_context_for_action(cr, uid, action, context)
 +            eval_context = self._get_eval_context(cr, uid, action, context=context)
              condition = action.condition
              if condition is False:
                  # Void (aka False) conditions are considered as True
index 6dd016c,0000000..47ffcd2
mode 100644,000000..100644
--- /dev/null
@@@ -1,123 -1,0 +1,181 @@@
 +#
 +# test cases for fields access, etc.
 +#
 +from openerp.osv import fields
 +from openerp.tests import common
 +
 +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
 +        # and simulate a _inherits_reload() to populate _all_columns.
 +        old_columns = self.partner._columns
 +        old_all_columns = self.partner._all_columns
 +        self.partner._columns = dict(old_columns)
 +        self.partner._all_columns = dict(old_all_columns)
 +        self.partner._columns.update({
 +            'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
 +        })
 +        self.partner._all_columns.update({
 +            'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None)
 +        })
 +
 +        self.do_test_company_field('single_related_company_id')
 +
 +        # restore res.partner fields
 +        self.partner._columns = old_columns
 +        self.partner._all_columns = old_all_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
 +        # and simulate a _inherits_reload() to populate _all_columns.
 +        old_columns = self.partner._columns
 +        old_all_columns = self.partner._all_columns
 +        self.partner._columns = dict(old_columns)
 +        self.partner._all_columns = dict(old_all_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.partner._all_columns.update({
 +            'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None),
 +            'related_related_company_id': fields.column_info('related_related_company_id', self.partner._columns['related_related_company_id'], None, None, None)
 +        })
 +
 +        self.do_test_company_field('related_related_company_id')
 +
 +        # restore res.partner fields
 +        self.partner._columns = old_columns
 +        self.partner._all_columns = old_all_columns
 +
 +    def test_3_read_write(self):
 +        """ write on a 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
 +        company_ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
 +        company = self.company.browse(self.cr, self.uid, company_ids[0])
 +
 +        # find partners that satisfy [('partner_id.company_id', '=', company.id)]
 +        partner_ids = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', company.id)])
 +        partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
 +
 +        # create a new partner, and assign it to company
 +        new_partner_id = self.partner.create(self.cr, self.uid, {'name': 'Foo'})
 +        partner.write({'related_company_partner_id': new_partner_id})
 +
 +        company = self.company.browse(self.cr, self.uid, company_ids[0])
 +        self.assertEqual(company.partner_id.id, new_partner_id)
 +
 +        partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
 +        self.assertEqual(partner.related_company_partner_id.id, new_partner_id)
 +
 +        # restore res.partner fields
 +        self.partner._columns = old_columns
 +
- # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
++
++class TestPropertyField(common.TransactionCase):
++
++    def setUp(self):
++        super(TestPropertyField, self).setUp()
++        self.user = self.registry('res.users')
++        self.partner = self.registry('res.partner')
++        self.company = self.registry('res.company')
++        self.country = self.registry('res.country')
++        self.property = self.registry('ir.property')
++        self.imd = self.registry('ir.model.data')
++
++    def test_1_property_multicompany(self):
++        cr, uid = self.cr, self.uid
++
++        parent_company_id = self.imd.get_object_reference(cr, uid, 'base', 'main_company')[1]
++        country_be = self.imd.get_object_reference(cr, uid, 'base', 'be')[1]
++        country_fr = self.imd.get_object_reference(cr, uid, 'base', 'fr')[1]
++        group_partner_manager = self.imd.get_object_reference(cr, uid, 'base', 'group_partner_manager')[1]
++        group_multi_company = self.imd.get_object_reference(cr, uid, 'base', 'group_multi_company')[1]
++
++        sub_company = self.company.create(cr, uid, {'name': 'MegaCorp', 'parent_id': parent_company_id})
++        alice = self.user.create(cr, uid, {'name': 'Alice',
++            'login':'alice',
++            'email':'alice@youcompany.com',
++            'company_id':parent_company_id,
++            'company_ids':[(6, 0, [parent_company_id, sub_company])],
++            'country_id':country_be,
++            'groups_id': [(6, 0, [group_partner_manager, group_multi_company])]
++        })
++        bob = self.user.create(cr, uid, {'name': 'Bob',
++            'login':'bob',
++            'email':'bob@megacorp.com',
++            'company_id':sub_company,
++            'company_ids':[(6, 0, [parent_company_id, sub_company])],
++            'country_id':country_fr,
++            'groups_id': [(6, 0, [group_partner_manager, group_multi_company])]
++        })
++        
++        self.partner._columns = dict(self.partner._columns)
++        self.partner._columns.update({
++            'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"),
++        })
++        self.partner._all_columns.update({
++            'property_country': fields.column_info('property_country', self.partner._columns['property_country'], None, None, None),
++        })
++        self.partner._field_create(cr)
++
++        partner_id = self.partner.create(cr, alice, {
++            'name': 'An International Partner',
++            'email': 'partner@example.com',
++            'company_id': parent_company_id,
++        })
++        self.partner.write(cr, bob, [partner_id], {'property_country': country_fr})
++        self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Bob does not see the value he has set on the property field")
++
++        self.partner.write(cr, alice, [partner_id], {'property_country': country_be})
++        self.assertEqual(self.partner.browse(cr, alice, partner_id).property_country.id, country_be, "Alice does not see the value he has set on the property field")
++        self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Changes made by Alice have overwritten Bob's value")
Simple merge