diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index e141f33b9d1..efc0bc6a580 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -74,13 +74,19 @@ class account_analytic_line(osv.osv): product_obj = self.pool.get('product.product') analytic_journal_obj =self.pool.get('account.analytic.journal') product_price_type_obj = self.pool.get('product.price.type') + product_uom_obj = self.pool.get('product.uom') j_id = analytic_journal_obj.browse(cr, uid, journal_id, context=context) prod = product_obj.browse(cr, uid, prod_id, context=context) result = 0.0 if prod_id: - unit = prod.uom_id.id + unit_obj = False + if unit: + unit_obj = product_uom_obj.browse(cr, uid, unit, context=context) + if not unit_obj or prod.uom_id.category_id.id != unit_obj.category_id.id: + unit = prod.uom_id.id if j_id.type == 'purchase': - unit = prod.uom_po_id.id + if not unit_obj or prod.uom_po_id.category_id.id != unit_obj.category_id.id: + unit = prod.uom_po_id.id if j_id.type <> 'sale': a = prod.property_account_expense.id if not a: diff --git a/addons/crm/base_partner_merge.py b/addons/crm/base_partner_merge.py index c07a32579f0..11cacc57ce6 100644 --- a/addons/crm/base_partner_merge.py +++ b/addons/crm/base_partner_merge.py @@ -378,11 +378,20 @@ class MergePartnerAutomatic(osv.TransientModel): return {'type': 'ir.actions.act_window_close'} def _generate_query(self, fields, maximum_group=100): - group_fields = ', '.join(fields) + sql_fields = [] + for field in fields: + if field in ['email', 'name']: + sql_fields.append('lower(%s)' % field) + elif field in ['vat']: + sql_fields.append("replace(%s, ' ', '')" % field) + else: + sql_fields.append(field) + + group_fields = ', '.join(sql_fields) filters = [] for field in fields: - if field in ['email', 'name']: + if field in ['email', 'name', 'vat']: filters.append((field, 'IS NOT', 'NULL')) criteria = ' AND '.join('%s %s %s' % (field, operator, value) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index e5b06d65f6d..289df840720 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -896,7 +896,7 @@ class mail_thread(osv.AbstractModel): # 1. message is a reply to an existing message (exact match of message_id) ref_match = thread_references and tools.reference_re.search(thread_references) - msg_references = thread_references.split() + msg_references = mail_header_msgid_re.findall(thread_references) mail_message_ids = mail_msg_obj.search(cr, uid, [('message_id', 'in', msg_references)], context=context) if ref_match and mail_message_ids: original_msg = mail_msg_obj.browse(cr, SUPERUSER_ID, mail_message_ids[0], context=context) @@ -939,7 +939,7 @@ class mail_thread(osv.AbstractModel): email_from, email_to, message_id, model, thread_id, custom_values, uid) return [route] - # 2. Reply to a private message + # 3. Reply to a private message if in_reply_to: mail_message_ids = mail_msg_obj.search(cr, uid, [ ('message_id', '=', in_reply_to), @@ -956,7 +956,7 @@ class mail_thread(osv.AbstractModel): email_from, email_to, message_id, mail_message.id, custom_values, uid) return [route] - # 3. Look for a matching mail.alias entry + # 4. Look for a matching mail.alias entry # Delivered-To is a safe bet in most modern MTAs, but we have to fallback on To + Cc values # for all the odd MTAs out there, as there is no standard header for the envelope's `rcpt_to` value. rcpt_tos = \ @@ -991,7 +991,7 @@ class mail_thread(osv.AbstractModel): routes.append(route) return routes - # 4. Fallback to the provided parameters, if they work + # 5. Fallback to the provided parameters, if they work if not thread_id: # Legacy: fallback to matching [ID] in the Subject match = tools.res_re.search(decode_header(message, 'Subject')) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 5a40d081a09..fc0d1e1c973 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -4653,18 +4653,19 @@ class BaseModel(object): order_by = self._generate_order_by(order, query) from_clause, where_clause, where_clause_params = query.get_sql() - limit_str = limit and ' limit %d' % limit or '' - offset_str = offset and ' offset %d' % offset or '' where_str = where_clause and (" WHERE %s" % where_clause) or '' - query_str = 'SELECT "%s".id FROM ' % self._table + from_clause + where_str + order_by + limit_str + offset_str if count: - # /!\ the main query must be executed as a subquery, otherwise - # offset and limit apply to the result of count()! - cr.execute('SELECT count(*) FROM (%s) AS count' % query_str, where_clause_params) + # Ignore order, limit and offset when just counting, they don't make sense and could + # hurt performance + query_str = 'SELECT count(1) FROM ' + from_clause + where_str + cr.execute(query_str, where_clause_params) res = cr.fetchone() return res[0] + limit_str = limit and ' limit %d' % limit or '' + offset_str = offset and ' offset %d' % offset or '' + query_str = 'SELECT "%s".id FROM ' % self._table + from_clause + where_str + order_by + limit_str + offset_str cr.execute(query_str, where_clause_params) res = cr.fetchall()