Sale Product Pack

sale_product_pack
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/19.0/sale_product_pack
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSOCA-git-bot, Maxime Franco, oca-ci, mgu
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - sale
    - sales_team
    - account_payment
    - account
    - onboarding
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds *Product Pack* functionality to sales orders. You can
choose a *Pack* in *sales order lines* and see different behaviors
depending on "Pack type" and "Pack component price" fields options
selected on this *Pack*.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (1)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (2)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom_id', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals_list)
    @api.model_create_multi
    Only when strictly necessary (a product is a pack) will be created line by line, this is necessary to maintain the correct order.
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/18.0/sale_product_pack
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSPedro M. Baeza, Weblate, OCA-git-bot, oca-ci, Franco Leyes, Alexis Lopez
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - sale
    - sales_team
    - account_payment
    - account
    - onboarding
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds *Product Pack* functionality to sales orders. You can
choose a *Pack* in *sales order lines* and see different behaviors
depending on "Pack type" and "Pack component price" fields options
selected on this *Pack*.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (1)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals_list)
    @api.model_create_multi
    Only when strictly necessary (a product is a pack) will be created line by line, this is necessary to maintain the correct order.
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/17.0/sale_product_pack
VERSION
VERSION 2.0.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSVíctor Martínez, Bruno Zanotti, Weblate, OCA-git-bot, oca-ci, Franco Leyes
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - account_payment
    - account
    - onboarding
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds *Product Pack* functionality to sales orders. You can
choose a *Pack* in *sales order lines* and see different behaviors
depending on "Pack type" and "Pack component price" fields options
selected on this *Pack*.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (1)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals_list)
    @api.model_create_multi
    Only when strictly necessary (a product is a pack) will be created line by line, this is necessary to maintain the correct order.
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/16.0/sale_product_pack
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, Maxime Franco, oca-ci, augusto-weiss, Alexis Lopez - Adhoc
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - account_payment
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (2)
  • get_price(self)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals_list)
    @api.model_create_multi
    Only when strictly necessary (a product is a pack) will be created line by line, this is necessary to maintain the correct order.
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/15.0/sale_product_pack
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSVíctor Martínez, nicolas, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (2)
  • get_price(self)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals)
    @api.model
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/14.0/sale_product_pack
VERSION
VERSION 1.1.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSDenis Roussel, Daniel Reis, Pierre Verkest, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Cyril VINH-TUNG, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (2)
  • get_price(self)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (7)
  • do_no_expand_pack_lines Boolean
    compute='_compute_do_no_expand_pack_lines' help='This is a technical field in order to check if pack lines has to be expanded'
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals)
    @api.model
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/13.0/sale_product_pack
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSPedro M. Baeza, david, OCA Transbot, Víctor Martínez, Ernesto Tejeda, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits='Discount' args: 'Sale discount (%)'
Public methods (2)
  • get_price(self)
  • get_sale_order_line_vals(self, line, order)

New fields (0)

No new fields.

Public methods (3)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
  • write(self, vals)

New fields (6)
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (5)
  • action_open_parent_pack_product_view(self)
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals)
    @api.model
  • expand_pack_line(self, write=False)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/product-pack
GIT
GIThttps://github.com/OCA/product-pack.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-pack/tree/12.0/sale_product_pack
VERSION
VERSION 1.1.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), ADHOC SA, NaN·tic
COMMITTERS
COMMITTERSPedro M. Baeza, david, Yann Papouin, OCA Transbot, oca-travis, Weblate, OCA-git-bot, hparfr, ernesto
WEBSITE
WEBSITEhttps://github.com/OCA/product-pack
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-pack:
    - product_pack
odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - sale
    - sales_team
    - payment
    - account
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
product_pack_line_form product.pack.line.sale.form product.pack.line field Inherits product_pack.product_pack_line_form
product_pack_line_tree product.pack.line.sale.tree product.pack.line field Inherits product_pack.product_pack_line_tree
view_order_form sale.order xpath Inherits sale.view_order_form
Models touched (3)

New fields (1)
  • sale_discount Float
    digits=dp.get_precision('sale_discount') args: 'Sale discount (%)'
Public methods (2)
  • get_price(self)
    @api.multi
  • get_sale_order_line_vals(self, line, order)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • check_pack_line_unlink(self)
    @api.onchange('order_line')
    At least on embeded tree editable view odoo returns a recordset on _origin.order_line only when lines are unlinked and this is exactly what we need
  • copy(self, default=None)
    @api.multi

New fields (6)
  • pack_child_line_ids One2many → sale.order.line
    args: 'sale.order.line', 'pack_parent_line_id', 'Lines in pack'
  • pack_component_price Selection
    related='product_id.pack_component_price'
  • pack_depth Integer
    help='Depth of the product if it is part of a pack.' args: 'Depth'
  • pack_modifiable Boolean
    help='The parent pack is modifiable'
  • pack_parent_line_id Many2one → sale.order.line
    help='The pack that contains this product.' ondelete='cascade' args: 'sale.order.line', 'Pack'
  • pack_type Selection
    related='product_id.pack_type'
Public methods (6)
  • action_open_parent_pack_product_view(self)
    @api.multi
  • check_pack_line_modify(self)
    @api.onchange('product_id', 'product_uom_qty', 'product_uom', 'price_unit', 'discount', 'name', 'tax_id')
    Do not let to edit a sale order line if this one belongs to pack
  • create(self, vals)
    @api.model
  • expand_pack_line(self, write=False)
    @api.multi
  • unlink(self)
    Remove previously the pack children lines for avoiding issues in the cache.
  • write(self, vals)
    @api.multi