[REF] delivery, stock: make delivery product a new model

Currently, delivery packaging and product packaging share the same
model product.packaging. In this commit, we make delivery packaging
a new model stock.package.type. The code is also moved to stock
instead of delivery for compatibility reasons.

Task 2341820
PR #63516
ENT PR odoo/enterprise#15363
UPG PR odoo/upgrade#2040
This commit is contained in:
yhu-odoo
2021-03-31 08:55:44 +00:00
parent f2b19e4f4d
commit 1cd0a138cf
17 changed files with 162 additions and 140 deletions
+1 -1
View File
@@ -17,7 +17,6 @@ invoices from picking, the system is able to add and compute the shipping line.
'data': [
'security/ir.model.access.csv',
'security/delivery_carrier_security.xml',
'views/product_packaging_view.xml',
'views/product_template_view.xml',
'views/delivery_view.xml',
'views/partner_view.xml',
@@ -29,6 +28,7 @@ invoices from picking, the system is able to add and compute the shipping line.
'views/res_config_settings_views.xml',
'wizard/choose_delivery_package_views.xml',
'wizard/choose_delivery_carrier_views.xml',
'views/stock_package_type_views.xml',
],
'demo': ['data/delivery_demo.xml'],
'installable': True,
+1 -1
View File
@@ -3,9 +3,9 @@
from . import delivery_carrier
from . import delivery_grid
from . import product_packaging
from . import product_template
from . import sale_order
from . import partner
from . import stock_picking
from . import stock_move
from . import stock_package_type
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api
class PackageType(models.Model):
_inherit = 'stock.package.type'
shipper_package_code = fields.Char('Carrier Code')
package_carrier_type = fields.Selection([('none', 'No carrier integration')], string='Carrier', default='none')
@api.onchange('package_carrier_type')
def _onchange_carrier_type(self):
carrier_id = self.env['delivery.carrier'].search([('delivery_type', '=', self.package_carrier_type)], limit=1)
if carrier_id:
self.shipper_package_code = carrier_id._get_default_custom_package_code()
else:
self.shipper_package_code = False
+4 -4
View File
@@ -133,13 +133,13 @@ class StockPicking(models.Model):
res = super(StockPicking, self)._pre_put_in_pack_hook(move_line_ids)
if not res:
if self.carrier_id:
return self._set_delivery_packaging()
return self._set_delivery_package_type()
else:
return res
def _set_delivery_packaging(self):
""" This method returns an action allowing to set the product packaging and the shipping weight
on the stock.quant.package.
def _set_delivery_package_type(self):
""" This method returns an action allowing to set the package type and the shipping weight
on the stock.quant.package.
"""
self.ensure_one()
view_id = self.env.ref('delivery.choose_delivery_package_view_form').id
+1 -26
View File
@@ -1,19 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Delivery Carriers -->
<menuitem id="menu_delivery" name="Delivery" parent="stock.menu_stock_config_settings" groups="stock.group_stock_manager" sequence="50"/>
<record id="action_delivery_packaging_view" model="ir.actions.act_window">
<field name="name">Delivery Packages</field>
<field name="res_model">product.packaging</field>
<field name="domain">[('product_id', '=', False)]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('delivery.product_packaging_delivery_tree')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('delivery.product_packaging_delivery_form')})]"/>
</record>
<menuitem id="menu_delivery_packagings" name="Delivery Packages" parent="menu_delivery" action="action_delivery_packaging_view" groups="stock.group_tracking_lot"/>
<record id="view_delivery_carrier_tree" model="ir.ui.view">
<field name="name">delivery.carrier.tree</field>
<field name="model">delivery.carrier</field>
@@ -175,7 +162,7 @@
</field>
</record>
<menuitem action="action_delivery_carrier_form" id="menu_action_delivery_carrier_form" parent="menu_delivery" sequence="1"/>
<menuitem action="action_delivery_carrier_form" id="menu_action_delivery_carrier_form" parent="stock.menu_delivery" sequence="1"/>
<menuitem action="action_delivery_carrier_form" id="sale_menu_action_delivery_carrier_form" parent="sale.menu_sales_config" sequence="4"/>
<record id="view_delivery_price_rule_form" model="ir.ui.view">
@@ -278,7 +265,6 @@
<field name="inherit_id" ref="stock.view_quant_package_form"/>
<field name="arch" type="xml">
<field name="company_id" position="before">
<field name="packaging_id" domain="[('product_id', '=', False)]"/>
<label for="shipping_weight"/>
<div class="o_row" name="Shipping Weight">
<field name="shipping_weight"/>
@@ -289,17 +275,6 @@
</field>
</record>
<record id="view_quant_package_packaging_tree" model="ir.ui.view">
<field name="name">stock.quant.package.packaging.tree</field>
<field name="model">stock.quant.package</field>
<field name="inherit_id" ref="stock.view_quant_package_tree"/>
<field name="arch" type="xml">
<field name="display_name" position="after">
<field name="packaging_id"/>
</field>
</field>
</record>
<record id="view_order_form_with_carrier" model="ir.ui.view">
<field name="name">delivery.sale.order.form.view.with_carrier</field>
<field name="model">sale.order</field>
@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="product_packaging_delivery_form">
<field name="name">product.packaging.form.delivery</field>
<field name="model">product.packaging</field>
<field name="inherit_id" eval="False"/>
<field name="arch" type="xml">
<form string="Delivery Packaging">
<sheet>
<label for="name"/>
<h1>
<field name="name"/>
</h1>
<group name="delivery">
<group>
<field name="package_carrier_type"/>
<label for="height"/>
<div class="o_row" name="height">
<field name="height"/>
<span><field name="length_uom_name"/></span>
</div>
<label for="width"/>
<div class="o_row" name="width">
<field name="width"/>
<span><field name="length_uom_name"/></span>
</div>
<label for="packaging_length"/>
<div class="o_row" name="packaging_length">
<field name="packaging_length"/>
<span><field name="length_uom_name"/></span>
</div>
</group>
<group>
<label for="max_weight"/>
<div class="o_row" name="max_weight">
<field name="max_weight"/>
<span><field name="weight_uom_name"/></span>
</div>
<field name="barcode"/>
<field name="shipper_package_code"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="product_packaging_delivery_tree">
<field name="name">product.packaging.tree.delivery</field>
<field name="model">product.packaging</field>
<field name="inherit_id" eval="False"/>
<field name="arch" type="xml">
<tree string="Delivery Packages">
<field name="sequence" widget="handle"/>
<field name="package_carrier_type"/>
<field name="name"/>
<field name="height"/>
<field name="width"/>
<field name="packaging_length"/>
<field name="max_weight"/>
<field name="shipper_package_code"/>
<field name="barcode" invisible="1"/>
</tree>
</field>
</record>
</odoo>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="stock_package_type_form_delivery">
<field name="name">stock.package.type.form.delivery</field>
<field name="model">stock.package.type</field>
<field name="inherit_id" ref="stock.stock_package_type_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='delivery']" position="inside">
<group>
<field name="package_carrier_type"/>
<field name="shipper_package_code"/>
</group>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="stock_package_type_tree_delivery">
<field name="name">stock.package.type.tree.delivery</field>
<field name="model">stock.package.type</field>
<field name="inherit_id" ref="stock.stock_package_type_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='sequence']" position="after">
<field name="package_carrier_type"/>
</xpath>
<xpath expr="//field[@name='max_weight']" position="after">
<field name="shipper_package_code"/>
</xpath>
</field>
</record>
</odoo>
@@ -26,20 +26,20 @@ class ChooseDeliveryPackage(models.TransientModel):
return defaults
picking_id = fields.Many2one('stock.picking', 'Picking')
delivery_packaging_id = fields.Many2one('product.packaging', 'Delivery Packaging', check_company=True)
delivery_package_type_id = fields.Many2one('stock.package.type', 'Delivery Package Type', check_company=True)
shipping_weight = fields.Float('Shipping Weight')
weight_uom_name = fields.Char(string='Weight unit of measure label', compute='_compute_weight_uom_name')
company_id = fields.Many2one(related='picking_id.company_id')
@api.depends('delivery_packaging_id')
@api.depends('delivery_package_type_id')
def _compute_weight_uom_name(self):
weight_uom_id = self.env['product.template']._get_weight_uom_id_from_ir_config_parameter()
for package in self:
package.weight_uom_name = weight_uom_id.name
@api.onchange('delivery_packaging_id', 'shipping_weight')
def _onchange_packaging_weight(self):
if self.delivery_packaging_id.max_weight and self.shipping_weight > self.delivery_packaging_id.max_weight:
@api.onchange('delivery_package_type_id', 'shipping_weight')
def _onchange_package_type_weight(self):
if self.delivery_package_type_id.max_weight and self.shipping_weight > self.delivery_package_type_id.max_weight:
warning_mess = {
'title': _('Package too heavy!'),
'message': _('The weight of your package is higher than the maximum weight authorized for this package type. Please choose another package type.')
@@ -61,8 +61,8 @@ class ChooseDeliveryPackage(models.TransientModel):
precision_rounding=ml.product_uom_id.rounding) == 0)
delivery_package = self.picking_id._put_in_pack(move_line_ids)
# write shipping weight and product_packaging on 'stock_quant_package' if needed
if self.delivery_packaging_id:
delivery_package.packaging_id = self.delivery_packaging_id
# write shipping weight and package type on 'stock_quant_package' if needed
if self.delivery_package_type_id:
delivery_package.package_type_id = self.delivery_package_type_id
if self.shipping_weight:
delivery_package.shipping_weight = self.shipping_weight
@@ -7,10 +7,10 @@
<form string="Package">
<field name="picking_id" invisible="1"/>
<group>
<field name="delivery_packaging_id" domain="[('package_carrier_type', '=', context.get('current_package_carrier_type', 'none'))]"
context="{'form_view_ref':'delivery.product_packaging_delivery_form'}"/>
<label for="shipping_weight" attrs="{'invisible': [('delivery_packaging_id', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': [('delivery_packaging_id', '=', False)]}" name="package_weight">
<field name="delivery_package_type_id" domain="[('package_carrier_type', '=', context.get('current_package_carrier_type', 'none'))]"
context="{'form_view_ref':'stock.stock_package_type_form'}"/>
<label for="shipping_weight" attrs="{'invisible': [('delivery_package_type_id', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': [('delivery_package_type_id', '=', False)]}" name="package_weight">
<field name="shipping_weight"/>
<field name="weight_uom_name"/>
</div>
+1
View File
@@ -76,6 +76,7 @@
'views/stock_template.xml',
'views/stock_rule_views.xml',
'views/stock_package_level_views.xml',
'views/stock_package_type_view.xml',
],
'qweb': [
'static/src/xml/inventory_report.xml',
+1
View File
@@ -19,3 +19,4 @@ from . import stock_warehouse
from . import stock_scrap
from . import product
from . import stock_package_level
from . import stock_package_type
@@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api
from odoo import models, fields, _
class ProductPackaging(models.Model):
_inherit = 'product.packaging'
class PackageType(models.Model):
_name = 'stock.package.type'
_description = "Stock package type"
def _get_default_length_uom(self):
return self.env['product.template']._get_length_uom_name_from_ir_config_parameter()
@@ -14,14 +14,16 @@ class ProductPackaging(models.Model):
def _get_default_weight_uom(self):
return self.env['product.template']._get_weight_uom_name_from_ir_config_parameter()
height = fields.Integer('Height')
width = fields.Integer('Width')
packaging_length = fields.Integer('Length')
name = fields.Char('Package Type', required=True)
sequence = fields.Integer('Sequence', default=1, help="The first in the sequence is the default one.")
height = fields.Integer('Height', help="Packaging Height")
width = fields.Integer('Width', help="Packaging Width")
packaging_length = fields.Integer('Length', help="Packaging Length")
max_weight = fields.Float('Max Weight', help='Maximum weight shippable in this packaging')
shipper_package_code = fields.Char('Package Code')
package_carrier_type = fields.Selection([('none', 'No carrier integration')], string='Carrier', default='none')
barcode = fields.Char('Barcode', copy=False)
weight_uom_name = fields.Char(string='Weight unit of measure label', compute='_compute_weight_uom_name', default=_get_default_weight_uom)
length_uom_name = fields.Char(string='Length unit of measure label', compute='_compute_length_uom_name', default=_get_default_length_uom)
company_id = fields.Many2one('res.company', 'Company', index=True)
_sql_constraints = [
('positive_height', 'CHECK(height>=0)', 'Height must be positive'),
@@ -30,18 +32,9 @@ class ProductPackaging(models.Model):
('positive_max_weight', 'CHECK(max_weight>=0.0)', 'Max Weight must be positive'),
]
@api.onchange('package_carrier_type')
def _onchange_carrier_type(self):
carrier_id = self.env['delivery.carrier'].search([('delivery_type', '=', self.package_carrier_type)], limit=1)
if carrier_id:
self.shipper_package_code = carrier_id._get_default_custom_package_code()
else:
self.shipper_package_code = False
def _compute_length_uom_name(self):
for packaging in self:
packaging.length_uom_name = self.env['product.template']._get_length_uom_name_from_ir_config_parameter()
for package_type in self:
package_type.length_uom_name = self.env['product.template']._get_length_uom_name_from_ir_config_parameter()
def _compute_weight_uom_name(self):
for packaging in self:
+2 -2
View File
@@ -726,8 +726,8 @@ class QuantPackage(models.Model):
default=lambda self: self.env['ir.sequence'].next_by_code('stock.quant.package') or _('Unknown Pack'))
quant_ids = fields.One2many('stock.quant', 'package_id', 'Bulk Content', readonly=True,
domain=['|', ('quantity', '!=', 0), ('reserved_quantity', '!=', 0)])
packaging_id = fields.Many2one(
'product.packaging', 'Package Type', index=True, check_company=True)
package_type_id = fields.Many2one(
'stock.package.type', 'Package Type', index=True, check_company=True)
location_id = fields.Many2one(
'stock.location', 'Location', compute='_compute_package_info',
index=True, readonly=True, store=True)
@@ -19,9 +19,9 @@
</tr>
</table>
<div class="row mt32 mb32">
<div t-if="o.packaging_id" class="o_packaging_type col-auto">
<div t-if="o.package_type_id" class="o_packaging_type col-auto">
<strong>Package Type:</strong>
<p t-field="o.packaging_id.name"/>
<p t-field="o.package_type_id.name"/>
</div>
</div>
<table class="table table-sm" style="border-bottom: 0px solid white !important;">
@@ -69,8 +69,8 @@
<p t-field="o.name" style="font-size:20px;"></p>
</div>
</div>
<div class="row o_packaging_type" t-if="o.packaging_id">
<div class="col-12 text-center" style="font-size:24px; font-weight:bold;"><span>Package Type: </span><span t-field="o.packaging_id.name"/></div>
<div class="row o_packaging_type" t-if="o.package_type_id">
<div class="col-12 text-center" style="font-size:24px; font-weight:bold;"><span>Package Type: </span><span t-field="o.package_type_id.name"/></div>
</div>
</div>
</t>
@@ -81,3 +81,5 @@ access_stock_track_confirmation,access.stock.track.confirmation,model_stock_trac
access_stock_track_line,access.stock.track.line,model_stock_track_line,stock.group_stock_user,1,1,1,0
access_stock_package_destination,access.stock.package.destination,model_stock_package_destination,stock.group_stock_user,1,1,1,0
access_stock_orderpoint_snooze,access_stock_orderpoint_snooze,model_stock_orderpoint_snooze,stock.group_stock_user,1,1,1,1
access_stock_package_type_user,access_stock_package_type_user,model_stock_package_type,stock.group_stock_user,1,0,0,0
access_stock_package_type_manager,access_stock_package_type_manager,model_stock_package_type,stock.group_stock_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
81 access_stock_track_line access.stock.track.line model_stock_track_line stock.group_stock_user 1 1 1 0
82 access_stock_package_destination access.stock.package.destination model_stock_package_destination stock.group_stock_user 1 1 1 0
83 access_stock_orderpoint_snooze access_stock_orderpoint_snooze model_stock_orderpoint_snooze stock.group_stock_user 1 1 1 1
84 access_stock_package_type_user access_stock_package_type_user model_stock_package_type stock.group_stock_user 1 0 0 0
85 access_stock_package_type_manager access_stock_package_type_manager model_stock_package_type stock.group_stock_manager 1 1 1 1
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="stock_package_type_form">
<field name="name">stock.package.type.form</field>
<field name="model">stock.package.type</field>
<field name="arch" type="xml">
<form string="Package Type">
<sheet>
<label for="name"/>
<h1>
<field name="name"/>
</h1>
<group name="delivery">
<group>
<label for="length_uom_name" string="Size"/>
<div class="o_row" name="size">
<field name="packaging_length" placeholder="Length"/>
<span>&#215;</span>
<field name="width" placeholder="Width"/>
<span>&#215;</span>
<field name="height" placeholder="Height"/>
<span><field name="length_uom_name" help="Size: Length &#215; Width &#215; Height"/></span>
</div>
<label for="max_weight"/>
<div class="o_row" name="max_weight">
<field name="max_weight"/>
<span><field name="weight_uom_name"/></span>
</div>
<field name="barcode"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="stock_package_type_tree">
<field name="name">stock.package.type.tree</field>
<field name="model">stock.package.type</field>
<field name="arch" type="xml">
<tree string="Package Types">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="height"/>
<field name="width"/>
<field name="packaging_length"/>
<field name="max_weight"/>
<field name="barcode" invisible="1"/>
</tree>
</field>
</record>
<record id="action_package_type_view" model="ir.actions.act_window">
<field name="name">Package Types</field>
<field name="res_model">stock.package.type</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('stock.stock_package_type_tree')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('stock.stock_package_type_form')})]"/>
</record>
<menuitem id="menu_delivery" name="Delivery" parent="stock.menu_stock_config_settings" groups="stock.group_stock_manager" sequence="50"/>
<menuitem id="menu_packaging_types" name="Package Types" parent="menu_delivery" action="action_package_type_view" groups="stock.group_tracking_lot"/>
</odoo>
+4 -2
View File
@@ -227,10 +227,10 @@
<search string="Package">
<field name="name" string="Package Name"/>
<field name="location_id"/>
<field name="packaging_id"/>
<field name="package_type_id"/>
<group expand='0' string='Group by...'>
<filter string='Location' name="location" domain="[]" context="{'group_by' : 'location_id'}"/>
<filter string='Packaging' name="packaging" domain="[]" context="{'group_by' : 'packaging_id'}"/>
<filter string='Package Type' name="package_type" domain="[]" context="{'group_by' : 'package_type_id'}"/>
</group>
</search>
</field>
@@ -257,6 +257,7 @@
</div>
<group>
<group id='stock.package_location_group'>
<field name="package_type_id"/>
<field name='company_id' groups="base.group_multi_company"/>
<field name='owner_id' groups="stock.group_tracking_owner"/>
<field name="location_id" options="{'no_create': True}"/>
@@ -283,6 +284,7 @@
<field name="arch" type="xml">
<tree string="Package" sample="1">
<field name="display_name"/>
<field name="package_type_id"/>
<field name="location_id" options="{'no_create': True}"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>