Skip to Content
Menu
You need to be registered to interact with the community.
This question has been flagged
3 Odgovori
1599 Prikazi

I have created a field called product_status in the module product.supplierinfo, the field is visible in the view product.template.product.form, in the page Purchase, and is different for each vendor.

Now I want the field t oshow up when you are doing a PO, specifically when you add a product to the order lines. This is the module purchase.order.line. The problem is that the field depends of the product and the vendor.

I have tried importing it like this:


from odoo import models, fields, api

class PurchaseOrderLine(models.Model):   
_inherit = 'purchase.order.line'

    product_status = fields.Selection( 
      related='product_id.partner_id.product_status',
      string="Product Homologation Status",
      store=True,
      readonly=True
    )

    @api.depends('product_id')   
def _compute_product_status(self):
        for line in self:
            # Obtiene el primer registro de seller_ids relacionado
            seller = partner_id[:1]
            # Si hay un registro en seller_ids, asigna el product_status;
# de lo contrario, establece un valor predeterminado
            line.product_status = seller.product_status if seller else False

But the field product_status doens't appear in the module purchase.order.line.

What can I do?

Avatar
Opusti
Best Answer

Hii,

You should define product_status as a computed field , based on both product_id and order_id.partner_id .


Working Code Example:

from odoo import models, fields, api class PurchaseOrderLine (models.Model): _inherit = 'purchase.order.line' product_status = fields.Selection( selection=[ ( 'approved' , 'Approved' ), ( 'pending' , 'Pending' ), ( 'rejected' , 'Rejected' ), ], string= "Product Homologation Status" , compute= "_compute_product_status" , store = True , readonly= True , ) @api.depends( 'product_id' , 'order_id.partner_id' ) def _compute_product_status ( self ): for line in self: line.product_status = False # Default product = line.product_id partner = line.order_id.partner_id if product and partner: # Search for the seller (product.supplierinfo) that matches the partner seller = product.seller_ids.filtered( lambda s: s.name == partner) if seller: line.product_status = seller[ 0 ].product_status

XML to Show Field in Purchase Order Line

Inherit the view purchase.order.form and add the field to the order lines:

<odoo> <record id = "view_order_form_inherit_product_status" model = "ir.ui.view"> <field name = "name" >purchase.order.form.product.status </field> <field name = "model" >purchase.order </field> <field name = "inherit_id" ref = "purchase.purchase_order_form" /> <field name = "arch" type = "xml"> <xpath expr = "//field[@name='order_line']/form//field[@name='price_unit']" position = "after" > <field name = "product_status"/> </xpath> </field> </record> </odoo>

i hope it is use full

Avatar
Opusti
Best Answer

Hi,

Please refer to the code below:


Python


from odoo import models, fields, api


class PurchaseOrderLine(models.Model):

    _inherit = 'purchase.order.line'


    product_status = fields.Selection(

        [('custom_status', 'custom_status'), ()],

        string="Product Homologation Status",

        compute="_compute_product_status",

        store=True,

        readonly=False,

    )


    @api.depends('product_id', 'order_id.partner_id')

    def _compute_product_status(self):

        for line in self:

            seller = self.env['product.supplierinfo'].search([

                ('product_tmpl_id', '=', line.product_id.product_tmpl_id.id),

                ('name', '=', line.order_id.partner_id.id)

            ], limit=1)

            line.product_status = seller.product_status if seller else False


XML:


<record id="view_order_form_inherit_status" model="ir.ui.view">

    <field name="name">purchase.order.form.inherit.status</field>

    <field name="model">purchase.order</field>

    <field name="inherit_id" ref="purchase.purchase_order_form"/>

    <field name="arch" type="xml">

        <xpath

                expr="//field[@name='order_line']/list//field[@name='product_id']" position="after">

            <field name="product_status"/>

        </xpath>

    </field>

</record>


Hope it helps.

Avatar
Opusti
Best Answer

You can create compute the product_status field based on both the product_id and partner_id (vendor) get value


Example,


from odoo import models, fields, api


class PurchaseOrderLine(models.Model):

    _inherit = 'purchase.order.line'


    product_status = fields.Selection(

        selection=[('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected')],

        string="Product Homologation Status",

        compute="_compute_product_status",

        store=True,

        readonly=True

    )


    @api.depends('product_id', 'order_id.partner_id') 

    def _compute_product_status(self):

        for line in self:

            supplier_info = self.env['product.supplierinfo'].search([

                ('product_id', '=', line.product_id.id),

                ('partner_id', '=', line.order_id.partner_id.id)

            ], limit=1)

            line.product_status = supplier_info.product_status if supplier_info else 'pending'

Avatar
Opusti