Как скопировать значение одного поля в другое в odoo?

Я создал настраиваемое поле скидки в модуле product.template, теперь я хочу скопировать и назначить его полю скидки в модуле продаж. Я хочу автоматизировать скидку, как только я ввожу ее название, цену и значение скидки в счете. Я создаю продукты с помощью опции создания и редактирования в счете. Если я снова создаю счет для того же продукта, когда я выбираю продукт, его скидка должна применяться автоматически. Я попробовал с одним из кодов, которые я получил из Интернета, это автоматическая скидка, но описание продукта и значение цены исчезли. Discount - это поле в модуле продаж, x_discount - это поле в модуле продуктов, я хочу скопировать значение x_discount для скидки, поскольку они находятся в разных модулях, мне это сложно.

dis = self.pool.get('product.template').browse(cr, uid,product,context=context).x_discount
return  {'value': {'discount':dis}}

введите здесь описание изображения

введите здесь описание изображения


person Kiran    schedule 29.10.2015    source источник


Ответы (1)


Для этого необходимо использовать onchange: -

Механизм «onchange» позволяет клиентскому интерфейсу обновлять форму всякий раз, когда пользователь вводит значение в поле, без сохранения чего-либо в базе данных.

Здесь уже есть замена на product_id, поэтому: -

Для этого необходимо переопределить product_id_change () в sale.order.line.

Для этого вам необходимо унаследовать объект sale.order.line и переопределить product_id_change (), добавив следующую строку: - (после строки, определяющей product_obj )

        result['discount'] = product_obj.x_discount 

Для получения дополнительной помощи: - если вы используете v7, скопируйте этот код в файл .py вашего модуля: -

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
        else:
            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
        else:
            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)],
                    'product_uos':
                    [('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
        else:
            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"
    else:
        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,
                    })[pricelist]
        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"
        else:
            result.update({'price_unit': price})
    if warning_msgs:
        warning = {
                   'title': _('Configuration Error!'),
                   'message' : warning_msgs
                }
    return {'value': result, 'domain': domain, 'warning': warning}

Подробные шаги: -

мы создаем для этого наш собственный модуль (лучший и рекомендуемый способ): -

Создайте папку с именем product_custom со следующими файлами: -

__init__.py
__openerp__.py
product_custom.py
product_custom_view.xml

содержимое файла инициализации: -

import product_custom

содержимое файла openerp: -

{
'name': "Product Customization",
'version': '1.0',
'depends': ['base','product','sale'],
'author': "Baiju KS",
'category': 'Customization',
'description': """
Module used to add discount to product.
""",
# data files always loaded at installation
'data': [
    'product_custom_view.xml',
],
'installable': True,
'auto_install': False,         }

product_custom файл:

from openerp.osv import fields, osv
from openerp import SUPERUSER_ID
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
import time
class product_template(osv.osv):
    _inherit = "product.template"
    _columns = {
        'x_discount': fields.float('Discount(%)'),
    }



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 = False
    product_uom_obj = self.pool.get('product.uom')
    partner_obj = self.pool.get('res.partner')
    product_obj = self.pool.get('product.product')
    partner = partner_obj.browse(cr, uid, partner_id)
    lang = partner.lang
    context_partner = context.copy()
    context_partner.update({'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)

    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
        else:
            uos = False

    fpos = False
    if not fiscal_position:
        fpos = partner.property_account_position or False
    else:
        fpos = self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position)
    if update_tax: #The quantity only have changed
        # The superuser is used by website_sale in order to create a sale order. We need to make
        # sure we only select the taxes related to the company of the partner. This should only
        # apply if the partner is linked to a company.
        if uid == SUPERUSER_ID and context.get('company_id'):
            taxes = product_obj.taxes_id.filtered(lambda r: r.company_id.id == context['company_id'])
        else:
            taxes = product_obj.taxes_id
        result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)

    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
        else:
            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)],
                    'product_uos':
                    [('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
        else:
            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"
    else:
        ctx = dict(
            context,
            uom=uom or result.get('product_uom'),
            date=date_order,
        )
        price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
                product, qty or 1.0, partner_id, ctx)[pricelist]
        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"
        else:
            if update_tax:
                price = self.pool['account.tax']._fix_tax_included_price(cr, uid, price, taxes, result['tax_id'])
            result.update({'price_unit': price})
            if context.get('uom_qty_change', False):
                values = {'price_unit': price}
                if result.get('product_uos_qty'):
                    values['product_uos_qty'] = result['product_uos_qty']
                return {'value': values, 'domain': {}, 'warning': False}
    if warning_msgs:
        warning = {
                   'title': _('Configuration Error!'),
                   'message' : warning_msgs
                }
    return {'value': result, 'domain': domain, 'warning': warning}

product_custom_view файл: -

<openerp>
<data>
    <record id="product_template_form_view_dis_inherit" model="ir.ui.view">
        <field name="name">product.template.common.form.dis.inherit</field>
        <field name="model">product.template</field>
        <field name="inherit_id" ref="product.product_template_form_view"/>
        <field name="arch" type="xml">
            <xpath expr="/form/sheet/notebook/page[1]/group[1]/group[1]/field[3]" position="after">
                <field name="x_discount" />
            </xpath>
        </field>
    </record> 
</data>

Затем скопируйте этот файл в папку дополнений и перезапустите сервер, после чего обновите список модулей и установите настраиваемый модуль.

Надеюсь это поможет.

person Baiju KS    schedule 29.10.2015
comment
В исходном коде уже есть класс sale_order_line, должен ли я унаследовать этот класс? - person Kiran; 30.10.2015
comment
если вы редактируете сам исходный код, нет необходимости наследовать sale.order.line, просто добавьте строку, показанную выше, в product_id_change (). И если вы добавляете настройку с помощью собственного настраиваемого модуля, вы можете продолжить с помощью приведенного выше кода с наследованием. - person Baiju KS; 30.10.2015
comment
Не могли бы вы включить шаги, которые вы сделали, пожалуйста, укажите свой подход к настройке: это наследование в вашем модуле или редактирование исходного кода? вы получаете какую-либо ошибку при обновлении такого кода? - person Baiju KS; 30.10.2015
comment
Вот как я пытался: 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) .x_discount result.update ({'Discount': product_obj}) - person Kiran; 31.10.2015
comment
извините, ваши ответы на мои вопросы кажутся неуместными. вы пробовали использовать сценарий, который я предоставил выше? Я сам пробовал и работает нормально - person Baiju KS; 31.10.2015
comment
Вы создали новый файл или изменили существующий файл модуля продаж? - person Kiran; 31.10.2015
comment
Я обновил ответ с подробными инструкциями, проверьте и дайте мне знать - person Baiju KS; 31.10.2015