From cd31cbf556cc11950ce6188041cf5c2fcd89e0f8 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 31 Jul 2014 18:05:17 +0200 Subject: [PATCH 1/5] [FIX] account: on_change_unit_amount do not reset uom to default --- addons/account/account_analytic_line.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index f3617106f28..077a4090769 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -74,13 +74,17 @@ 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 = product_uom_obj.browse(cr, uid, unit, context=context) + if 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 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: From 7c5bf67a5f9378fe4ae01eeffff24889f7bdcdc5 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 31 Jul 2014 18:15:41 +0200 Subject: [PATCH 2/5] [FIX] account: unit arg of on_change_unit_amount can be False --- addons/account/account_analytic_line.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index 077a4090769..e620359959c 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -79,11 +79,13 @@ class account_analytic_line(osv.osv): prod = product_obj.browse(cr, uid, prod_id, context=context) result = 0.0 if prod_id: - unit_obj = product_uom_obj.browse(cr, uid, unit, context=context) - if prod.uom_id.category_id.id != unit_obj.category_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': - if prod.uom_po_id.category_id.id != unit_obj.category_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 From 2d17c18c7dda7fce75b0fc2c9e4c4954151151de Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 31 Jul 2014 19:38:00 +0200 Subject: [PATCH 3/5] [FIX] crm: base_partner_merge, search with lowercase for name,email and without spaces for vat --- addons/crm/base_partner_merge.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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) From f247bdd0b66d3d467de21ed1b966713c42c886aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=ABl=20Closson?= Date: Fri, 20 Jun 2014 13:13:23 +0200 Subject: [PATCH 4/5] [FIX] mail: message-id not parsed properly in message_route Same as for rev 4bad513, the references were not correctly parsed, added missing regex --- addons/mail/mail_thread.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 279294d49ff..213463340f3 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -859,7 +859,7 @@ class mail_thread(osv.AbstractModel): thread_references = references or in_reply_to # 1. message is a reply to an existing message (exact match of message_id) - 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 mail_message_ids: original_msg = mail_msg_obj.browse(cr, SUPERUSER_ID, mail_message_ids[0], context=context) From e79a3675d13eacfd3d38e9725bbb354c778f0252 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 1 Aug 2014 12:34:41 +0200 Subject: [PATCH 5/5] [FIX] orm.search_count: ignore `limit`, `offset` and most importantly `order` These parameters are (or should be) irrelevant for a search_count(), and they could actually break the result or make it significantly slower (e.g applying `order` on large tables). This fixes a performance regression introduced by 0f43032b. We could also raise an error offset/limit are passed in combination with count, but that seems unnecessary. Also switched to "SELECT count(1)" for the count query, as it is simpler and just as fast. We'd get the same perf with * or any constant value, as in "SELECT count('me in')", but let's keep it simple ;-) --- openerp/osv/orm.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 79d6d213939..808276c4639 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -4606,18 +4606,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()