Stock Storage Type

stock_storage_type
REPOSITORY
REPOSITORYOCA/stock-logistics-putaway
GIT
GIThttps://github.com/OCA/stock-logistics-putaway.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-putaway/tree/18.0/stock_storage_type
VERSION
VERSION 1.6.2
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, BCIM
COMMITTERS
COMMITTERSAlexandre Fayolle, Jacques-Etienne Baudoux, Sébastien Alix, Thierry Ducrest, Weblate, OCA-git-bot, oca-ci, Mmequignon
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-putaway
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_packaging_dimension
    - product_logistics_uom
OCA/server-tools:
    - base_partition
OCA/stock-logistics-putaway:
    - stock_putaway_hook
OCA/stock-logistics-tracking:
    - stock_quant_package_dimension
    - stock_quant_package_product_packaging
OCA/stock-logistics-warehouse:
    - stock_location_fill_state
    - stock_location_pending_move
    - stock_storage_category_capacity_name
odoo/odoo:
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module extends package types Odoo feature in order to better manage
stock moves with packages according to the packaging and stock location
properties (like height, weight or any customized conditions).

Moreover, this module implements "package type put-away strategy" in
order to compute a put-away location using package types.

The standard put-away strategy is applied *before* the package type
put-away strategy as the former relies on product or product category
and the latter relies on stock packages.

In other words, when a move is reserved, Odoo standard put-away strategy
will be applied to compute a new destination on the stock move lines,
according to the product. After this first "put-away computation", the
"package type" put-away strategy is applied, if the reserved quant is
linked to a package defining a package type.

Storage locations linked to the package type are processed sequentially,
if said storage location is a child of the move line's destination
location (i.e either the put-away location or the move's destination
location). For each location, their package type strategy is applied as
well as the restrictions defined on the storage category. If no suitable
location is found, the next location in the sequence will be searched
and so on.

For the package type putaway strategy "None", the location is considered
as is. For the "ordered children" strategy, children locations are
sorted by first by max height which is a physical constraint to respect,
then pack putaway sequence which allow to favor for example some level
or corridor, and finally by name.

At the end, if found location is not the same as the original
destination location, the putaway strategies are applied (e.g.: A "None"
pack putaway strategy is set on computed location and a putaway rule
exists on that one).

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
package_level_form_view_inherit Package Level Inherit (in stock_storage_type) stock.package_level field Inherits stock.package_level_form_view
package_level_tree_view_picking_inherit Package Level Tree Picking Inherit (in stock_storage_type) stock.package_level field Inherits stock.package_level_tree_view_picking
package_storage_location_tree_view package.storage.location.list.view stock.storage.location.sequence list New
product_template_form_view_procurement_button_inherit product.template_procurement.inherit product.template field Inherits stock.product_template_form_view_procurement_button
stock_package_type_form stock.package.type.form (in stock_storage_type) stock.package.type div Inherits stock.stock_package_type_form
stock_storage_category_allow_new_product_cond_view_form stock.storage.category.allow_new_product.cond.form stock.storage.category.allow_new_product.cond form New
stock_storage_category_form stock.storage.category.form (in stock_storage_type) stock.storage.category xpath Inherits stock.stock_storage_category_form
stock_storage_location_sequence_cond_form_view stock.storage.location.sequence.cond.form (in stock_storage_type) stock.storage.location.sequence.cond form New
stock_storage_location_sequence_cond_tree_view stock.storage.location.sequence.cond.tree (in stock_storage_type) stock.storage.location.sequence.cond list New
view_location_form_inherit stock.location.form.inherit (in stock_storage_type) stock.location field Inherits stock.view_location_form
view_location_tree_inherit stock.location.tree.inherit (in stock_storage_type) stock.location field Inherits stock.view_location_tree2
Models touched (12)

New fields (16)
  • computed_storage_capacity_ids One2many
    related='computed_storage_category_id.capacity_ids'
  • computed_storage_category_id Many2one → stock.storage.category
    comodel_name='stock.storage.category' compute='_compute_computed_storage_category_id' help='This represents the Storage Category that will be used. It depends either on the category set on the location or on one of its parent.' index='btree_not_null' recursive=True store=True string='Computed Storage Category'
  • do_not_mix_lots Boolean
    compute='_compute_do_not_mix_lots' recursive=True store=True
  • do_not_mix_products Boolean
    compute='_compute_do_not_mix_products' recursive=True store=True
  • has_potential_lot_mix_exception Boolean
    compute='_compute_has_potential_lot_mix_exception' help='This will represent a situation where several moves are pointingto the location for different product lots and the location doesnot allow mixed lots.' index=True store=True
  • has_potential_product_mix_exception Boolean
    compute='_compute_has_potential_product_mix_exception' help='This will represent a situation where several moves are pointingto the location for different products and the location doesnot allow mixed products.' index=True store=True
  • leaf_child_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves sub-locations' recursive=True args: 'stock.location'
  • leaf_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves locations' recursive=True args: 'stock.location'
  • location_will_contain_lot_ids Many2many → stock.lot
    compute='_compute_location_will_contain_lot_ids' help='technical field: list of stock.lots in the location, either now or in pending operations' store=True args: 'stock.lot'
  • location_will_contain_product_ids Many2many → product.product
    compute='_compute_location_will_contain_product_ids' help='technical field: list of products in the location, either now or in pending operations' store=True args: 'product.product'
  • max_height Float
    recursive=True related='computed_storage_category_id.max_height' store=True
  • max_height_in_m Float
    recursive=True related='computed_storage_category_id.max_height_in_m' store=True
  • only_empty Boolean
    compute='_compute_only_empty' recursive=True store=True
  • pack_putaway_strategy Selection
    default='none' help='This defines the storage strategy based on package type to use when a product or package is put away in this location.\nNone: when moved to this location, it will not be put away any further.\nOrdered Children Locations: when moved to this location, a suitable location will be searched in its children locations according to the restrictions defined on their respective storage category.' required=True selection=[('none', 'None'), ('ordered_locations', 'Ordered Children Locations')] string='Put-Away Strategy'
  • package_type_putaway_sequence Integer
    help='Allow to sort the valid locations by sequence for the storage strategy based on package type' string='Putaway Sequence'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Storage locations sequences' args: 'stock.storage.location.sequence', 'location_id'
