=== modified file 'bin/osv/orm.py' --- bin/osv/orm.py 2010-03-15 11:57:08 +0000 +++ bin/osv/orm.py 2010-03-17 09:27:38 +0000 @@ -3060,9 +3060,9 @@ return res def copy_data(self, cr, uid, id, default=None, context=None): - if not context: + if context is None: context = {} - if not default: + if default is None: default = {} if 'state' not in default: if 'state' in self._defaults: @@ -3098,6 +3098,9 @@ d,t = rel.copy_data(cr, uid, rel_id, context=context) res.append((0, 0, d)) trans_data += t + # Special treatment to find the relational field,to satisfy translations + if f not in trans_data: + trans_data.append(f) data[f] = res elif ftype == 'many2many': data[f] = [(6, 0, data[f])] @@ -3115,7 +3118,6 @@ ('name', '=', trans_name), ('res_id','=',data['id']) ]) - trans_data.extend(trans_obj.read(cr,uid,trans_ids,context=context)) del data['id'] @@ -3128,9 +3130,18 @@ trans_obj = self.pool.get('ir.translation') data, trans_data = self.copy_data(cr, uid, id, default, context) new_id = self.create(cr, uid, data, context) + map_trans = {id:new_id} # Mapping old ID to new Relavent ID + # If the object has any O2M field with same object,translations would be treated differently + relate_field = [f for f in trans_data if not isinstance(f,dict)] # + if relate_field: + trans_data = [f for f in trans_data if f not in relate_field] + res = self.read(cr, uid, new_id, relate_field) + res_old = self.read(cr, uid, id, relate_field) + map_trans.update(dict(zip(res_old[relate_field[0]],res[relate_field[0]]))) + for record in trans_data: del record['id'] - record['res_id'] = new_id + record['res_id'] = map_trans[record['res_id']] trans_obj.create(cr, uid, record, context) return new_id