[IMP] fields: add translate on all fields, and normalize its value

This commit is contained in:
Raphael Collet
2016-08-31 17:21:51 +02:00
parent f8c845bbdb
commit ddaa187f69
6 changed files with 23 additions and 19 deletions
+1 -1
View File
@@ -250,7 +250,7 @@ class IrQWeb(models.AbstractModel, QWeb):
field_options['type'] = field_options.get('widget', field.type)
inherit_branding = options.get('inherit_branding', options.get('inherit_branding_auto') and record.check_access_rights('write', False))
field_options['inherit_branding'] = inherit_branding
translate = options.get('edit_translations') and options.get('translatable') and getattr(field, 'translate', False)
translate = options.get('edit_translations') and options.get('translatable') and field.translate
field_options['translate'] = translate
# field converter
+2 -2
View File
@@ -443,7 +443,7 @@ class IrTranslation(models.Model):
between modified strings is not too large. It allows to not retranslate
data where a typo has been fixed in the English value.
"""
if not callable(getattr(field, 'translate', None)):
if not callable(field.translate):
return
trans = self.env['ir.translation']
@@ -643,7 +643,7 @@ class IrTranslation(models.Model):
# insert missing translations, and extend domain for related fields
for name, fld in record._fields.items():
if not getattr(fld, 'translate', False):
if not fld.translate:
continue
rec = record
+8 -1
View File
@@ -293,6 +293,7 @@ class Field(object):
type = None # type of the field (string)
relational = False # whether the field is a relational one
translate = False # whether the field is translated
column_type = None # database column type (ident, spec)
column_format = '%s' # placeholder for value in queries
@@ -1286,6 +1287,12 @@ class _String(Field):
'translate': False, # whether the field is translated
}
def __init__(self, string=Default, **kwargs):
# translate is either True, False, or a callable
if 'translate' in kwargs and not callable(kwargs['translate']):
kwargs['translate'] = bool(kwargs['translate'])
super(_String, self).__init__(string=string, **kwargs)
_column_translate = property(attrgetter('translate'))
_related_translate = property(attrgetter('translate'))
@@ -1412,7 +1419,7 @@ class Html(_String):
def _setup_attrs(self, model, name):
super(Html, self)._setup_attrs(model, name)
# Translated sanitized html fields must use html_translate or a callable.
if self.translate and not callable(self.translate) and self.sanitize:
if self.translate is True and self.sanitize:
self.translate = html_translate
_column_sanitize = property(attrgetter('sanitize'))
+10 -13
View File
@@ -336,7 +336,7 @@ class BaseModel(object):
'readonly': bool(field.readonly),
'required': bool(field.required),
'selectable': bool(field.search or field.store),
'translate': bool(getattr(field, 'translate', False)),
'translate': bool(field.translate),
'relation_field': field.inverse_name if field.type == 'one2many' else None,
'serialization_field_id': None,
'relation_table': field.relation if field.type == 'many2many' else None,
@@ -2115,8 +2115,7 @@ class BaseModel(object):
)
model, alias, field = parent_model, parent_alias, field.related_field
# handle the case where the field is translated
translate = getattr(field, 'translate', None)
if translate and not callable(translate):
if field.translate is True:
return model._generate_translated_field(alias, fname, query)
else:
return '"%s"."%s"' % (alias, fname)
@@ -3139,7 +3138,7 @@ class BaseModel(object):
field
for field in fields
if field.base_field.column._classic_write
if not (field.inherited and callable(field.base_field.column.translate))
if not (field.inherited and callable(field.base_field.translate))
]
# the query may involve several tables: we need fully-qualified names
@@ -3178,7 +3177,7 @@ class BaseModel(object):
# translate the fields if necessary
if context.get('lang'):
for field in fields_pre:
if not field.inherited and callable(field.column.translate):
if not field.inherited and callable(field.translate):
f = field.name
translate = field.get_trans_func(fetched)
for vals in result:
@@ -3651,7 +3650,7 @@ class BaseModel(object):
if hasattr(field, 'selection') and val:
self._check_selection_field_value(name, val)
if field.column_type:
if single_lang or not (has_trans and getattr(field, 'translate', None) and not callable(field.translate)):
if single_lang or not (has_trans and field.translate is True):
# val is not a translation: update the table
val = field.convert_to_column(val, self)
updates.append((name, field.column_format, val))
@@ -3681,14 +3680,12 @@ class BaseModel(object):
# TODO: optimize
for name in direct:
field = self._fields[name]
translate = getattr(field, 'translate', None)
if callable(translate):
if callable(field.translate):
# The source value of a field has been modified,
# synchronize translated terms when possible.
self.env['ir.translation']._sync_terms_translations(self._fields[name], self)
elif has_trans and translate:
elif has_trans and field.translate:
# The translated value of a field has been modified.
src_trans = self.read([name])[0][name]
if not src_trans:
@@ -3953,8 +3950,8 @@ class BaseModel(object):
if self.env.lang and self.env.lang != 'en_US':
# add translations for self.env.lang
for name, val in vals.iteritems():
column = self._columns[name]
if column._classic_write and column.translate and not callable(column.translate):
field = self._fields[name]
if field.store and field.column_type and field.translate is True:
tname = "%s,%s" % (self._name, name)
self.env['ir.translation']._set_ids(tname, 'model', self.env.lang, self.ids, val, val)
@@ -4397,7 +4394,7 @@ class BaseModel(object):
for (old_line, new_line) in zip(old_lines, new_lines):
old_line.copy_translations(new_line)
elif getattr(field, 'translate', False):
elif field.translate:
# for translatable fields we copy their translations
trans_name, source_id, target_id = get_trans(field, old, new)
domain = [('name', '=', trans_name), ('res_id', '=', source_id)]
+1 -1
View File
@@ -1075,7 +1075,7 @@ class expression(object):
right += ' 00:00:00'
push(create_substitution_leaf(leaf, (left, operator, right), model))
elif column.translate and not callable(column.translate) and right:
elif field.translate is True and right:
need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)
if need_wildcard:
+1 -1
View File
@@ -876,7 +876,7 @@ def trans_generate(lang, modules, cr):
_logger.exception("couldn't export translation for report %s %s %s", name, report_type, fname)
for field_name, field in record._fields.iteritems():
if getattr(field, 'translate', None):
if field.translate:
name = model + "," + field_name
try:
value = record[field_name] or ''