Merge lp:~openerp-dev/openobject-server/6.0-bug-1071710-chs into lp:openobject-server/6.0

Proposed by Christophe Simonis (OpenERP)
Status: Merged
Merged at revision: 3672
Proposed branch: lp:~openerp-dev/openobject-server/6.0-bug-1071710-chs
Merge into: lp:openobject-server/6.0
Diff against target: 75 lines (+25/-4)
2 files modified
bin/addons/base/test/test_osv_expression.yml (+14/-1)
bin/osv/expression.py (+11/-3)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/6.0-bug-1071710-chs
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+200605@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/addons/base/test/test_osv_expression.yml'
2--- bin/addons/base/test/test_osv_expression.yml 2010-12-29 17:42:23 +0000
3+++ bin/addons/base/test/test_osv_expression.yml 2014-01-06 22:46:37 +0000
4@@ -110,4 +110,17 @@
5 res_ids = self.search(cr, uid, [('company_id.partner_id', 'not in', [])])
6 res_ids.sort()
7 assert res_ids == all_ids, "Searching against empty set failed, returns %r" % res_ids
8-
9+-
10+ Check that we can exclude translated fields (bug lp:1071710)
11+-
12+ !python {model: res.country}: |
13+ # first install french language
14+ BLI = self.pool.get('base.language.install')
15+ BLI.lang_install(cr, uid, [BLI.create(cr, uid, {'lang': 'fr_FR'})])
16+
17+ be_id = self.search(cr, uid, [('name', '=', 'Belgium')])[0]
18+
19+ ctx = {'lang': 'fr_FR'}
20+ not_be = self.search(cr, uid, [('name', '!=', 'Belgique')], context=ctx)
21+
22+ assert be_id not in not_be, "Search match failed"
23
24=== modified file 'bin/osv/expression.py'
25--- bin/osv/expression.py 2011-01-17 08:41:08 +0000
26+++ bin/osv/expression.py 2014-01-06 22:46:37 +0000
27@@ -37,7 +37,7 @@
28
29 def _is_leaf(self, element, internal=False):
30 OPS = ('=', '!=', '<>', '<=', '<', '>', '>=', '=?', '=like', '=ilike', 'like', 'not like', 'ilike', 'not ilike', 'in', 'not in', 'child_of')
31- INTERNAL_OPS = OPS + ('inselect',)
32+ INTERNAL_OPS = OPS + ('inselect', 'not inselect')
33 return (isinstance(element, tuple) or isinstance(element, list)) \
34 and len(element) == 3 \
35 and (((not internal) and element[1] in OPS) \
36@@ -358,6 +358,11 @@
37
38 operator = operator == '=like' and 'like' or operator
39
40+ new_op = 'inselect'
41+ if operator in ['not like', 'not ilike', 'not in', '<>', '!=']:
42+ new_op = 'not inselect'
43+ operator = {'not like': 'like', 'not ilike': 'ilike', 'not in': 'in', '<>': '=', '!=': '='}[operator]
44+
45 query1 = '( SELECT res_id' \
46 ' FROM ir_translation' \
47 ' WHERE name = %s' \
48@@ -365,7 +370,7 @@
49 ' AND type = %s'
50 instr = ' %s'
51 #Covering in,not in operators with operands (%s,%s) ,etc.
52- if operator in ['in','not in']:
53+ if operator == 'in':
54 instr = ','.join(['%s'] * len(right))
55 query1 += ' AND value ' + operator + ' ' +" (" + instr + ")" \
56 ') UNION (' \
57@@ -386,7 +391,7 @@
58 right,
59 ]
60
61- self.__exp[i] = ('id', 'inselect', (query1, query2))
62+ self.__exp[i] = ('id', new_op, (query1, query2))
63
64 return self
65
66@@ -398,6 +403,9 @@
67 if operator == 'inselect':
68 query = '(%s.%s in (%s))' % (table._table, left, right[0])
69 params = right[1]
70+ elif operator == 'not inselect':
71+ query = '(%s.%s not in (%s))' % (table._table, left, right[0])
72+ params = right[1]
73 elif operator in ['in', 'not in']:
74 params = right and right[:] or []
75 len_before = len(params)