[FIX] orm: proper recursive copy of translations through one2many relationships during copy()
lp bug: https://launchpad.net/bugs/524424 fixed bzr revid: odo@openerp.com-20100623151439-evc74f1a3so382z0
This commit is contained in:
parent
48dc8f17a9
commit
39e866ce70
|
@ -3863,7 +3863,6 @@ class orm(orm_template):
|
||||||
data = self.read(cr, uid, [id], context=context_wo_lang)[0]
|
data = self.read(cr, uid, [id], context=context_wo_lang)[0]
|
||||||
|
|
||||||
fields = self.fields_get(cr, uid, context=context)
|
fields = self.fields_get(cr, uid, context=context)
|
||||||
trans_data=[]
|
|
||||||
for f in fields:
|
for f in fields:
|
||||||
ftype = fields[f]['type']
|
ftype = fields[f]['type']
|
||||||
|
|
||||||
|
@ -3882,40 +3881,63 @@ class orm(orm_template):
|
||||||
elif ftype in ('one2many', 'one2one'):
|
elif ftype in ('one2many', 'one2one'):
|
||||||
res = []
|
res = []
|
||||||
rel = self.pool.get(fields[f]['relation'])
|
rel = self.pool.get(fields[f]['relation'])
|
||||||
if data[f] != False:
|
if data[f]:
|
||||||
|
# duplicate following the order of the ids
|
||||||
|
# because we'll rely on it later for copying
|
||||||
|
# translations in copy_translation()!
|
||||||
|
data[f].sort()
|
||||||
for rel_id in data[f]:
|
for rel_id in data[f]:
|
||||||
# the lines are first duplicated using the wrong (old)
|
# the lines are first duplicated using the wrong (old)
|
||||||
# parent but then are reassigned to the correct one thanks
|
# parent but then are reassigned to the correct one thanks
|
||||||
# to the (4, ...)
|
# to the (0, 0, ...)
|
||||||
d,t = rel.copy_data(cr, uid, rel_id, context=context)
|
d = rel.copy_data(cr, uid, rel_id, context=context)
|
||||||
res.append((0, 0, d))
|
res.append((0, 0, d))
|
||||||
trans_data += t
|
|
||||||
data[f] = res
|
data[f] = res
|
||||||
elif ftype == 'many2many':
|
elif ftype == 'many2many':
|
||||||
data[f] = [(6, 0, data[f])]
|
data[f] = [(6, 0, data[f])]
|
||||||
|
|
||||||
trans_obj = self.pool.get('ir.translation')
|
|
||||||
#TODO: optimize translations
|
|
||||||
for f in fields:
|
|
||||||
trans_name = ''
|
|
||||||
if f in self._columns and self._columns[f].translate:
|
|
||||||
trans_name = self._name+","+f
|
|
||||||
elif f in self._inherit_fields and self._inherit_fields[f][2].translate:
|
|
||||||
trans_name = self._inherit_fields[f][0] + "," + f
|
|
||||||
|
|
||||||
if trans_name:
|
|
||||||
trans_ids = trans_obj.search(cr, uid, [
|
|
||||||
('name', '=', trans_name),
|
|
||||||
('res_id','=',data['id'])
|
|
||||||
])
|
|
||||||
|
|
||||||
trans_data.extend(trans_obj.read(cr,uid,trans_ids,context=context))
|
|
||||||
|
|
||||||
del data['id']
|
del data['id']
|
||||||
|
|
||||||
for v in self._inherits:
|
for v in self._inherits:
|
||||||
del data[self._inherits[v]]
|
del data[self._inherits[v]]
|
||||||
return data, trans_data
|
return data
|
||||||
|
|
||||||
|
def copy_translations(self, cr, uid, old_id, new_id, context=None):
|
||||||
|
trans_obj = self.pool.get('ir.translation')
|
||||||
|
fields = self.fields_get(cr, uid, context=context)
|
||||||
|
|
||||||
|
translation_records = []
|
||||||
|
for field_name, field_def in fields.items():
|
||||||
|
# we must recursively copy the translations for o2o and o2m
|
||||||
|
if field_def['type'] in ('one2one', 'one2many'):
|
||||||
|
target_obj = self.pool.get(field_def['relation'])
|
||||||
|
old_record, new_record = self.read(cr, uid, [old_id, new_id], [field_name], context=context)
|
||||||
|
# here we rely on the order of the ids to match the translations
|
||||||
|
# as foreseen in copy_data()
|
||||||
|
old_childs = sorted(old_record[field_name])
|
||||||
|
new_childs = sorted(new_record[field_name])
|
||||||
|
for (old_child, new_child) in zip(old_childs, new_childs):
|
||||||
|
# recursive copy of translations here
|
||||||
|
target_obj.copy_translations(cr, uid, old_child, new_child, context=context)
|
||||||
|
# and for translatable fields we keep them for copy
|
||||||
|
elif field_def.get('translate'):
|
||||||
|
trans_name = ''
|
||||||
|
if field_name in self._columns:
|
||||||
|
trans_name = self._name + "," + field_name
|
||||||
|
elif field_name in self._inherit_fields:
|
||||||
|
trans_name = self._inherit_fields[field_name][0] + "," + field_name
|
||||||
|
if trans_name:
|
||||||
|
trans_ids = trans_obj.search(cr, uid, [
|
||||||
|
('name', '=', trans_name),
|
||||||
|
('res_id','=', old_id)
|
||||||
|
])
|
||||||
|
translation_records.extend(trans_obj.read(cr,uid,trans_ids,context=context))
|
||||||
|
|
||||||
|
for record in translation_records:
|
||||||
|
del record['id']
|
||||||
|
record['res_id'] = new_id
|
||||||
|
trans_obj.create(cr, uid, record, context=context)
|
||||||
|
|
||||||
|
|
||||||
def copy(self, cr, uid, id, default=None, context=None):
|
def copy(self, cr, uid, id, default=None, context=None):
|
||||||
"""
|
"""
|
||||||
|
@ -3930,13 +3952,9 @@ class orm(orm_template):
|
||||||
:return: True
|
:return: True
|
||||||
|
|
||||||
"""
|
"""
|
||||||
trans_obj = self.pool.get('ir.translation')
|
data = self.copy_data(cr, uid, id, default, context)
|
||||||
data, trans_data = self.copy_data(cr, uid, id, default, context)
|
|
||||||
new_id = self.create(cr, uid, data, context)
|
new_id = self.create(cr, uid, data, context)
|
||||||
for record in trans_data:
|
self.copy_translations(cr, uid, id, new_id, context)
|
||||||
del record['id']
|
|
||||||
record['res_id'] = new_id
|
|
||||||
trans_obj.create(cr, uid, record, context)
|
|
||||||
return new_id
|
return new_id
|
||||||
|
|
||||||
def exists(self, cr, uid, ids, context=None):
|
def exists(self, cr, uid, ids, context=None):
|
||||||
|
|
Loading…
Reference in New Issue