diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py
index 3d4810a308f..d2b33ce7a4d 100644
--- a/bin/addons/__init__.py
+++ b/bin/addons/__init__.py
@@ -68,7 +68,7 @@ class Graph(dict):
father.addChild(name)
else:
Node(name, self)
-
+
def update_from_db(self, cr):
# update the graph with values from the database (if exist)
## First, we set the default values for each package in graph
@@ -141,7 +141,7 @@ class Node(Singleton):
def __iter__(self):
return itertools.chain(iter(self.children), *map(iter, self.children))
-
+
def __str__(self):
return self._pprint()
@@ -322,7 +322,7 @@ def upgrade_graph(graph, cr, module_list, force=None):
raise
if info.get('installable', True):
packages.append((module, info.get('depends', []), info))
-
+
dependencies = dict([(p, deps) for p, deps, data in packages])
current, later = set([p for p, dep, data in packages]), set()
@@ -352,7 +352,7 @@ def upgrade_graph(graph, cr, module_list, force=None):
for package in later:
unmet_deps = filter(lambda p: p not in graph, dependencies[package])
logger.notifyChannel('init', netsvc.LOG_ERROR, 'module %s: Unmet dependencies: %s' % (package, ', '.join(unmet_deps)))
-
+
result = len(graph) - len_graph
if result != len(module_list):
logger.notifyChannel('init', netsvc.LOG_WARNING, 'Not all modules have loaded.')
@@ -513,7 +513,7 @@ class MigrationManager(object):
parsed_installed_version = parse_version(pkg.installed_version or '')
current_version = parse_version(convert_version(pkg.data.get('version', '0')))
-
+
versions = _get_migration_versions(pkg)
for version in versions:
@@ -580,13 +580,12 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'):
init_module_objects(cr, package.name, modules)
cr.commit()
-
+
for package in graph:
status['progress'] = (float(statusi)+0.1) / len(graph)
m = package.name
mid = package.id
-
if modobj is None:
modobj = pool.get('ir.module.module')
@@ -595,7 +594,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
idref = {}
status['progress'] = (float(statusi)+0.4) / len(graph)
-
+
mode = 'update'
if hasattr(package, 'init') or package.state == 'to install':
mode = 'init'
@@ -633,7 +632,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
package_todo.append(package.name)
migrations.migrate_module(package, 'post')
-
+
if modobj:
ver = release.major_version + '.' + package.data.get('version', '1.0')
# Set new modules and dependencies
@@ -642,21 +641,21 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
# Update translations for all installed languages
modobj.update_translations(cr, 1, [mid], None)
cr.commit()
-
+
package.state = 'installed'
for kind in ('init', 'demo', 'update'):
if hasattr(package, kind):
delattr(package, kind)
statusi += 1
-
+
cr.execute('select model from ir_model where state=%s', ('manual',))
for model in cr.dictfetchall():
pool.get('ir.model').instanciate(cr, 1, model['model'], {})
pool.get('ir.model.data')._process_end(cr, 1, package_todo)
cr.commit()
-
+
return has_updates
def load_modules(db, force_demo=False, status=None, update_module=False):
@@ -673,7 +672,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
# NOTE: Try to also load the modules that have been marked as uninstallable previously...
STATES_TO_LOAD = ['installed', 'to upgrade', 'uninstallable']
graph = create_graph(cr, ['base'], force)
-
+
has_updates = load_module_graph(cr, graph, status, perform_checks=(not update_module), report=report)
if update_module:
@@ -695,9 +694,9 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
modobj.button_upgrade(cr, 1, ids)
cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base'))
-
+
STATES_TO_LOAD += ['to install']
-
+
loop_guardrail = 0
while True:
loop_guardrail += 1
@@ -713,7 +712,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
if new_modules_in_graph == 0:
# nothing to load
break
-
+
logger.notifyChannel('init', netsvc.LOG_DEBUG, 'Updating graph with %d more modules' % (len(module_list)))
r = load_module_graph(cr, graph, status, report=report)
has_updates = has_updates or r
diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml
index c1314cac2c3..f98b888399b 100644
--- a/bin/addons/base/ir/ir.xml
+++ b/bin/addons/base/ir/ir.xml
@@ -1063,7 +1063,7 @@
ir.model.access
tree
-
+
diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py
index c96044d2918..de1b2f0c53f 100644
--- a/bin/addons/base/ir/ir_model.py
+++ b/bin/addons/base/ir/ir_model.py
@@ -71,6 +71,11 @@ class ir_model(osv.osv):
pooler.restart_pool(cr.dbname)
return res
+ def write(self, cr, user, ids, vals, context=None):
+ if context:
+ del context['__last_update']
+ return super(ir_model,self).write(cr, user, ids, vals, context)
+
def create(self, cr, user, vals, context=None):
if context and context.get('manual',False):
vals['state']='manual'
diff --git a/bin/addons/base/ir/ir_rule.py b/bin/addons/base/ir/ir_rule.py
index 597ccf705e0..a2d53b4de27 100644
--- a/bin/addons/base/ir/ir_rule.py
+++ b/bin/addons/base/ir/ir_rule.py
@@ -31,7 +31,7 @@ class ir_rule_group(osv.osv):
_columns = {
'name': fields.char('Name', size=128, select=1),
'model_id': fields.many2one('ir.model', 'Object',select=1, required=True),
- 'global': fields.boolean('Global', select=1, help="Make the rule global, otherwise it needs to be put on a group or user"),
+ 'global': fields.boolean('Global', select=1, help="Make the rule global, otherwise it needs to be put on a group"),
'rules': fields.one2many('ir.rule', 'rule_group', 'Tests', help="The rule is satisfied if at least one test is True"),
'groups': fields.many2many('res.groups', 'group_rule_group_rel', 'rule_group_id', 'group_id', 'Groups'),
'users': fields.many2many('res.users', 'user_rule_group_rel', 'rule_group_id', 'user_id', 'Users'),
diff --git a/bin/addons/base/rng/view.rng b/bin/addons/base/rng/view.rng
index 59f52559f04..78944519593 100644
--- a/bin/addons/base/rng/view.rng
+++ b/bin/addons/base/rng/view.rng
@@ -272,6 +272,7 @@
+
diff --git a/bin/osv/expression.py b/bin/osv/expression.py
index 52abe2eaf2c..b849e77bd08 100644
--- a/bin/osv/expression.py
+++ b/bin/osv/expression.py
@@ -201,18 +201,30 @@ class expression(object):
if field.translate:
if operator in ('like', 'ilike', 'not like', 'not ilike'):
right = '%%%s%%' % right
+
+ operator = operator == '=like' and 'like' or operator
query1 = '( SELECT res_id' \
' FROM ir_translation' \
' WHERE name = %s' \
' AND lang = %s' \
- ' AND type = %s' \
- ' AND value ' + operator + ' %s' \
+ ' AND type = %s'
+ instr = ' %s'
+ #Covering in,not in operators with operands (%s,%s) ,etc.
+ if operator in ['in','not in']:
+ instr = ','.join(['%s'] * len(right))
+ query1 += ' AND value ' + operator + ' ' +" (" + instr + ")" \
') UNION (' \
' SELECT id' \
' FROM "' + working_table._table + '"' \
- ' WHERE "' + left + '" ' + operator + ' %s' \
- ')'
+ ' WHERE "' + left + '" ' + operator + ' ' +" (" + instr + "))"
+ else:
+ query1 += ' AND value ' + operator + instr + \
+ ') UNION (' \
+ ' SELECT id' \
+ ' FROM "' + working_table._table + '"' \
+ ' WHERE "' + left + '" ' + operator + instr + ")"
+
query2 = [working_table._name + ',' + left,
context.get('lang', False) or 'en_US',
'model',