Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][FIX?] preserve translate values when updating a field/model when its inherited #99

Open
wants to merge 1 commit into
base: 16.0
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions odoo/addons/base/models/ir_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ def identity(val):
return val

def jsonify(val):
if isinstance(val, dict):
return Json(val)
return Json({'en_US': val}) if val is not None else val

wrappers = [(jsonify if model._fields[fname].translate else identity) for fname in fnames]
Expand Down Expand Up @@ -366,6 +368,33 @@ def name_create(self, name):
}
return self.create(vals).name_get()[0]

def _preserve_model_translate_params(self, model):
fields_to_keep = {
"name": model._description,
}
table_name = "ir_model"
self._cr.execute(
"""
SELECT %s FROM %s
WHERE
model = %s
""",
(
psycopg2.extensions.AsIs(','.join(fields_to_keep)),
psycopg2.extensions.AsIs(table_name),
model._name,
),
)
result = self._cr.dictfetchall()
translatable_values = {}
if result:
row = result[0]
for fname, default_value in fields_to_keep.items():
value = row.get(fname)
if value and default_value == value.get('en_US'):
translatable_values[fname] = value
return translatable_values

def _reflect_model_params(self, model):
""" Return the values to write to the database for the given model. """
return {
Expand All @@ -375,6 +404,7 @@ def _reflect_model_params(self, model):
'info': next(cls.__doc__ for cls in self.env.registry[model._name].mro() if cls.__doc__),
'state': 'manual' if model._custom else 'base',
'transient': model._transient,
**self._preserve_model_translate_params(model),
}

def _reflect_models(self, model_names):
Expand Down Expand Up @@ -1021,6 +1051,37 @@ def name_get(self):
res.append((field.id, '%s (%s)' % (field.field_description, field.model)))
return res

def _preserve_field_translate_params(self, field):
fields_to_keep = {
"field_description": field.string,
"help": field.help,
}
table_name = "ir_model_fields"
self._cr.execute(
"""
SELECT %s FROM %s
WHERE
name = %s
AND
model = %s
""",
(
psycopg2.extensions.AsIs(','.join(fields_to_keep)),
psycopg2.extensions.AsIs(table_name),
field.name,
field.model_name,
),
)
result = self._cr.dictfetchall()
translatable_values = {}
if result:
row = result[0]
for fname, default_value in fields_to_keep.items():
value = row.get(fname)
if value and default_value == value.get('en_US'):
translatable_values[fname] = value
return translatable_values

def _reflect_field_params(self, field, model_id):
""" Return the values to write to the database for the given field. """
return {
Expand All @@ -1046,6 +1107,7 @@ def _reflect_field_params(self, field, model_id):
'relation_table': field.relation if field.type == 'many2many' else None,
'column1': field.column1 if field.type == 'many2many' else None,
'column2': field.column2 if field.type == 'many2many' else None,
**self._preserve_field_translate_params(field)
}

def _reflect_fields(self, model_names):
Expand Down