Skip to Content
Menu
This question has been flagged

Hello!, I've been developing since a month on Odoo, everything was ok till now, my problem is this I have a "Many2one" field that is automatically genereted if my products posses attributes, and i can use the external link to see this record and it shows me every attribute and possible values of the product, and on that same view, i show the calculated price of the product with each attribute additional price.


The thing is that in my original view, i can't change the price by changing the records inside of the Many2one record, @api.onchange doesnt trigger it. I'm not sure if i explained my self very well.


these are the models(simplified)

    class Orders(models.Model):
        _name = 'orders'
        _description = "Generacion de Ordenes"
        products = fields.One2many(
            'orders.products',
            'order_id',
            string='Productos de la Orden',
        )
    class OrdersProducts(models.Model):
        _name = 'orders.products'
        _description = "Productos de Ordenes"
        order_id = fields.Many2one('orders', 'Orden')
        products_attributes = fields.Many2one('orders.products.attributes', domain="[('order_product_id', '=', 0)]" )
        
        #This is the price i would like to change
        price_with_extra = fields.Float()
        #This is not working.
        #Neither @api.onchange('products_attributes.field')
        @api.onchange('products_attributes')
        def _get_price_extra(self):
            for record in self:
                record.price_with_extra = record.products_attributes.product_with_extra
    class OrdersAttributes(models.Model):
        _name = 'orders.products.attributes'
        _description = "Facturas de las Ordenes"
        order_product_id = fields.Many2one('orders.products', 'Productos de Ordenes')
        name = fields.Text('Descripcion')
        note = fields.Text('Notas Adicionales')
        order_product_lines = fields.One2many('orders.products.attributes.lines', 'order_product_attribute_id', 'Lineas de los Atributos')
        product_price = fields.Float()
        
        sub_total_extra = fields.Float('Total Extras / Variantes', compute="_get_sub_total")
        product_with_extra = fields.Float('Total Producto', compute="_get_product_and_extra")


xml:


    centralista_view.xml
    <record id="orders_form_view" model="ir.ui.view">
        <field name="name">orders.form.view</field>
        <field name="model">orders</field>
        <field name="arch" type="xml">
            <form string="Orden de Pedido">                
                <sheet>           
                    <notebook>
                        <page string="Productos Solicitados" name="orders_products">
                            <field name="products" widget="one2many" context="{'default_commerce': pricelist_id}"/>
                        </page>
                    </notebook>
                </sheet>
            </form>
        </field>
    </record>
    centralista_products_view.xml
    <record id="orders_product_tree_view" model="ir.ui.view">
        <field name="name">orders.products.tree.view</field>
        <field name="model">orders.products</field>
        <field name="arch" type="xml">
            <tree editable="bottom">
                <field name="product_id" widget="many2one" string="Producto" attrs="{'readonly':[('pricelist_id', '=', False)]}"/>
                <field name="products_attributes" widget="many2one" string="Descripcion" options="{'no_quick_create': True, 'no_create': True, 'no_click': True}" context="{'product': product_id, 'price': price}"/>
                #This is the input i want to change.
                <field name="price_with_extra" string="Precio Anormal" readonly="1"/>
            </tree>
        </field>
    </record>
    centralista_products_attributes_views.xml
    #this is the modal.
    <record id="orders_products_attributes_form_view" model="ir.ui.view">
        <field name="name">orders.products.attributes.form.view</field>
        <field name="model">orders.products.attributes</field>
        <field name="arch" type="xml">
            <form>
                <sheet>
                    <group col="2">
                        <field name="product_id" string="Producto" readonly="1"/>
                        <field name="name" string="Descripcion del Producto" readonly="1"/>
                        <field name="note"/>
                    </group>
                    <field name="name" invisible="1"/>
                    <field name="order_product_lines" widget="one2many"/>
                    <group col="2"> 
                        <field name="sub_total_extra" string="Total Extras / Variantes" readonly="1" force_save="1"/>
                        <field name="product_with_extra" string="Total Producto" readonly="1" force_save="1"/>
                    </group>
                </sheet>
            </form>
        </field>
    </record>
Avatar
Discard
Author Best Answer

Hello, Yes, right now im using related to get that field, but the issue is that, i doenst update on the fly as with api.onchange, thats my issue right now

Avatar
Discard
Best Answer

Hi,

You can fix it using @api.depends.


class Orders(models.Model):
        _name = 'orders'
        _description = "Generacion de Ordenes"
        products = fields.One2many(
            'orders.products',
            'order_id',
            string='Productos de la Orden',
        )
    class OrdersProducts(models.Model):
        _name = 'orders.products'
        _description = "Productos de Ordenes"
        order_id = fields.Many2one('orders', 'Orden')
        products_attributes = fields.Many2one('orders.products.attributes', domain="[('order_product_id', '=', 0)]" )
        
        #This is the price i would like to change
        price_with_extra = fields.Float()
        #This is not working.
        #Neither @api.onchange('products_attributes.field')
        @api.depends('products_attributes')
        def _get_price_extra(self):
            for record in self:
                record.price_with_extra = record.products_attributes.product_with_extra
    class OrdersAttributes(models.Model):
        _name = 'orders.products.attributes'
        _description = "Facturas de las Ordenes"
        order_product_id = fields.Many2one('orders.products', 'Productos de Ordenes')
        name = fields.Text('Descripcion')
        note = fields.Text('Notas Adicionales')
        order_product_lines = fields.One2many('orders.products.attributes.lines', 'order_product_attribute_id', 'Lineas de los Atributos')
        product_price = fields.Float()
        
        sub_total_extra = fields.Float('Total Extras / Variantes', compute="_get_sub_total")
        product_with_extra = fields.Float('Total Producto', compute="_get_product_and_extra")
Avatar
Discard
Related Posts Replies Views Activity
1
Aug 20
3599
2
Mar 18
6943
2
May 21
3108
0
Jun 20
5465
2
Jun 20
4610