diff --git a/openerp/addons/base/ir/ir_qweb/ir_qweb.py b/openerp/addons/base/ir/ir_qweb/ir_qweb.py index c624bf64731..cee3b569fb8 100644 --- a/openerp/addons/base/ir/ir_qweb/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb/ir_qweb.py @@ -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 diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index a34e5ce2b8f..415d4318365 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -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 diff --git a/openerp/fields.py b/openerp/fields.py index ce58e4ea0c0..3c4b8aaf521 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -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')) diff --git a/openerp/models.py b/openerp/models.py index 284deff5c6a..d63298b8a57 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -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)] diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index 14bd0ec76b2..b5d6b7a13ad 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -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: diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py index 9499553d9a5..07531254cf1 100644 --- a/openerp/tools/translate.py +++ b/openerp/tools/translate.py @@ -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 ''