[MERGE] forward port of branch 7.0 up to revid 5075 chs@openerp.com-20130912141018...
authorChristophe Simonis <chs@openerp.com>
Thu, 12 Sep 2013 15:06:16 +0000 (17:06 +0200)
committerChristophe Simonis <chs@openerp.com>
Thu, 12 Sep 2013 15:06:16 +0000 (17:06 +0200)
bzr revid: chs@openerp.com-20130906165207-1oklc8cqs0rex3kg
bzr revid: dle@openerp.com-20130909170248-a4t5y6qd5ikkhhac
bzr revid: dle@openerp.com-20130911083736-6jfkb140jxbbx7j6
bzr revid: chs@openerp.com-20130912150616-v0c383trj7gaa7eu

1  2 
openerp/addons/base/ir/ir_actions.py
openerp/addons/base/ir/ir_mail_server.py
openerp/addons/base/ir/ir_ui_view.py
openerp/addons/base/res/res_partner.py
openerp/addons/base/res/res_users.py
openerp/addons/base/tests/__init__.py
openerp/modules/loading.py
openerp/osv/orm.py

@@@ -88,45 -84,26 +88,45 @@@ class report_xml(osv.osv)
                  res[report.id] = False
          return res
  
 -    def register_all(self, cr):
 -        """Report registration handler that may be overridden by subclasses to
 -           add their own kinds of report services.
 -           Loads all reports with no manual loaders (auto==True) and
 -           registers the appropriate services to implement them.
 +    def _lookup_report(self, cr, name):
 +        """
 +        Look up a report definition.
          """
          opj = os.path.join
 -        cr.execute("SELECT * FROM ir_act_report_xml WHERE auto=%s ORDER BY id", (True,))
 -        result = cr.dictfetchall()
 -        svcs = netsvc.Service._services
 -        for r in result:
 -            if svcs.has_key('report.'+r['report_name']):
 -                continue
 -            if r['report_rml'] or r['report_rml_content_data']:
 -                report_sxw('report.'+r['report_name'], r['model'],
 -                        opj('addons',r['report_rml'] or '/'), header=r['header'])
 -            elif r['report_xsl'] and r['report_xml']:
 -                report_rml('report.'+r['report_name'], r['model'],
 -                        opj('addons',r['report_xml']),
 -                        r['report_xsl'] and opj('addons',r['report_xsl']))
 +
 +        # First lookup in the deprecated place, because if the report definition
 +        # has not been updated, it is more likely the correct definition is there.
 +        # Only reports with custom parser sepcified in Python are still there.
 +        if 'report.' + name in openerp.report.interface.report_int._reports:
 +            new_report = openerp.report.interface.report_int._reports['report.' + name]
 +        else:
 +            cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,))
 +            r = cr.dictfetchone()
 +            if r:
 +                if r['report_rml'] or r['report_rml_content_data']:
 +                    if r['parser']:
 +                        kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) }
 +                    else:
 +                        kwargs = {}
 +                    new_report = report_sxw('report.'+r['report_name'], r['model'],
 +                            opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs)
-                 elif r['report_xsl']:
++                elif r['report_xsl'] and r['report_xml']:
 +                    new_report = report_rml('report.'+r['report_name'], r['model'],
 +                            opj('addons',r['report_xml']),
 +                            r['report_xsl'] and opj('addons',r['report_xsl']), register=False)
 +                else:
 +                    raise Exception, "Unhandled report type: %s" % r
 +            else:
 +                raise Exception, "Required report does not exist: %s" % r
 +
 +        return new_report
 +
 +    def render_report(self, cr, uid, res_ids, name, data, context=None):
 +        """
 +        Look up a report definition and render the report for the provided IDs.
 +        """
 +        new_report = self._lookup_report(cr, name)
 +        return new_report.create(cr, uid, res_ids, data, context)
  
      _name = 'ir.actions.report.xml'
      _inherit = 'ir.actions.actions'
@@@ -123,9 -123,9 +123,9 @@@ class view(osv.osv)
                 if no error occurred, else False.  
          """
          try:
 -            fvg = self.pool.get(view.model).fields_view_get(cr, uid, view_id=view.id, view_type=view.type, context=context)
 +            fvg = self.pool[view.model].fields_view_get(cr, uid, view_id=view.id, view_type=view.type, context=context)
              return fvg['arch']
