Odoo Help


How to copy value of one field value to another in odoo?

on 10/29/15, 10:02 AM 1,114 views

I have created a custom field discount in product.template module, now i want to copy and assign it to discount field in sales module. I want to automate discount once I type its name,price and its discount value in invoice.I am creating products from create and edit option in invoice. If i generate invoice for the same product again once i select the product its discount should be automatically applied.I tried with one of the code which I got from Internet it automated discount but product description and price value vanished. discount is a field in sales module,x_discount is a field in products module, I want to copy x_discount value to discount ,as they are in different modules I am finding it difficult.

dis = self.pool.get('product.template').browse(cr, uid,product,context=context).x_discount

return {'value': {'discount':dis}}

which version are you using 7 or 8 ?

Baiju KS
on 10/29/15, 10:13 AM
version 8

On Thu, Oct 29, 2015 at 7:43 PM, Baiju KS <baijuks@hotmail.com> wrote:

which version are you using 7 or 8 ?

on 10/31/15, 12:34 AM
This is how i tried, 
1)result = {} 
product_obj = product_obj.browse(cr, uid, product, context=context_partner) 
result['discount'] = product_obj.x_discount 

2)result = {}
 product_obj = product_obj.browse(cr, uid, product, context=context_partner) result.update({'discount': product_obj}) 

On Sat, Oct 31, 2015 at 10:04 AM, Bhanu Kiran <bhanukiran6688@gmail.com> wrote:
version 8

On Thu, Oct 29, 2015 at 7:43 PM, Baiju KS <baijuks@hotmail.com> wrote:

which version are you using 7 or 8 ?

on 10/31/15, 1:35 AM

Baiju KS

--Baiju KS--
Baiju KS
| 5 5 8
Kochi, India
--Baiju KS--
ODOO technical

        I like learning new thing, especially technical thing. I am a quick learner, I can learn technical things very fast. I have good logical skill,  I have immense interest in programming.

e-mail id : baijuks@hotmail.com

Baiju KS
On 10/29/15, 10:08 AM


You have to use onchange for this:-

        The "onchange" mechanism provides a way for the client interface to update a form whenever the user has filled in a value in a field, without saving anything to the database.

Here there is already onchange for product_id so:-

To achieve this you have to override product_id_change() in sale.order.line .

For this you have to inherit sale.order.line object and redefine the product_id_change() by adding this line:- (after the line defining product_obj )

     result['discount'] = product_obj.x_discount 

For more help:- if you are using v7 copy this code in your module .py file:-

from openerp.tools import DEFAULT_SERVER_DATE_FORMAT

class sale_order_line(osv.osv):
_inherit = 'sale.order.line'

def product_id_change(self, cr, uid, ids, pricelist, product, qty=0,
uom=False, qty_uos=0, uos=False, name='', partner_id=False,
lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, context=None):
context = context or {}
lang = lang or context.get('lang',False)
if not partner_id:
raise osv.except_osv(_('No Customer Defined!'), _('Before choosing a product,\n select a customer in the sales form.'))
warning = {}
product_uom_obj = self.pool.get('product.uom')
partner_obj = self.pool.get('res.partner')
product_obj = self.pool.get('product.product')
context = {'lang': lang, 'partner_id': partner_id}
if partner_id:
lang = partner_obj.browse(cr, uid, partner_id).lang
context_partner = {'lang': lang, 'partner_id': partner_id}

if not product:
return {'value': {'th_weight': 0,
'product_uos_qty': qty}, 'domain': {'product_uom': [],
'product_uos': []}}
if not date_order:
date_order = time.strftime(DEFAULT_SERVER_DATE_FORMAT)

result = {}
warning_msgs = ''
product_obj = product_obj.browse(cr, uid, product, context=context_partner) # product_obj definition

result['discount'] = product_obj.x_discount # modification

uom2 = False
if uom:
uom2 = product_uom_obj.browse(cr, uid, uom)
if product_obj.uom_id.category_id.id != uom2.category_id.id:
uom = False
if uos:
if product_obj.uos_id:
uos2 = product_uom_obj.browse(cr, uid, uos)
if product_obj.uos_id.category_id.id != uos2.category_id.id:
uos = False
uos = False
fpos = fiscal_position and self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position) or False
if update_tax: #The quantity only have changed
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)

if not flag:
result['name'] = self.pool.get('product.product').name_get(cr, uid, [product_obj.id], context=context_partner)[0][1]
if product_obj.description_sale:
result['name'] += '\n'+product_obj.description_sale
domain = {}
if (not uom) and (not uos):
result['product_uom'] = product_obj.uom_id.id
if product_obj.uos_id:
result['product_uos'] = product_obj.uos_id.id
result['product_uos_qty'] = qty * product_obj.uos_coeff
uos_category_id = product_obj.uos_id.category_id.id
result['product_uos'] = False
result['product_uos_qty'] = qty
uos_category_id = False
result['th_weight'] = qty * product_obj.weight
domain = {'product_uom':
[('category_id', '=', product_obj.uom_id.category_id.id)],
[('category_id', '=', uos_category_id)]}
elif uos and not uom: # only happens if uom is False
result['product_uom'] = product_obj.uom_id and product_obj.uom_id.id
result['product_uom_qty'] = qty_uos / product_obj.uos_coeff
result['th_weight'] = result['product_uom_qty'] * product_obj.weight
elif uom: # whether uos is set or not
default_uom = product_obj.uom_id and product_obj.uom_id.id
q = product_uom_obj._compute_qty(cr, uid, uom, qty, default_uom)
if product_obj.uos_id:
result['product_uos'] = product_obj.uos_id.id
result['product_uos_qty'] = qty * product_obj.uos_coeff
result['product_uos'] = False
result['product_uos_qty'] = qty
result['th_weight'] = q * product_obj.weight # Round the quantity up

if not uom2:
uom2 = product_obj.uom_id
# get unit price

if not pricelist:
warn_msg = _('You have to select a pricelist or a customer in the sales form !\n'
'Please set one before choosing a product.')
warning_msgs += _("No Pricelist ! : ") + warn_msg +"\n\n"
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
product, qty or 1.0, partner_id, {
'uom': uom or result.get('product_uom'),
'date': date_order,
if price is False:
warn_msg = _("Cannot find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist.")

warning_msgs += _("No valid pricelist line found ! :") + warn_msg +"\n\n"
result.update({'price_unit': price})
if warning_msgs:
warning = {
'title': _('Configuration Error!'),
'message' : warning_msgs
return {'value': result, 'domain': domain, 'warning': warning}

Hope this helps.

Should i make any changes in xml file?

on 10/30/15, 12:36 AM

if you already added discount field to product form, there is nothing to update in xml file.

Baiju KS
on 10/30/15, 8:00 AM

by the way how did you made these changes, I mean is it by developing your custom module or by editing source code?

Baiju KS
on 10/30/15, 8:02 AM

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

1 follower(s)


Asked: 10/29/15, 10:02 AM
Seen: 1114 times
Last updated: 11/2/15, 11:45 PM