[MIG] rma_sale: Migration to 16.0

- Standard procedure.
- Adapt to new `prepare_*_vals` methods.
- Renamed fields adaptation.
- Improved test coverage.

TT44214

s
This commit is contained in:
Pedro M. Baeza
2023-08-29 20:24:09 +02:00
parent 0a71d8441d
commit 54e08e856f
9 changed files with 86 additions and 64 deletions

View File

@@ -14,14 +14,14 @@ Return Merchandise Authorization Management - Link with Sales
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3 :alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github
:target: https://github.com/OCA/rma/tree/15.0/rma_sale :target: https://github.com/OCA/rma/tree/16.0/rma_sale
:alt: OCA/rma :alt: OCA/rma
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/rma-15-0/rma-15-0-rma_sale :target: https://translation.odoo-community.org/projects/rma-16-0/rma-16-0-rma_sale
:alt: Translate me on Weblate :alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/145/15.0 :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/rma&target_branch=16.0
:alt: Try me on Runbot :alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5| |badge1| |badge2| |badge3| |badge4| |badge5|
@@ -79,7 +79,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues <https://github.com/OCA/rma/issues>`_. Bugs are tracked on `GitHub Issues <https://github.com/OCA/rma/issues>`_.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/rma/issues/new?body=module:%20rma_sale%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. `feedback <https://github.com/OCA/rma/issues/new?body=module:%20rma_sale%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues. Do not contact contributors directly about support or help with technical issues.
@@ -125,6 +125,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-ernestotejeda| |maintainer-ernestotejeda|
This module is part of the `OCA/rma <https://github.com/OCA/rma/tree/15.0/rma_sale>`_ project on GitHub. This module is part of the `OCA/rma <https://github.com/OCA/rma/tree/16.0/rma_sale>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -1,9 +1,12 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda # Copyright 2020 Tecnativa - Ernesto Tejeda
# Copyright 2022-2023 Tecnativa - Víctor Martínez
# Copyright 2021-2023 Tecnativa - David Vidal
# Copyright 2021-2023 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{ {
"name": "Return Merchandise Authorization Management - Link with Sales", "name": "Return Merchandise Authorization Management - Link with Sales",
"summary": "Sale Order - Return Merchandise Authorization (RMA)", "summary": "Sale Order - Return Merchandise Authorization (RMA)",
"version": "15.0.1.2.0", "version": "16.0.1.0.0",
"development_status": "Production/Stable", "development_status": "Production/Stable",
"category": "RMA", "category": "RMA",
"website": "https://github.com/OCA/rma", "website": "https://github.com/OCA/rma",

View File

@@ -16,8 +16,9 @@ class Rma(models.Model):
" ('partner_id', 'child_of', commercial_partner_id)," " ('partner_id', 'child_of', commercial_partner_id),"
" ('state', 'in', ['sale', 'done'])," " ('state', 'in', ['sale', 'done']),"
"]", "]",
readonly=True, store=True,
states={"draft": [("readonly", False)]}, readonly=False,
compute="_compute_order_id",
) )
allowed_picking_ids = fields.Many2many( allowed_picking_ids = fields.Many2many(
comodel_name="stock.picking", comodel_name="stock.picking",
@@ -28,7 +29,7 @@ class Rma(models.Model):
"[('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing')] " "[('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing')] "
) )
allowed_move_ids = fields.Many2many( allowed_move_ids = fields.Many2many(
comodel_name="sale.order.line", comodel_name="stock.move",
compute="_compute_allowed_move_ids", compute="_compute_allowed_move_ids",
) )
move_id = fields.Many2one(domain="[('id', 'in', allowed_move_ids)]") move_id = fields.Many2one(domain="[('id', 'in', allowed_move_ids)]")
@@ -70,7 +71,7 @@ class Rma(models.Model):
lambda r: r.picking_id == self.picking_id and r.state == "done" lambda r: r.picking_id == self.picking_id and r.state == "done"
).ids ).ids
else: else:
rec.allowed_move_ids = self.picking_id.move_lines.ids rec.allowed_move_ids = self.picking_id.move_ids.ids
@api.depends("order_id") @api.depends("order_id")
def _compute_allowed_product_ids(self): def _compute_allowed_product_ids(self):
@@ -83,11 +84,10 @@ class Rma(models.Model):
else: else:
rec.allowed_product_ids = False # don't populate a big list rec.allowed_product_ids = False # don't populate a big list
@api.onchange("partner_id") @api.depends("partner_id")
def _onchange_partner_id(self): def _compute_order_id(self):
res = super()._onchange_partner_id() """Empty sales order when changing partner."""
self.order_id = False self.order_id = False
return res
@api.onchange("order_id") @api.onchange("order_id")
def _onchange_order_id(self): def _onchange_order_id(self):
@@ -132,36 +132,25 @@ class Rma(models.Model):
rma._link_refund_with_reception_move() rma._link_refund_with_reception_move()
return res return res
def _prepare_refund(self, invoice_form, origin): def _prepare_refund_vals(self, origin=False):
"""Inject salesman from sales order (if any)""" """Inject salesman from sales order (if any)"""
res = super()._prepare_refund(invoice_form, origin) vals = super()._prepare_refund_vals(origin=origin)
if self.order_id: if self.order_id:
invoice_form.invoice_user_id = self.order_id.user_id vals["invoice_user_id"] = self.order_id.user_id.id
return res return vals
def _get_refund_line_price_unit(self): def _prepare_refund_line_vals(self):
"""Get the sale order price unit"""
if self.sale_line_id:
return self.sale_line_id.price_unit
return super()._get_refund_line_price_unit()
def _get_refund_line_product(self):
"""To be overriden in a third module with the proper origin values
in case a kit is linked with the rma"""
if not self.sale_line_id:
return super()._get_refund_line_product()
return self.sale_line_id.product_id
def _prepare_refund_line(self, line_form):
"""Add line data and link to the sales order, only if the RMA is for the whole """Add line data and link to the sales order, only if the RMA is for the whole
move quantity. In other cases, incorrect delivered/invoiced quantities will be move quantity. In other cases, incorrect delivered/invoiced quantities will be
logged on the sales order, so better to let the operations not linked. logged on the sales order, so better to let the operations not linked.
""" """
res = super()._prepare_refund_line(line_form) vals = super()._prepare_refund_line_vals()
line = self.sale_line_id line = self.sale_line_id
if line: if line:
line_form.discount = line.discount vals["product_id"] = line.product_id.id
line_form.sequence = line.sequence vals["price_unit"] = line.price_unit
vals["discount"] = line.discount
vals["sequence"] = line.sequence
move = self.reception_move_id move = self.reception_move_id
if ( if (
move move
@@ -172,5 +161,5 @@ class Rma(models.Model):
) )
== 0 == 0
): ):
line_form.sale_line_ids.add(line) vals["sale_line_ids"] = [(4, line.id)]
return res return vals

View File

@@ -3,7 +3,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" /> <meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<title>Return Merchandise Authorization Management - Link with Sales</title> <title>Return Merchandise Authorization Management - Link with Sales</title>
<style type="text/css"> <style type="text/css">
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !! !! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !! !! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/rma/tree/15.0/rma_sale"><img alt="OCA/rma" src="https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/rma-15-0/rma-15-0-rma_sale"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/145/15.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p> <p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/rma/tree/16.0/rma_sale"><img alt="OCA/rma" src="https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/rma-16-0/rma-16-0-rma_sale"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/webui/builds.html?repo=OCA/rma&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows you to link a sales order to an RMA. <p>This module allows you to link a sales order to an RMA.
This can be done by creating an RMA from scratch and selecting the sales This can be done by creating an RMA from scratch and selecting the sales
order, creating one or more RMAs from a sales order form view or from a sales order, creating one or more RMAs from a sales order form view or from a sales
@@ -430,7 +430,7 @@ number greater than the order line product quantity.</li>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/rma/issues">GitHub Issues</a>. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/rma/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/rma/issues/new?body=module:%20rma_sale%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> <a class="reference external" href="https://github.com/OCA/rma/issues/new?body=module:%20rma_sale%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p> <p>Do not contact contributors directly about support or help with technical issues.</p>
</div> </div>
<div class="section" id="credits"> <div class="section" id="credits">
@@ -464,7 +464,7 @@ mission is to support the collaborative development of Odoo features and
promote its widespread use.</p> promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p> <p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/ernestotejeda"><img alt="ernestotejeda" src="https://github.com/ernestotejeda.png?size=40px" /></a></p> <p><a class="reference external" href="https://github.com/ernestotejeda"><img alt="ernestotejeda" src="https://github.com/ernestotejeda.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/rma/tree/15.0/rma_sale">OCA/rma</a> project on GitHub.</p> <p>This module is part of the <a class="reference external" href="https://github.com/OCA/rma/tree/16.0/rma_sale">OCA/rma</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,6 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda # Copyright 2020 Tecnativa - Ernesto Tejeda
# Copyright 2022 Tecnativa - Víctor Martínez # Copyright 2022 Tecnativa - Víctor Martínez
# Copyright 2023 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests import Form, TransactionCase from odoo.tests import Form, TransactionCase
@@ -61,17 +62,41 @@ class TestRmaSale(TestRmaSaleBase):
lambda r: r.product_id == cls.product_1 lambda r: r.product_id == cls.product_1
) )
cls.order_out_picking = cls.sale_order.picking_ids cls.order_out_picking = cls.sale_order.picking_ids
cls.order_out_picking.move_lines.quantity_done = 5 cls.order_out_picking.move_ids.quantity_done = 5
cls.order_out_picking.button_validate() cls.order_out_picking.button_validate()
def test_rma_sale_computes_onchange(self):
rma = self.env["rma"].new()
# No m2m values when everything is selectable
self.assertFalse(rma.allowed_picking_ids)
self.assertFalse(rma.allowed_move_ids)
self.assertFalse(rma.allowed_product_ids)
# Partner selected
rma.order_id = self.sale_order
rma.partner_id = self.partner
self.assertFalse(rma.order_id)
self.assertEqual(rma.allowed_picking_ids._origin, self.order_out_picking)
# Order selected
rma.order_id = self.sale_order
self.assertEqual(rma.allowed_picking_ids._origin, self.order_out_picking)
rma.picking_id = self.order_out_picking
self.assertEqual(rma.allowed_move_ids._origin, self.order_out_picking.move_ids)
self.assertEqual(rma.allowed_product_ids._origin, self.product_1)
# Onchanges
rma.product_id = self.product_1
rma._onchange_order_id()
self.assertFalse(rma.product_id)
self.assertFalse(rma.picking_id)
def test_create_rma_with_so(self): def test_create_rma_with_so(self):
rma_form = Form(self.env["rma"]) rma_vals = {
rma_form.partner_id = self.partner "partner_id": self.partner.id,
rma_form.order_id = self.sale_order "order_id": self.sale_order.id,
rma_form.product_id = self.product_1 "product_id": self.product_1.id,
rma_form.product_uom_qty = 5 "product_uom_qty": 5,
rma_form.location_id = self.sale_order.warehouse_id.rma_loc_id "location_id": self.sale_order.warehouse_id.rma_loc_id.id,
rma = rma_form.save() }
rma = self.env["rma"].create(rma_vals)
rma.action_confirm() rma.action_confirm()
self.assertTrue(rma.reception_move_id) self.assertTrue(rma.reception_move_id)
self.assertFalse(rma.reception_move_id.origin_returned_move_id) self.assertFalse(rma.reception_move_id.origin_returned_move_id)
@@ -83,14 +108,14 @@ class TestRmaSale(TestRmaSaleBase):
self.assertEqual(rma.partner_id, order.partner_id) self.assertEqual(rma.partner_id, order.partner_id)
self.assertEqual(rma.order_id, order) self.assertEqual(rma.order_id, order)
self.assertEqual(rma.picking_id, self.order_out_picking) self.assertEqual(rma.picking_id, self.order_out_picking)
self.assertEqual(rma.move_id, self.order_out_picking.move_lines) self.assertEqual(rma.move_id, self.order_out_picking.move_ids)
self.assertEqual(rma.product_id, self.product_1) self.assertEqual(rma.product_id, self.product_1)
self.assertEqual(rma.product_uom_qty, self.order_line.product_uom_qty) self.assertEqual(rma.product_uom_qty, self.order_line.product_uom_qty)
self.assertEqual(rma.product_uom, self.order_line.product_uom) self.assertEqual(rma.product_uom, self.order_line.product_uom)
self.assertEqual(rma.state, "confirmed") self.assertEqual(rma.state, "confirmed")
self.assertEqual( self.assertEqual(
rma.reception_move_id.origin_returned_move_id, rma.reception_move_id.origin_returned_move_id,
self.order_out_picking.move_lines, self.order_out_picking.move_ids,
) )
self.assertEqual( self.assertEqual(
rma.reception_move_id.picking_id + self.order_out_picking, rma.reception_move_id.picking_id + self.order_out_picking,
@@ -123,7 +148,7 @@ class TestRmaSale(TestRmaSaleBase):
def test_create_rma_from_so_portal_user(self): def test_create_rma_from_so_portal_user(self):
order = self.sale_order order = self.sale_order
wizard_obj = ( wizard_obj = (
self.env["sale.order.rma.wizard"].sudo().with_context(active_id=order) self.env["sale.order.rma.wizard"].sudo().with_context(active_id=order.id)
) )
operation = self.rma_operation_model.sudo().search([], limit=1) operation = self.rma_operation_model.sudo().search([], limit=1)
line_vals = [ line_vals = [
@@ -149,6 +174,7 @@ class TestRmaSale(TestRmaSaleBase):
rma = wizard.sudo().create_rma(from_portal=True) rma = wizard.sudo().create_rma(from_portal=True)
self.assertEqual(rma.order_id, order) self.assertEqual(rma.order_id, order)
self.assertIn(order.partner_id, rma.message_partner_ids) self.assertIn(order.partner_id, rma.message_partner_ids)
self.assertEqual(order.rma_count, 1)
def test_create_recurrent_rma(self): def test_create_recurrent_rma(self):
"""An RMA of a product that had an RMA in the past should be possible""" """An RMA of a product that had an RMA in the past should be possible"""
@@ -172,7 +198,7 @@ class TestRmaSale(TestRmaSaleBase):
delivery_wizard = delivery_form.save() delivery_wizard = delivery_form.save()
delivery_wizard.action_deliver() delivery_wizard.action_deliver()
picking = rma.delivery_move_ids.picking_id picking = rma.delivery_move_ids.picking_id
picking.move_lines.quantity_done = rma.product_uom_qty picking.move_ids.quantity_done = rma.product_uom_qty
picking._action_done() picking._action_done()
# The product is returned to the customer, so we should be able to make # The product is returned to the customer, so we should be able to make
# another RMA in the future # another RMA in the future
@@ -188,8 +214,7 @@ class TestRmaSale(TestRmaSaleBase):
rma = self.env["rma"].browse(wizard.create_and_open_rma()["res_id"]) rma = self.env["rma"].browse(wizard.create_and_open_rma()["res_id"])
operation = self.rma_operation_model.sudo().search([], limit=1) operation = self.rma_operation_model.sudo().search([], limit=1)
rma.operation_id = operation.id rma.operation_id = operation.id
res = self.report_model._get_report_from_name( res = self.env["ir.actions.report"]._render_qweb_html("rma.report_rma", rma.ids)
"rma.report_rma" res = str(res[0])
)._render_qweb_text(rma.ids, False) self.assertRegex(res, self.sale_order.name)
self.assertRegex(str(res[0]), self.sale_order.name) self.assertRegex(res, operation.name)
self.assertRegex(str(res[0]), operation.name)

View File

@@ -8,7 +8,11 @@
<field name="inherit_id" ref="rma.rma_view_form" /> <field name="inherit_id" ref="rma.rma_view_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="partner_invoice_id" position="after"> <field name="partner_invoice_id" position="after">
<field name="order_id" options="{'no_create': True}" /> <field
name="order_id"
options="{'no_create': True}"
attrs="{'readonly': [('state', '!=', 'draft')]}"
/>
</field> </field>
<sheet> <sheet>
<field name="allowed_picking_ids" invisible="1" /> <field name="allowed_picking_ids" invisible="1" />

View File

@@ -4,7 +4,6 @@
<field name="name">sale.order.form.inherit</field> <field name="name">sale.order.form.inherit</field>
<field name="model">sale.order</field> <field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" /> <field name="inherit_id" ref="sale.view_order_form" />
<field name="groups_id" eval="[(4, ref('rma.rma_group_user_own'))]" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<button name="action_draft" position="after"> <button name="action_draft" position="after">
<button <button
@@ -12,6 +11,7 @@
type="object" type="object"
string="Create RMA" string="Create RMA"
states="sale,done" states="sale,done"
groups="rma.rma_group_user_own"
/> />
</button> </button>
<div name="button_box"> <div name="button_box">
@@ -21,6 +21,7 @@
class="oe_stat_button" class="oe_stat_button"
icon="fa-reply" icon="fa-reply"
attrs="{'invisible': [('rma_count', '=', 0)]}" attrs="{'invisible': [('rma_count', '=', 0)]}"
groups="rma.rma_group_user_own"
> >
<field name="rma_count" widget="statinfo" string="RMA" /> <field name="rma_count" widget="statinfo" string="RMA" />
</button> </button>

View File

@@ -161,7 +161,7 @@ class SaleOrderLineRmaWizard(models.TransientModel):
for record in self: for record in self:
move_id = False move_id = False
if record.picking_id: if record.picking_id:
move_id = record.picking_id.move_lines.filtered( move_id = record.picking_id.move_ids.filtered(
lambda r: ( lambda r: (
r.sale_line_id == record.sale_line_id r.sale_line_id == record.sale_line_id
and r.sale_line_id.product_id == record.product_id and r.sale_line_id.product_id == record.product_id

View File

@@ -12,7 +12,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<group> <group>
<field name="line_ids" nolabel="1"> <field name="line_ids" nolabel="1" colspan="2">
<tree editable="bottom"> <tree editable="bottom">
<field name="order_id" invisible="1" /> <field name="order_id" invisible="1" />
<field name="allowed_product_ids" invisible="1" /> <field name="allowed_product_ids" invisible="1" />