trytond-patches/issue8705.diff

143 lines
5.9 KiB
Diff
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HG changeset patch
# User Cédric Krier <cedric.krier@b2ck.com>
Always use search method on translations
trytond: Always use search method on translations
This ensure to have always the same order when selecting the record out of many
duplicates (which can happen as there is no unique constraint since
r 426276806f60).
issue8705
review260271002
Index: trytond/ir/translation.py
===================================================================
--- a/trytond/trytond/ir/translation.py
+++ b/trytond/trytond/ir/translation.py
@@ -11,7 +11,6 @@
from sql import Column, Null, Literal
from sql.functions import Substring, Position
from sql.conditionals import Case
-from sql.operators import Or, And
from sql.aggregate import Max
from genshi.filters.i18n import extract as genshi_extract
@@ -24,7 +23,7 @@
from ..model import ModelView, ModelSQL, fields
from ..wizard import Wizard, StateView, StateTransition, StateAction, \
Button
-from ..tools import file_open, reduce_ids, grouped_slice, cursor_dict
+from ..tools import file_open, grouped_slice, cursor_dict
from ..pyson import PYSONEncoder, Eval
from ..transaction import Transaction
from ..pool import Pool
@@ -346,27 +345,20 @@
translations.update(
cls.get_ids(name, ttype, parent_lang, to_fetch))
- transaction = Transaction()
- cursor = transaction.connection.cursor()
- table = cls.__table__()
- fuzzy_sql = table.fuzzy == False
if Transaction().context.get('fuzzy_translation', False):
- fuzzy_sql = None
- in_max = transaction.database.IN_MAX // 7
- for sub_to_fetch in grouped_slice(to_fetch, in_max):
- red_sql = reduce_ids(table.res_id, sub_to_fetch)
- where = And(((table.lang == lang),
- (table.type == ttype),
- (table.name == name),
- (table.value != ''),
- (table.value != Null),
- red_sql,
- ))
- if fuzzy_sql:
- where &= fuzzy_sql
- cursor.execute(*table.select(table.res_id, table.value,
- where=where))
- translations.update(cursor)
+ fuzzy_clause = []
+ else:
+ fuzzy_clause = [('fuzzy', '=', False)]
+ for sub_to_fetch in grouped_slice(to_fetch):
+ for translation in cls.search([
+ ('lang', '=', lang),
+ ('type', '=', ttype),
+ ('name', '=', name),
+ ('value', '!=', ''),
+ ('value', '!=', None),
+ ('res_id', 'in', list(sub_to_fetch)),
+ ] + fuzzy_clause):
+ translations[translation.res_id] = translation.value
# Don't store fuzzy translation in cache
if not Transaction().context.get('fuzzy_translation', False):
for res_id in to_fetch:
@@ -526,10 +518,8 @@
res = {}
parent_args = []
parent_langs = []
- clause = []
+ clauses = []
transaction = Transaction()
- cursor = transaction.connection.cursor()
- table = cls.__table__()
if len(args) > transaction.database.IN_MAX:
for sub_args in grouped_slice(args):
res.update(cls.get_sources(list(sub_args)))
@@ -552,17 +542,18 @@
parent_args.append((name, ttype, parent_lang, source))
parent_langs.append(lang)
res[(name, ttype, lang, source)] = None
- where = And(((table.lang == lang),
- (table.type == ttype),
- (table.name == name),
- (table.value != ''),
- (table.value != Null),
- (table.fuzzy == False),
- (table.res_id == -1),
- ))
+ clause = [
+ ('lang', '=', lang),
+ ('type', '=', ttype),
+ ('name', '=', name),
+ ('value', '!=', ''),
+ ('value', '!=', None),
+ ('fuzzy', '=', False),
+ ('res_id', '=', -1),
+ ]
if source is not None:
- where &= table.src == source
- clause.append(where)
+ clause.append(('src', '=', source))
+ clauses.append(clause)
# Get parent transactions
if parent_args:
@@ -572,17 +563,13 @@
res[(name, ttype, lang, source)] = parent_src[
(name, ttype, parent_lang, source)]
- if clause:
- in_max = transaction.database.IN_MAX // 7
- for sub_clause in grouped_slice(clause, in_max):
- cursor.execute(*table.select(
- table.lang, table.type, table.name, table.src,
- table.value,
- where=Or(list(sub_clause))))
- for lang, ttype, name, source, value in cursor.fetchall():
- if (name, ttype, lang, source) not in args:
- source = None
- res[(name, ttype, lang, source)] = value
+ for sub_clause in grouped_slice(clauses):
+ for translation in cls.search(['OR'] + list(sub_clause)):
+ key = (translation.name, translation.type,
+ translation.name, translation.name, translation.src)
+ if key not in args:
+ key = key[:-1] + (None,)
+ res[key] = translation.value
for key in to_cache:
cls._translation_cache.set(key, res[key])
return res