-         except:
+         except Exception:
              _logger.exception("Can't render view %s for model: %s", view.xml_id, view.model)
              return False
  
@@@ -608,14 -603,31 +618,15 @@@ class res_partner(osv.osv, format_addre
              if operator in ('=ilike', '=like'):
                  operator = operator[1:]
              query_args = {'name': search_name}
-             limit_str = ''
 -            # TODO: simplify this in trunk with `display_name`, once it is stored
 -            # Perf note: a CTE expression (WITH ...) seems to have an even higher cost
 -            #            than this query with duplicated CASE expressions. The bulk of
 -            #            the cost is the ORDER BY, and it is inevitable if we want
 -            #            relevant results for the next step, otherwise we'd return
 -            #            a random selection of `limit` results.
 -            query = ('''SELECT partner.id FROM res_partner partner
 -                                          LEFT JOIN res_partner company
 -                                               ON partner.parent_id = company.id
 -                        WHERE partner.email ''' + operator + ''' %(name)s OR
 -                              CASE
 -                                   WHEN company.id IS NULL OR partner.is_company
 -                                       THEN partner.name
 -                                   ELSE company.name || ', ' || partner.name
 -                              END ''' + operator + ''' %(name)s
 -                        ORDER BY
 -                              CASE
 -                                   WHEN company.id IS NULL OR partner.is_company
 -                                       THEN partner.name
 -                                   ELSE company.name || ', ' || partner.name
 -                              END''')
++            query = ('''SELECT id FROM res_partner
++                         WHERE email ''' + operator + ''' %(name)s
++                            OR display_name ''' + operator + ''' %(name)s
++                      ORDER BY display_name
++                     ''')
              if limit:
-                 limit_str = ' limit %(limit)s'
+                 query += ' limit %(limit)s'
                  query_args['limit'] = limit
-             cr.execute('''SELECT partner.id FROM res_partner partner
-                           LEFT JOIN res_partner company ON partner.parent_id = company.id
-                           WHERE partner.email ''' + operator +''' %(name)s OR
-                                 partner.display_name ''' + operator + ' %(name)s ' + limit_str, query_args)
+             cr.execute(query, query_args)
              ids = map(lambda x: x[0], cr.fetchall())
              ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context)
              if ids:
@@@ -294,10 -300,14 +301,14 @@@ class res_users(osv.osv)
                  uid = 1 # safe fields only, so we write as super-user to bypass access rights
  
          res = super(res_users, self).write(cr, uid, ids, values, context=context)
+         if 'company_id' in values:
+             for user in self.browse(cr, uid, ids, context=context):
+                 # if partner is global we keep it that way
+                 if user.partner_id.company_id and user.partner_id.company_id.id != values['company_id']: 
+                     user.partner_id.write({'company_id': user.company_id.id})
          # clear caches linked to the users
 -        self.pool.get('ir.model.access').call_cache_clearing_methods(cr)
 -        clear = partial(self.pool.get('ir.rule').clear_cache, cr)
 +        self.pool['ir.model.access'].call_cache_clearing_methods(cr)
 +        clear = partial(self.pool['ir.rule'].clear_cache, cr)
          map(clear, ids)
          db = cr.dbname
          if db in self._uid_cache:
@@@ -3,9 -3,8 +3,10 @@@ import test_expressio
  import test_ir_attachment
  import test_ir_values
  import test_menu
 +import test_res_config
 +import test_res_lang
  import test_search
+ import test_views
  
  checks = [
      test_base,
@@@ -13,7 -12,6 +14,8 @@@
      test_ir_attachment,
      test_ir_values,
      test_menu,
 +    test_res_config,
 +    test_res_lang,
      test_search,
+     test_views,
  ]
Simple merge
Simple merge