Public methods (4)
  • get_storage_locations(self, products=None)
  • init(self)
  • select_allowed_locations(self, package_type, quants, products, limit=None)
    Filter allowed locations for a package type. ``self`` contains locations already ordered according to the putaway strategy, so beware of the return that must keep the same order
  • select_first_allowed_location(self, package_type, quants, products)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True
  • barcode Char
    copy=False
  • height_required Boolean
    default=False help='Height is mandatory for packages configured with this package type.' string='Height required for packages'
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'package_type_id'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Put-Away sequence' args: 'stock.storage.location.sequence', 'package_type_id'
  • storage_type_message Html
    compute='_compute_storage_type_message'
Public methods (1)
  • action_view_storage_locations(self)

New fields (1)
  • allowed_location_dest_ids Many2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_dest_ids' string='Allowed Destinations'
Public methods (1)
  • recompute_pack_putaway(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (3)
  • height Float
    compute='_compute_height' readonly=False store=True
  • height_in_m Float
    compute='_compute_height_in_m' help='Technical field, to speed up comparaisons' store=True
  • pack_weight_in_kg Float
    compute='_compute_pack_weight_in_kg' help='Technical field, to speed up comparaisons' store=True
Public methods (0)

No public methods.

New fields (10)
  • allow_new_product Selection
    ondelete={'same_lot': 'cascade'} selection_add=[('same_lot', 'If lots are all the same')]
  • allow_new_product_ids One2many → stock.storage.category.allow_new_product
    comodel_name='stock.storage.category.allow_new_product' inverse_name='storage_category_id' string='Allow New Product Rules'
  • computed_location_ids One2many → stock.location
    comodel_name='stock.location' inverse_name='computed_storage_category_id'
  • has_restrictions Boolean
    compute='_compute_has_restrictions' help='Technical: This is used to check if we need to display warning message'
  • length_uom_id Many2one → uom.uom
    default=<expr> domain=<expr> args: 'uom.uom', 'Max height Unit of Measure'
  • max_height Float
    help='The max height supported for this storage category.' string='Max height (mm)'
  • max_height_in_m Float
    compute='_compute_max_height_in_m' help='Technical field, to speed up comparaisons' store=True
  • max_weight_in_kg Float
    compute='_compute_max_weight_in_kg' help='Technical field, to speed up comparaisons' store=True
  • weight_uom_id Many2one → uom.uom
    compute=False default=<expr> domain=<expr> help='Weight Unit of Measure' string='Weight Units of Measure' args: 'uom.uom'
  • weight_uom_name Char
    readonly=True related='weight_uom_id.name' string='Weight unit of measure label'
Public methods (1)
  • get_allow_new_product(self, product, package_type=None, package=None, quants=None)
    Return the `allow_new_product` option value. It first evaluates the conditions based on different criteria, and if no value can be found among them it fallbacks on the category option value.

New fields (4)
  • allow_new_product Selection
    default='mixed' required=True selection=_selection_allow_new_product
  • condition_ids Many2many → stock.storage.category.allow_new_product.cond
    comodel_name='stock.storage.category.allow_new_product.cond' help='All conditions have to match to apply the Allow New Product policy.' relation='stock_storage_category_allow_new_product_cond_rel' required=True string='Conditions'
  • sequence Integer
    index=True
  • storage_category_id Many2one → stock.storage.category
    comodel_name='stock.storage.category' index=True ondelete='cascade' required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • evaluate(self, storage_category, product, package_type, package, quants)

New fields (5)
  • active Boolean
    default=True
  • code_snippet Text
    required=True
  • code_snippet_docs Text
    compute='_compute_code_snippet_docs' default=<expr>
  • condition_type Selection
    default='code' required=True selection=[('code', 'Execute code')]
  • name Char
    required=True
Public methods (1)
  • evaluate(self, *args, **kwargs)
    Evaluate and return the result of the condition.

New fields (5)
  • location_id Many2one → stock.location
    required=True args: 'stock.location'
  • location_putaway_strategy Selection
    related='location_id.pack_putaway_strategy'
  • location_sequence_cond_ids Many2many → stock.storage.location.sequence.cond
    comodel_name='stock.storage.location.sequence.cond' help='All conditions have to match to apply the put-away strategy.' relation='stock_location_sequence_cond_rel' string='Conditions'
  • package_type_id Many2one → stock.package.type
    ondelete='cascade' required=True args: 'stock.package.type'
  • sequence Integer
    required=True
Public methods (2)
  • button_show_locations(self)
  • can_be_applied(self, putaway_location, quant, product)
    Check if conditions are met.

New fields (0)

No new fields.

Public methods (1)
  • evaluate(self, storage_location_sequence, putaway_location, quant, product)
REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/16.0/stock_storage_type
VERSION
VERSION 2.1.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, BCIM
COMMITTERS
COMMITTERSJacques-Etienne Baudoux, Denis Roussel, Nils Hamerlinck, Sébastien Alix, Weblate, OCA-git-bot, oca-ci, chien, Bastian Guenther
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_packaging_dimension
    - product_logistics_uom
OCA/server-tools:
    - base_partition
OCA/stock-logistics-warehouse:
    - stock_location_fill_state
    - stock_location_pending_move
    - stock_storage_category_capacity_name
OCA/stock-logistics-workflow:
    - stock_move_line_reserved_quant
    - stock_putaway_hook
    - stock_quant_package_dimension
    - stock_quant_package_product_packaging
odoo/odoo:
    - base
    - stock
    - product
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
package_level_form_view_inherit Package Level Inherit (in stock_storage_type) stock.package_level field Inherits stock.package_level_form_view
package_level_tree_view_picking_inherit Package Level Tree Picking Inherit (in stock_storage_type) stock.package_level field Inherits stock.package_level_tree_view_picking
package_storage_location_tree_view package.storage.location.tree.view stock.storage.location.sequence tree New
product_template_form_view_procurement_button_inherit product.template_procurement.inherit product.template field Inherits stock.product_template_form_view_procurement_button
stock_package_type_form stock.package.type.form (in stock_storage_type) stock.package.type div Inherits stock.stock_package_type_form
stock_storage_category_allow_new_product_cond_view_form stock.storage.category.allow_new_product.cond.form stock.storage.category.allow_new_product.cond form New
stock_storage_category_form stock.storage.category.form (in stock_storage_type) stock.storage.category notebook Inherits stock.stock_storage_category_form
stock_storage_location_sequence_cond_form_view stock.storage.location.sequence.cond.form (in stock_storage_type) stock.storage.location.sequence.cond form New
stock_storage_location_sequence_cond_tree_view stock.storage.location.sequence.cond.tree (in stock_storage_type) stock.storage.location.sequence.cond tree New
view_location_form_inherit stock.location.form.inherit (in stock_storage_type) stock.location field Inherits stock.view_location_form
Models touched (12)

New fields (1)
  • package_type_id Many2one → stock.package.type
    help="Defines a 'default' package type for this product to be applied on packages without product packagings and on put-away computation based on package type for product not in a package" string='Package type' args: 'stock.package.type'
Public methods (0)

No public methods.

New fields (19)
  • computed_storage_capacity_ids One2many
    related='computed_storage_category_id.capacity_ids'
  • computed_storage_category_id Many2one → stock.storage.category
    comodel_name='stock.storage.category' compute='_compute_computed_storage_category_id' help='This represents the Storage Category that will be used. It depends either on the category set on the location or on one of its parent.' recursive=True store=True string='Computed Storage Category'
  • do_not_mix_lots Boolean
    compute='_compute_do_not_mix_lots' recursive=True store=True
  • do_not_mix_products Boolean
    compute='_compute_do_not_mix_products' recursive=True store=True
  • has_potential_lot_mix_exception Boolean
    compute='_compute_has_potential_lot_mix_exception' help='This will represent a situation where several moves are pointingto the location for different product lots and the location doesnot allow mixed lots.' index=True store=True
  • has_potential_product_mix_exception Boolean
    compute='_compute_has_potential_product_mix_exception' help='This will represent a situation where several moves are pointingto the location for different products and the location doesnot allow mixed products.' index=True store=True
  • in_move_ids One2many → stock.move
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.moves in the location' args: 'stock.move', 'location_dest_id'
  • in_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.move.lines in the location' args: 'stock.move.line', 'location_dest_id'
  • leaf_child_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves sub-locations' recursive=True args: 'stock.location'
  • leaf_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves locations' recursive=True args: 'stock.location'
  • location_will_contain_lot_ids Many2many → stock.lot
    compute='_compute_location_will_contain_lot_ids' help='technical field: list of stock.lots in the location, either now or in pending operations' store=True args: 'stock.lot'
  • location_will_contain_product_ids Many2many → product.product
    compute='_compute_location_will_contain_product_ids' help='technical field: list of products in the location, either now or in pending operations' store=True args: 'product.product'
  • max_height Float
    recursive=True related='computed_storage_category_id.max_height' store=True
  • max_height_in_m Float
    recursive=True related='computed_storage_category_id.max_height_in_m' store=True
  • only_empty Boolean
    compute='_compute_only_empty' recursive=True store=True
  • out_move_line_ids One2many → stock.move.line
    domain=OUT_MOVE_LINE_DOMAIN help='technical field: the pending outgoing stock.move.lines in the location' args: 'stock.move.line', 'location_id'
  • pack_putaway_strategy Selection
    default='none' help='This defines the storage strategy based on package type to use when a product or package is put away in this location.\nNone: when moved to this location, it will not be put away any further.\nOrdered Children Locations: when moved to this location, a suitable location will be searched in its children locations according to the restrictions defined on their respective storage category.' required=True selection=[('none', 'None'), ('ordered_locations', 'Ordered Children Locations')] string='Put-Away Strategy'
  • package_type_putaway_sequence Integer
    help='Allow to sort the valid locations by sequence for the storage strategy based on package type' string='Putaway Sequence'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Storage locations sequences' args: 'stock.storage.location.sequence', 'location_id'
Public methods (4)
  • get_storage_locations(self, products=None)
  • init(self)
  • select_allowed_locations(self, package_type, quants, products, limit=None)
    Filter allowed locations for a package type. ``self`` contains locations already ordered according to the putaway strategy, so beware of the return that must keep the same order
  • select_first_allowed_location(self, package_type, quants, products)

New fields (6)
  • active Boolean
    default=True
  • barcode Char
    copy=False
  • height_required Boolean
    default=False help='Height is mandatory for packages configured with this package type.' string='Height required for packages'
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'package_type_id'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Put-Away sequence' args: 'stock.storage.location.sequence', 'package_type_id'
  • storage_type_message Html
    compute='_compute_storage_type_message'
Public methods (1)
  • action_view_storage_locations(self)

New fields (1)
  • allowed_location_dest_ids Many2many → stock.location
    comodel_name='stock.location' compute='_compute_allowed_location_dest_ids' string='Allowed Destinations'
Public methods (1)
  • recompute_pack_putaway(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • height_in_m Float
    compute='_compute_height_in_m' help='Technical field, to speed up comparaisons' store=True
  • pack_weight_in_kg Float
    compute='_compute_pack_weight_in_kg' help='Technical field, to speed up comparaisons' store=True
Public methods (3)
  • auto_assign_packaging(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (10)
  • allow_new_product Selection
    ondelete={'same_lot': 'cascade'} selection_add=[('same_lot', 'If lots are all the same')]
  • allow_new_product_ids One2many → stock.storage.category.allow_new_product
    comodel_name='stock.storage.category.allow_new_product' inverse_name='storage_category_id' string='Allow New Product Rules'
  • computed_location_ids One2many → stock.location
    comodel_name='stock.location' inverse_name='computed_storage_category_id'
  • has_restrictions Boolean
    compute='_compute_has_restrictions' help='Technical: This is used to check if we need to display warning message'
  • length_uom_id Many2one → uom.uom
    default=<expr> domain=<expr> help='UoM for height' args: 'uom.uom', 'Dimensions Units of Measure'
  • max_height Float
    help='The max height supported for this storage category.' string='Max height (mm)'
  • max_height_in_m Float
    compute='_compute_max_height_in_m' help='Technical field, to speed up comparaisons' store=True
  • max_weight_in_kg Float
    compute='_compute_max_weight_in_kg' help='Technical field, to speed up comparaisons' store=True
  • weight_uom_id Many2one → uom.uom
    compute=False default=<expr> domain=<expr> help='Weight Unit of Measure' string='Weight Units of Measure' args: 'uom.uom'
  • weight_uom_name Char
    readonly=True related='weight_uom_id.name' string='Weight unit of measure label'
Public methods (1)
  • get_allow_new_product(self, product, package_type=None, package=None, quants=None)
    Return the `allow_new_product` option value. It first evaluates the conditions based on different criteria, and if no value can be found among them it fallbacks on the category option value.

New fields (4)
  • allow_new_product Selection
    default='mixed' required=True selection=_selection_allow_new_product
  • condition_ids Many2many → stock.storage.category.allow_new_product.cond
    comodel_name='stock.storage.category.allow_new_product.cond' help='All conditions have to match to apply the Allow New Product policy.' relation='stock_storage_category_allow_new_product_cond_rel' required=True string='Conditions'
  • sequence Integer
    index=True
  • storage_category_id Many2one → stock.storage.category
    comodel_name='stock.storage.category' index=True ondelete='cascade' required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • evaluate(self, storage_category, product, package_type, package, quants)

New fields (5)
  • active Boolean
    default=True
  • code_snippet Text
    required=True
  • code_snippet_docs Text
    compute='_compute_code_snippet_docs' default=<expr>
  • condition_type Selection
    default='code' required=True selection=[('code', 'Execute code')]
  • name Char
    required=True
Public methods (1)
  • evaluate(self, *args, **kwargs)
    Evaluate and return the result of the condition.

New fields (5)
  • location_id Many2one → stock.location
    required=True args: 'stock.location'
  • location_putaway_strategy Selection
    related='location_id.pack_putaway_strategy'
  • location_sequence_cond_ids Many2many → stock.storage.location.sequence.cond
    comodel_name='stock.storage.location.sequence.cond' help='All conditions have to match to apply the put-away strategy.' relation='stock_location_sequence_cond_rel' string='Conditions'
  • package_type_id Many2one → stock.package.type
    required=True args: 'stock.package.type'
  • sequence Integer
    required=True
Public methods (2)
  • button_show_locations(self)
  • can_be_applied(self, putaway_location, quant, product)
    Check if conditions are met.

New fields (0)

No new fields.

Public methods (1)
  • evaluate(self, storage_location_sequence, putaway_location, quant, product)
REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/14.0/stock_storage_type
VERSION
VERSION 1.12.3
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, BCIM
COMMITTERS
COMMITTERSJacques-Etienne Baudoux, Laurent Mignon (ACSONE), OCA Transbot, Sébastien Alix, Thierry Ducrest, Sébastien BEAU, oca-travis, Weblate, OCA-git-bot, Simone Orsi, hparfr, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:12
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_packaging_dimension
    - product_logistics_uom
OCA/server-tools:
    - base_m2m_custom_field
OCA/stock-logistics-workflow:
    - stock_putaway_hook
    - stock_quant_package_dimension
    - stock_quant_package_product_packaging
OCA/web:
    - web_domain_field
odoo/odoo:
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
location_package_storage_type_rel_tree_view stock.location.package.storage.type.rel.tree.view stock.location.package.storage.type.rel tree New
location_storage_type_form_view stock.location.storage.type.form.view stock.location.storage.type form New
location_storage_type_tree_view stock.location.storage.type.tree.view stock.location.storage.type tree New
package_level_form_view_inherit Package Level Inherit stock.package_level field Inherits stock.package_level_form_view
package_level_tree_view_picking_inherit Package Level Tree Picking Inherit stock.package_level field Inherits stock.package_level_tree_view_picking
package_storage_location_tree_view package.storage.location.tree.view stock.storage.location.sequence tree New
package_storage_type_form_view package.storage.type.form.view stock.package.storage.type form New
package_storage_type_tree_view package.storage.type.tree.view stock.package.storage.type tree New
product_packaging_form_view_inherit product.packaging.form.view.inherit product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_inherit product.packaging.tree.view.inherit product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view_procurement_button_inherit product.template_procurement.inherit product.template field Inherits stock.product_template_form_view_procurement_button
stock_location_storage_type_search_view stock.location.storage.type search stock.location.storage.type search New
stock_package_storage_type_search_view stock.package.storage.type search stock.package.storage.type search New
stock_storage_location_sequence_cond_form_view stock.storage.location.sequence.cond.form (in stock_storage_type) stock.storage.location.sequence.cond form New
stock_storage_location_sequence_cond_tree_view stock.storage.location.sequence.cond.tree (in stock_storage_type) stock.storage.location.sequence.cond tree New
view_location_form_inherit stock.location.form.inherit stock.location field Inherits stock.view_location_form
view_quant_package_form_inherit stock.quant.package.form.inherit stock.quant.package field Inherits stock_quant_package_product_packaging.view_quant_package_form_inherit
Models touched (12)

New fields (1)
  • package_storage_type_id Many2one → stock.package.storage.type
    help='The package storage type will be set on stock packages using this product packaging, in order to compute its putaway.' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (1)
  • product_package_storage_type_id Many2one → stock.package.storage.type
    help="Defines a 'default' package storage type for this product to be applied on packages without product packagings for put-away computations." string='Package storage type' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (18)
  • allowed_location_storage_type_ids Many2many → stock.location.storage.type
    compute='_compute_allowed_location_storage_type_ids' help='Locations storage types that this location can accept. (If no location storage types are defined on this specific location, the location storage types of the parent location are applied).' store=True args: 'stock.location.storage.type', 'stock_location_allowed_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • do_not_mix_lots Boolean
    compute='_compute_do_not_mix_lots' store=True
  • do_not_mix_products Boolean
    compute='_compute_do_not_mix_products' store=True
  • in_move_ids One2many → stock.move
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.moves in the location' args: 'stock.move', 'location_dest_id'
  • in_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.move.lines in the location' args: 'stock.move.line', 'location_dest_id'
  • leaf_child_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves sub-locations' args: 'stock.location'
  • leaf_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves locations' args: 'stock.location'
  • location_is_empty Boolean
    compute='_compute_location_is_empty' help='technical field: True if the location is empty and there is no pending incoming products in the location. Computed only if the location needs to check for emptiness (has an "only empty" location storage type).' store=True
  • location_storage_type_ids Many2many → stock.location.storage.type
    help='Location storage types defined here will be applied on all the children locations that do not define their own location storage types.' args: 'stock.location.storage.type', 'stock_location_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • location_will_contain_lot_ids Many2many → stock.production.lot
    compute='_compute_location_will_contain_lot_ids' help='technical field: list of stock.production.lots in the location, either now or in pending operations' store=True args: 'stock.production.lot'
  • location_will_contain_product_ids Many2many → product.product
    compute='_compute_location_will_contain_product_ids' help='technical field: list of products in the location, either now or in pending operations' store=True args: 'product.product'
  • max_height Float
    compute='_compute_max_height' help='The max height supported among allowed location storage types.' store=True string='Max height (mm)'
  • max_height_in_m Float
    compute='_compute_max_height' help='The max height supported among allowed location storage types.' store=True string='Max height (m)'
  • only_empty Boolean
    compute='_compute_only_empty' store=True
  • out_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending outgoing stock.move.lines in the location' args: 'stock.move.line', 'location_id'
  • pack_putaway_sequence Integer
  • pack_putaway_strategy Selection
    default='none' help='This defines the storage strategy to use when packs are put away in this location.\nNone: when a pack is moved to this location, it will not be put away any further.\nOrdered Children Locations: when a pack is moved to this location, a suitable location will be searched in its children locations according to the restrictions defined on their respective location storage types.' required=True selection=[('none', 'None'), ('ordered_locations', 'Ordered Children Locations')] string='Packs Put-Away Strategy'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Storage locations sequences' args: 'stock.storage.location.sequence', 'location_id'
Public methods (3)
  • get_storage_locations(self, products=None)
  • select_allowed_locations(self, package_storage_type, quants, products, limit=None)
    Filter allowed locations for a storage type ``self`` contains locations already ordered according to the putaway strategy, so beware of the return that must keep the same order
  • select_first_allowed_location(self, package_storage_type, quants, products)

New fields (2)
  • location_storage_type_id Many2one → stock.location.storage.type
    required=True args: 'stock.location.storage.type'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True
  • do_not_mix_lots Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains product of the same lot.'
  • do_not_mix_products Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains the same product.'
  • has_restrictions Boolean
    compute='_compute_has_restrictions'
  • length_uom_id Many2one → uom.uom
    default=<expr> domain=<expr> help='UoM for height' args: 'uom.uom', 'Dimensions Units of Measure'
  • length_uom_name Char
    readonly=True related='length_uom_id.name' string='Length unit of measure label'
  • location_ids Many2many → stock.location
    copy=False readonly=True args: 'stock.location', 'stock_location_allowed_location_storage_type_rel', 'location_storage_type_id', 'location_id'
  • max_height Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging height is lower than this maximum.' string='Max height (mm)'
  • max_height_in_m Float
    compute='_compute_max_height_in_m' help='Technical field, to speed up comparaisons' store=True string='Max height in m'
  • max_weight Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging wight is lower than this maximum.' string='Max weight (kg)'
  • max_weight_in_kg Float
    compute='_compute_max_weight_in_kg' help='Technical field, to speed up comparaisons' store=True string='Max weight in kg'
  • name Char
    required=True
  • only_empty Boolean
    help='If checked, moves to the destination location will only be allowed if there are not any existing quant nor planned move on this location'
  • weight_uom_id Many2one → uom.uom
    compute=False default=<expr> domain=<expr> help='Weight Unit of Measure' string='Weight Units of Measure' args: 'uom.uom'
  • weight_uom_name Char
    readonly=True related='weight_uom_id.name' string='Weight unit of measure label'
Public methods (1)
  • button_show_locations(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • barcode Char
    copy=False args: 'Barcode'
  • height_required Boolean
    default=False help='Height is mandatory for packages configured with this storage type.' string='Height required for packages'
  • name Char
    required=True
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'package_storage_type_id'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Put-Away sequence' args: 'stock.storage.location.sequence', 'package_storage_type_id'
  • storage_type_message Html
    compute='_compute_storage_type_message'
Public methods (1)
  • action_view_storage_locations(self)

New fields (1)
  • allowed_location_dest_domain Char
    compute='_compute_allowed_location_dest_domain' string='Allowed Destinations Domain'
Public methods (1)
  • recompute_pack_putaway(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (3)
  • height_in_m Float
    compute='_compute_height_in_m' help='Technical field, to speed up comparaisons' store=True string='Height in m'
  • pack_weight_in_kg Float
    compute='_compute_pack_weight_in_kg' help='Technical field, to speed up comparaisons' store=True string='Pack weight in kg'
  • package_storage_type_id Many2one → stock.package.storage.type
    help='Package storage type for put-away computation. Get value automatically from the packaging if set, or from the product ifthe package contains only a single product.' args: 'stock.package.storage.type'
Public methods (3)
  • auto_assign_packaging(self)
  • create(self, vals)
    @api.model_create_multi
  • write(self, vals)

New fields (5)
  • location_id Many2one → stock.location
    required=True args: 'stock.location'
  • location_putaway_strategy Selection
    related='location_id.pack_putaway_strategy'
  • location_sequence_cond_ids Many2many → stock.storage.location.sequence.cond
    comodel_name='stock.storage.location.sequence.cond' relation='stock_location_sequence_cond_rel' string='Conditions'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
  • sequence Integer
    required=True
Public methods (2)
  • button_show_locations(self)
  • can_be_applied(self, putaway_location, quant, product)
    Check if conditions are met.

New fields (5)
  • active Boolean
    default=True
  • code_snippet Text
    required=True
  • code_snippet_docs Text
    compute='_compute_code_snippet_docs' default=<expr>
  • condition_type Selection
    default='code' required=True selection=[('code', 'Execute code')]
  • name Char
    required=True
Public methods (1)
  • evaluate(self, storage_location_sequence, putaway_location, quant, product)
REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/13.0/stock_storage_type
VERSION
VERSION 1.16.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, BCIM
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, BCIM
COMMITTERS
COMMITTERSGuewen Baconnier, GitHub, Jacques-Etienne Baudoux, sebalix, Laurent Mignon (ACSONE), Akim Juillerat, OCA Transbot, Sébastien Alix, oca-travis, Weblate, OCA-git-bot, Simone Orsi, Carlos Serra-Toro
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/product-attribute:
    - product_packaging_dimension
OCA/server-tools:
    - base_m2m_custom_field
OCA/stock-logistics-workflow:
    - stock_putaway_hook
    - stock_quant_package_dimension
    - stock_quant_package_product_packaging
OCA/web:
    - web_domain_field
odoo/odoo:
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (15)
XML IDNameModelTypeStatus
location_package_storage_type_rel_tree_view stock.location.package.storage.type.rel.tree.view stock.location.package.storage.type.rel tree New
location_storage_type_form_view stock.location.storage.type.form.view stock.location.storage.type form New
location_storage_type_tree_view stock.location.storage.type.tree.view stock.location.storage.type tree New
package_level_form_view_inherit Package Level Inherit stock.package_level field Inherits stock.package_level_form_view
package_level_tree_view_picking_inherit Package Level Tree Picking Inherit stock.package_level field Inherits stock.package_level_tree_view_picking
package_storage_location_tree_view package.storage.location.tree.view stock.storage.location.sequence tree New
package_storage_type_form_view package.storage.type.form.view stock.package.storage.type form New
package_storage_type_tree_view package.storage.type.tree.view stock.package.storage.type tree New
product_packaging_form_view_inherit product.packaging.form.view.inherit product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_inherit product.packaging.tree.view.inherit product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view_procurement_button_inherit product.template_procurement.inherit product.template field Inherits stock.product_template_form_view_procurement_button
stock_location_storage_type_search_view stock.location.storage.type search stock.location.storage.type search New
stock_package_storage_type_search_view stock.package.storage.type search stock.package.storage.type search New
view_location_form_inherit stock.location.form.inherit stock.location field Inherits stock.view_location_form
view_quant_package_form_inherit stock.quant.package.form.inherit stock.quant.package field Inherits stock_quant_package_product_packaging.view_quant_package_form_inherit
Models touched (11)

New fields (1)
  • package_storage_type_id Many2one → stock.package.storage.type
    help='The package storage type will be set on stock packages using this product packaging, in order to compute its putaway.' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (1)
  • product_package_storage_type_id Many2one → stock.package.storage.type
    help="Defines a 'default' package storage type for this product to be applied on packages without product packagings for put-away computations." string='Package storage type' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (17)
  • allowed_location_storage_type_ids Many2many → stock.location.storage.type
    compute='_compute_allowed_location_storage_type_ids' help='Locations storage types that this location can accept. (If no location storage types are defined on this specific location, the location storage types of the parent location are applied).' store=True args: 'stock.location.storage.type', 'stock_location_allowed_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • do_not_mix_lots Boolean
    compute='_compute_do_not_mix_lots' store=True
  • do_not_mix_products Boolean
    compute='_compute_do_not_mix_products' store=True
  • in_move_ids One2many → stock.move
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.moves in the location' args: 'stock.move', 'location_dest_id'
  • in_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.move.lines in the location' args: 'stock.move.line', 'location_dest_id'
  • leaf_child_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves sub-locations' args: 'stock.location'
  • leaf_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves locations' args: 'stock.location'
  • location_is_empty Boolean
    compute='_compute_location_is_empty' help='technical field: True if the location is empty and there is no pending incoming products in the location. Computed only if the location needs to check for emptiness (has an "only empty" location storage type).' store=True
  • location_storage_type_ids Many2many → stock.location.storage.type
    help='Location storage types defined here will be applied on all the children locations that do not define their own location storage types.' args: 'stock.location.storage.type', 'stock_location_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • location_will_contain_lot_ids Many2many → stock.production.lot
    compute='_compute_location_will_contain_lot_ids' help='technical field: list of stock.production.lots in the location, either now or in pending operations' store=True args: 'stock.production.lot'
  • location_will_contain_product_ids Many2many → product.product
    compute='_compute_location_will_contain_product_ids' help='technical field: list of products in the location, either now or in pending operations' store=True args: 'product.product'
  • max_height Float
    compute='_compute_max_height' help='The max height supported among allowed location storage types.' store=True string='Max height (mm)'
  • only_empty Boolean
    compute='_compute_only_empty' store=True
  • out_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending outgoing stock.move.lines in the location' args: 'stock.move.line', 'location_id'
  • pack_putaway_sequence Integer
  • pack_putaway_strategy Selection
    default='none' help='This defines the storage strategy to use when packs are put away in this location.\nNone: when a pack is moved to this location, it will not be put away any further.\nOrdered Children Locations: when a pack is moved to this location, a suitable location will be searched in its children locations according to the restrictions defined on their respective location storage types.' required=True selection=[('none', 'None'), ('ordered_locations', 'Ordered Children Locations')] string='Packs Put-Away Strategy'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Storage locations sequences' args: 'stock.storage.location.sequence', 'location_id'
Public methods (3)
  • get_storage_locations(self, products=None)
  • select_allowed_locations(self, package_storage_type, quants, products, limit=None)
    Filter allowed locations for a storage type ``self`` contains locations already ordered according to the putaway strategy, so beware of the return that must keep the same order
  • select_first_allowed_location(self, package_storage_type, quants, products)

New fields (2)
  • location_storage_type_id Many2one → stock.location.storage.type
    required=True args: 'stock.location.storage.type'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True
  • do_not_mix_lots Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains product of the same lot.'
  • do_not_mix_products Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains the same product.'
  • has_restrictions Boolean
    compute='_compute_has_restrictions'
  • location_ids Many2many → stock.location
    copy=False readonly=True args: 'stock.location', 'stock_location_allowed_location_storage_type_rel', 'location_storage_type_id', 'location_id'
  • max_height Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging height is lower than this maximum.' string='Max height (mm)'
  • max_weight Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging wight is lower than this maximum.' string='Max weight (kg)'
  • name Char
    required=True
  • only_empty Boolean
    help='If checked, moves to the destination location will only be allowed if there are not any existing quant nor planned move on this location'
Public methods (1)
  • button_show_locations(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • barcode Char
    copy=False args: 'Barcode'
  • height_required Boolean
    default=False help='Height is mandatory for packages configured with this storage type.' string='Height required for packages'
  • name Char
    required=True
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'package_storage_type_id'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Put-Away sequence' args: 'stock.storage.location.sequence', 'package_storage_type_id'
  • storage_type_message Html
    compute='_compute_storage_type_message'
Public methods (1)
  • action_view_storage_locations(self)

New fields (1)
  • allowed_location_dest_domain Char
    compute='_compute_allowed_location_dest_domain' string='Allowed Destinations Domain'
Public methods (1)
  • recompute_pack_putaway(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (1)
  • package_storage_type_id Many2one → stock.package.storage.type
    help='Package storage type for put-away computation. Get value automatically from the packaging if set, or from the product ifthe package contains only a single product.' args: 'stock.package.storage.type'
Public methods (3)
  • auto_assign_packaging(self)
  • create(self, vals)
    @api.model_create_multi
  • write(self, vals)

New fields (4)
  • location_id Many2one → stock.location
    required=True args: 'stock.location'
  • location_putaway_strategy Selection
    related='location_id.pack_putaway_strategy'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
  • sequence Integer
    required=True
Public methods (1)
  • button_show_locations(self)
REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/12.0/stock_storage_type
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSGitHub, Akim Juillerat, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:25
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
location_storage_type_form_view stock.location.storage.type.form.view stock.location.storage.type form New
location_storage_type_tree_view stock.location.storage.type.tree.view stock.location.storage.type tree New
package_storage_type_form_view storage.unit.type.tree.view stock.package.storage.type form New
package_storage_type_tree_view storage.unit.type.tree.view stock.package.storage.type tree New
product_packaging_form_view_inherit product.packaging.form.view.inherit product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_inherit product.packaging.tree.view.inherit product.packaging field Inherits product.product_packaging_tree_view
view_location_form_inherit stock.location.form.inherit stock.location field Inherits stock.view_location_form
view_picking_form_inherit stock.picking.form.inherit stock.picking xpath Inherits stock.view_picking_form
Models touched (4)

New fields (1)
  • stock_package_storage_type_id Many2one → stock.package.storage.type
    args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (2)
  • allowed_stock_location_storage_type_ids Many2many → stock.location.storage.type
    compute='_compute_allowed_stock_location_storage_type_ids' store=True args: 'stock.location.storage.type', 'stock_location_allowed_stock_location_storage_type_rel', 'stock_location_id', 'stock_location_storage_type_id'
  • stock_location_storage_type_ids Many2many → stock.location.storage.type
    args: 'stock.location.storage.type', 'stock_location_stock_location_storage_type_rel', 'stock_location_id', 'stock_location_storage_type_id'
Public methods (0)

No public methods.

New fields (4)
  • allowed_location_ids Many2many → stock.location
    readonly=True args: 'stock.location', 'stock_location_allowed_stock_location_storage_type_rel', 'stock_location_storage_type_id', 'stock_location_id'
  • location_ids Many2many → stock.location
    args: 'stock.location', 'stock_location_stock_location_storage_type_rel', 'stock_location_storage_type_id', 'stock_location_id'
  • name Char
    required=True
  • stock_package_storage_type_ids Many2many → stock.package.storage.type
    args: 'stock.package.storage.type', 'stock_location_package_storage_type_rel', 'stock_location_storage_type_id', 'stock_package_storage_type_id'
Public methods (0)

No public methods.

New fields (3)
  • name Char
    required=True
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'stock_package_storage_type_id'
  • stock_location_storage_type_ids Many2many → stock.location.storage.type
    args: 'stock.location.storage.type', 'stock_location_package_storage_type_rel', 'stock_package_storage_type_id', 'stock_location_storage_type_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/wms
GIT
GIThttps://github.com/OCA/wms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/wms/tree/10.0/stock_storage_type
VERSION
VERSION 1.6.0
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSGuewen Baconnier, GitHub, sebalix, Laurent Mignon (ACSONE), Akim Juillerat, Sébastien Alix, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/wms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:20:03
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_domain_field
odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (13)
XML IDNameModelTypeStatus
location_package_storage_type_rel_tree_view stock.location.package.storage.type.rel.tree.view stock.location.package.storage.type.rel tree New
location_storage_type_form_view stock.location.storage.type.form.view stock.location.storage.type form New
location_storage_type_tree_view stock.location.storage.type.tree.view stock.location.storage.type tree New
package_level_form_view_inherit Package Level Inherit stock.package_level field Inherits stock.package_level_form_view
package_level_tree_view_picking_inherit Package Level Tree Picking Inherit stock.package_level field Inherits stock.package_level_tree_view_picking
package_storage_location_tree_view package.storage.location.tree.view stock.storage.location.sequence tree New
package_storage_type_form_view package.storage.type.form.view stock.package.storage.type form New
package_storage_type_tree_view package.storage.type.tree.view stock.package.storage.type tree New
product_packaging_form_view_inherit product.packaging.form.view.inherit product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_inherit product.packaging.tree.view.inherit product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view_procurement_button_inherit product.template_procurement.inherit product.template field Inherits stock.product_template_form_view_procurement_button
view_location_form_inherit stock.location.form.inherit stock.location field Inherits stock.view_location_form
view_quant_package_form_inherit stock.quant.package.form.inherit stock.quant.package field Inherits stock_quant_package_product_packaging.view_quant_package_form_inherit
Models touched (11)

New fields (1)
  • package_storage_type_id Many2one → stock.package.storage.type
    help='The package storage type will be set on stock packages using this product packaging, in order to compute its putaway.' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (1)
  • product_package_storage_type_id Many2one → stock.package.storage.type
    help="Defines a 'default' package storage type for this product to be applied on packages without product packagings for put-away computations." string='Package storage type' args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (11)
  • allowed_location_storage_type_ids Many2many → stock.location.storage.type
    compute='_compute_allowed_location_storage_type_ids' help='Locations storage types that this location can accept. (If no location storage types are defined on this specific location, the location storage types of the parent location are applied).' store=True args: 'stock.location.storage.type', 'stock_location_allowed_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • in_move_ids One2many → stock.move
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.moves in the location' args: 'stock.move', 'location_dest_id'
  • in_move_line_ids One2many → stock.move.line
    domain=[('state', 'in', ('waiting', 'confirmed', 'partially_available', 'assigned'))] help='technical field: the pending incoming stock.move.lines in the location' args: 'stock.move.line', 'location_dest_id'
  • leaf_location_ids Many2many → stock.location
    compute='_compute_leaf_location_ids' help='technical field: all the leaves sub-locations' args: 'stock.location'
  • location_is_empty Boolean
    compute='_compute_location_is_empty' help='technical field: True if the location is empty and there is no pending incoming products in the location' store=True
  • location_storage_type_ids Many2many → stock.location.storage.type
    help='Location storage types defined here will be applied on all the children locations that do not define their own location storage types.' args: 'stock.location.storage.type', 'stock_location_location_storage_type_rel', 'location_id', 'location_storage_type_id'
  • location_will_contain_lot_ids Many2many → stock.production.lot
    compute='_compute_location_will_contain_lot_ids' help='technical field: list of stock.production.lots in the location, either now or in pending operations' store=True args: 'stock.production.lot'
  • location_will_contain_product_ids Many2many → product.product
    compute='_compute_location_will_contain_product_ids' help='technical field: list of products in the location, either now or in pending operations' store=True args: 'product.product'
  • max_height Float
    compute='_compute_max_height' help='The max height supported among allowed location storage types.' store=True string='Max height (mm)'
  • pack_putaway_strategy Selection
    default='none' help='This defines the storage strategy to use when packs are put away in this location.\nNone: when a pack is moved to this location, it will not be put away any further.\nOrdered Children Locations: when a pack is moved to this location, a suitable location will be searched in its children locations according to the restrictions defined on their respective location storage types.' required=True selection=[('none', 'None'), ('ordered_locations', 'Ordered Children Locations')] string='Packs Put-Away Strategy'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Storage locations sequences' args: 'stock.storage.location.sequence', 'location_id'
Public methods (3)
  • get_storage_locations(self, products=None)
  • select_allowed_locations(self, package_storage_type, quants, products, limit=None)
  • select_first_allowed_location(self, package_storage_type, quants, products)

New fields (2)
  • location_storage_type_id Many2one → stock.location.storage.type
    required=True args: 'stock.location.storage.type'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
Public methods (0)

No public methods.

New fields (8)
  • do_not_mix_lots Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains product of the same lot.'
  • do_not_mix_products Boolean
    help='If checked, moves to the destination location will only be allowed if the location contains the same product.'
  • has_restrictions Boolean
    compute='_compute_has_restrictions'
  • location_ids Many2many → stock.location
    copy=False readonly=True args: 'stock.location', 'stock_location_allowed_location_storage_type_rel', 'location_storage_type_id', 'location_id'
  • max_height Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging height is lower than this maximum.' string='Max height (mm)'
  • max_weight Float
    default=0.0 help='If defined, moves to the destination location will only be allowed if the packaging wight is lower than this maximum.' string='Max weight (kg)'
  • name Char
    required=True
  • only_empty Boolean
    help='If checked, moves to the destination location will only be allowed if there are not any existing quant nor planned move on this location'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • height_required Boolean
    default=False help='Height is mandatory for packages configured with this storage type.' string='Height required for packages'
  • name Char
    required=True
  • product_packaging_ids One2many → product.packaging
    args: 'product.packaging', 'package_storage_type_id'
  • storage_location_sequence_ids One2many → stock.storage.location.sequence
    string='Put-Away sequence' args: 'stock.storage.location.sequence', 'package_storage_type_id'
  • storage_type_message Html
    compute='_compute_storage_type_message'
Public methods (1)
  • action_view_storage_locations(self)

New fields (1)
  • allowed_location_dest_domain Char
    compute='_compute_allowed_location_dest_domain' string='Allowed Destinations Domain'
Public methods (1)
  • recompute_pack_putaway(self)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (1)
  • package_storage_type_id Many2one → stock.package.storage.type
    help='Package storage type for put-away computation. Get value automatically from the packaging if set, or from the product ifthe package contains only a single product.' args: 'stock.package.storage.type'
Public methods (3)
  • auto_assign_packaging(self)
  • create(self, vals)
    @api.model_create_multi
  • write(self, vals)

New fields (4)
  • location_id Many2one → stock.location
    required=True args: 'stock.location'
  • location_putaway_strategy Selection
    related='location_id.pack_putaway_strategy'
  • package_storage_type_id Many2one → stock.package.storage.type
    required=True args: 'stock.package.storage.type'
  • sequence Integer
    required=True
Public methods (0)

No public methods.