[MERGE] Forward-port of 7.0 fixes up to rev. 4961
authorOlivier Dony <odo@openerp.com>
Thu, 25 Apr 2013 17:14:44 +0000 (19:14 +0200)
committerOlivier Dony <odo@openerp.com>
Thu, 25 Apr 2013 17:14:44 +0000 (19:14 +0200)
rev-id odo@openerp.com-20130425171238-dhgpqbi9nio12vxk

bzr revid: odo@openerp.com-20130424131936-5eb7omkz51arnm81
bzr revid: odo@openerp.com-20130425171444-ycu89d2393f8nnxm

1  2 
openerp/addons/base/res/res_partner.py
openerp/addons/base/res/res_partner_view.xml

@@@ -27,9 -27,10 +27,10 @@@ import r
  
  import openerp
  from openerp import SUPERUSER_ID
 -from openerp import pooler, tools
 +from openerp import tools
  from openerp.osv import osv, fields
  from openerp.tools.translate import _
+ from openerp.tools.yaml_import import is_comment
  
  class format_address(object):
      def fields_view_get_address(self, cr, uid, arch, context={}):
@@@ -159,8 -160,9 +160,8 @@@ def _lang_get(self, cr, uid, context=No
      res = lang_pool.read(cr, uid, ids, ['code', 'name'], context)
      return [(r['code'], r['name']) for r in res]
  
- POSTAL_ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id')
- ADDRESS_FIELDS = POSTAL_ADDRESS_FIELDS + ('email', 'phone', 'fax', 'mobile', 'website', 'ref', 'lang')
+ # fields copy if 'use_parent_address' is checked
+ ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id')
 -POSTAL_ADDRESS_FIELDS = ADDRESS_FIELDS # deprecated, to remove after 7.0
  
  class res_partner(osv.osv, format_address):
      _description = 'Partner'
              result[obj.id] = obj.image != False
          return result
  
-     _order = "name"
+     def _commercial_partner_compute(self, cr, uid, ids, name, args, context=None):
+         """ Returns the partner that is considered the commercial
+         entity of this partner. The commercial entity holds the master data
+         for all commercial fields (see :py:meth:`~_commercial_fields`) """
+         result = dict.fromkeys(ids, False)
+         for partner in self.browse(cr, uid, ids, context=context):
+             current_partner = partner 
+             while not current_partner.is_company and current_partner.parent_id:
+                 current_partner = current_partner.parent_id
+             result[partner.id] = current_partner.id
+         return result
 -    # indirection to avoid passing a copy of the overridable method when declaring the function field
++    def _display_name_compute(self, cr, uid, ids, name, args, context=None):
++        return dict(self.name_get(cr, uid, ids, context=context))
++
++    # indirections to avoid passing a copy of the overridable method when declaring the function field
+     _commercial_partner_id = lambda self, *args, **kwargs: self._commercial_partner_compute(*args, **kwargs)
++    _display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs)
++
++    _commercial_partner_store_triggers = {
++        'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]),
++                        ['parent_id', 'is_company'], 10) 
++    }
++    _display_name_store_triggers = {
++        'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]),
++                        ['parent_id', 'is_company', 'name'], 10) 
++    }
 -    _order = "name"
++    _order = "display_name"
      _columns = {
          'name': fields.char('Name', size=128, required=True, select=True),
++        'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers),
          'date': fields.date('Date', select=1),
          'title': fields.many2one('res.partner.title', 'Title'),
          'parent_id': fields.many2one('res.partner', 'Related Company'),
          'color': fields.integer('Color Index'),
          'user_ids': fields.one2many('res.users', 'partner_id', 'Users'),
          'contact_address': fields.function(_address_display,  type='char', string='Complete Address'),
+         # technical field used for managing commercial fields
 -        'commercial_partner_id': fields.function(_commercial_partner_id, type='many2one', relation='res.partner', string='Commercial Entity')
++        'commercial_partner_id': fields.function(_commercial_partner_id, type='many2one', relation='res.partner', string='Commercial Entity', store=_commercial_partner_store_triggers)
      }
  
      def _default_category(self, cr, uid, context=None):
          'tz': lambda self, cr, uid, ctx: ctx.get('tz', False),
          'customer': True,
          'category_id': _default_category,
 -        'company_id': lambda self, cr, uid, ctx: self.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=ctx),
 +        'company_id': lambda self, cr, uid, ctx: self.pool['res.company']._company_default_get(cr, uid, 'res.partner', context=ctx),
          'color': 0,
          'is_company': False,
-         'type': 'default',
-         'use_parent_address': True,
+         'type': 'contact', # type 'default' is wildcard and thus inappropriate
+         'use_parent_address': False,
          'image': False,
      }
  
@@@ -77,7 -77,7 +77,7 @@@
              <field eval="8" name="priority"/>
              <field name="arch" type="xml">
                  <tree string="Contacts">
--                    <field name="name"/>
++                    <field name="display_name"/>
                      <field name="function" invisible="1"/>
                      <field name="phone"/>
                      <field name="email"/>
              <field name="arch" type="xml">
                  <kanban>
                      <field name="color"/>
--                    <field name="name"/>
++                    <field name="display_name"/>
                      <field name="title"/>
                      <field name="email"/>
                      <field name="parent_id"/>
                                      </t>
                                  </a>
                                  <div class="oe_kanban_details">
--                                    <h4 class="oe_partner_heading"><a type="open"><field name="name"/></a></h4>
++                                    <h4 class="oe_partner_heading"><a type="open"><field name="display_name"/></a></h4>
                                      <div class="oe_kanban_partner_categories"/>
                                      <div class="oe_kanban_partner_links"/>
                                      <ul>