From 45f2d11806fa7aaf022f6ef86260e8813f497ae3 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest <thierry.ducrest@camptocamp.com> Date: Thu, 11 Aug 2022 11:37:18 +0200 Subject: [PATCH 01/10] Add delivery_carrier_package_measure_required This module adds the possibility to flag some measurements on package to be required for delivery. --- .../README.rst | 81 ++++ .../__init__.py | 2 + .../__manifest__.py | 22 + ...ivery_carrier_package_measure_required.pot | 153 +++++++ .../models/__init__.py | 3 + .../models/product_packaging.py | 13 + .../models/stock_picking.py | 21 + .../models/stock_quant_package.py | 38 ++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 9 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 423 ++++++++++++++++++ .../tests/__init__.py | 1 + ...elivery_carrier_package_measure_require.py | 95 ++++ .../views/product_packaging.xml | 21 + .../wizard/__init__.py | 1 + .../wizard/choose_delivery_package.py | 35 ++ .../wizard/choose_delivery_package.xml | 54 +++ 18 files changed, 973 insertions(+) create mode 100644 delivery_carrier_package_measure_required/README.rst create mode 100644 delivery_carrier_package_measure_required/__init__.py create mode 100644 delivery_carrier_package_measure_required/__manifest__.py create mode 100644 delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot create mode 100644 delivery_carrier_package_measure_required/models/__init__.py create mode 100644 delivery_carrier_package_measure_required/models/product_packaging.py create mode 100644 delivery_carrier_package_measure_required/models/stock_picking.py create mode 100644 delivery_carrier_package_measure_required/models/stock_quant_package.py create mode 100644 delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst create mode 100644 delivery_carrier_package_measure_required/readme/DESCRIPTION.rst create mode 100644 delivery_carrier_package_measure_required/static/description/icon.png create mode 100644 delivery_carrier_package_measure_required/static/description/index.html create mode 100644 delivery_carrier_package_measure_required/tests/__init__.py create mode 100644 delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py create mode 100644 delivery_carrier_package_measure_required/views/product_packaging.xml create mode 100644 delivery_carrier_package_measure_required/wizard/__init__.py create mode 100644 delivery_carrier_package_measure_required/wizard/choose_delivery_package.py create mode 100644 delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst new file mode 100644 index 0000000000..fba20e436e --- /dev/null +++ b/delivery_carrier_package_measure_required/README.rst @@ -0,0 +1,81 @@ +========================================= +Delivery Carrier Package Measure Required +========================================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github + :target: https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required + :alt: OCA/delivery-carrier +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/99/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the possibility to flag some measurements on package to be required for delivery. + +It depends on the `stock_quant_package_dimension` which adds more dimensions on packages. + +The required measurement can be flagged on the product packaging. + +Then the dimension can be set on the wizard displayed by the Put In Pack button. + +A check is also done on transfer validation, to ensure that the required measurements are set. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/issues>`_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Thierry Ducrest <thierry.ducrest@camptocamp.com> + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required>`_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/delivery_carrier_package_measure_required/__init__.py b/delivery_carrier_package_measure_required/__init__.py new file mode 100644 index 0000000000..9b4296142f --- /dev/null +++ b/delivery_carrier_package_measure_required/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py new file mode 100644 index 0000000000..451a459ab2 --- /dev/null +++ b/delivery_carrier_package_measure_required/__manifest__.py @@ -0,0 +1,22 @@ +{ + "name": "Delivery Carrier Package Measure Required", + "summary": """ + Allow the configuration of which package measurements are required + on a delivery carrier basis. + """, + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/delivery-carrier", + "depends": [ + "stock", + "delivery", + # OCA/stock-logistics-workflow + "stock_quant_package_dimension", + ], + "data": [ + "views/product_packaging.xml", + "wizard/choose_delivery_package.xml", + ], + "installable": True, +} diff --git a/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot b/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot new file mode 100644 index 0000000000..6cffe1edd9 --- /dev/null +++ b/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot @@ -0,0 +1,153 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_carrier_package_measure_required +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: delivery_carrier_package_measure_required +#: model_terms:ir.ui.view,arch_db:delivery_carrier_package_measure_required.view_product_packaging_delivery_form_inherit +msgid "Carrier Required Measurements" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_choose_delivery_package +msgid "Delivery Package Selection Wizard" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_id +msgid "Dimension Uom" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_height_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__height_required +msgid "Height required" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__id +msgid "ID" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package____last_update +msgid "Last Modified on" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_length_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__length_required +msgid "Length required" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height +msgid "Package Height" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length +msgid "Package Length" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width +msgid "Package Width" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_quant_package +msgid "Packages" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_product_packaging +msgid "Product Packaging" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__pick_name +msgid "Reference" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "" +"The measurement(s) [{dimension}] are required on the package {pack_name} and" +" need to be set." +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_name +msgid "Unit of Measure" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_weight_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_weight_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__weight_required +msgid "Weight required" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_width_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__width_required +msgid "Width required" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "height" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "length" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "weight" +msgstr "" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "width" +msgstr "" diff --git a/delivery_carrier_package_measure_required/models/__init__.py b/delivery_carrier_package_measure_required/models/__init__.py new file mode 100644 index 0000000000..cb7177dedf --- /dev/null +++ b/delivery_carrier_package_measure_required/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_packaging +from . import stock_picking +from . import stock_quant_package diff --git a/delivery_carrier_package_measure_required/models/product_packaging.py b/delivery_carrier_package_measure_required/models/product_packaging.py new file mode 100644 index 0000000000..127d8bd8b5 --- /dev/null +++ b/delivery_carrier_package_measure_required/models/product_packaging.py @@ -0,0 +1,13 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class ProductPackaging(models.Model): + _inherit = "product.packaging" + + package_height_required = fields.Boolean(string="Height required") + package_length_required = fields.Boolean(string="Length required") + package_weight_required = fields.Boolean(string="Weight required") + package_width_required = fields.Boolean(string="Width required") diff --git a/delivery_carrier_package_measure_required/models/stock_picking.py b/delivery_carrier_package_measure_required/models/stock_picking.py new file mode 100644 index 0000000000..0654c14b43 --- /dev/null +++ b/delivery_carrier_package_measure_required/models/stock_picking.py @@ -0,0 +1,21 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + def _check_required_package_measurement(self): + """Check the required measurement on destination pacakges. + + If package is None all result packages on the stock pickings are checked + otherwise only the one + """ + packages = self.move_line_ids.mapped("result_package_id") + packages._check_required_dimension() + + def button_validate(self): + self._check_required_package_measurement() + return super().button_validate() diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py new file mode 100644 index 0000000000..953606fda4 --- /dev/null +++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py @@ -0,0 +1,38 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class StockQuantPackage(models.Model): + _inherit = "stock.quant.package" + + length_required = fields.Boolean(related="packaging_id.package_length_required") + width_required = fields.Boolean(related="packaging_id.package_width_required") + height_required = fields.Boolean(related="packaging_id.package_height_required") + weight_required = fields.Boolean(related="packaging_id.package_weight_required") + + @api.constrains("length", "width", "height", "weight") + # The boolean field use to check if a dimension is required are intentionally left out. + # To not raise error when changing packaging configuration. + def _check_required_dimension(self): + for package in self: + required_dimension = [] + if package.length_required and not package.pack_length: + required_dimension.append(_("length")) + if package.width_required and not package.width: + required_dimension.append(_("width")) + if package.height_required and not package.height: + required_dimension.append(_("height")) + if package.weight_required and not package.shipping_weight: + required_dimension.append(_("weight")) + if required_dimension: + raise ValidationError( + _( + "The measurement(s) [{dimension}] are required " + "on the package {pack_name} and need to be set." + ).format( + dimension=", ".join(required_dimension), pack_name=package.name + ) + ) diff --git a/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst b/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..0dd376faec --- /dev/null +++ b/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest <thierry.ducrest@camptocamp.com> diff --git a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..51666e8352 --- /dev/null +++ b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst @@ -0,0 +1,9 @@ +This module adds the possibility to flag some measurements on package to be required for delivery. + +It depends on the `stock_quant_package_dimension` which adds more dimensions on packages. + +The required measurement can be flagged on the product packaging. + +Then the dimension can be set on the wizard displayed by the Put In Pack button. + +A check is also done on transfer validation, to ensure that the required measurements are set. diff --git a/delivery_carrier_package_measure_required/static/description/icon.png b/delivery_carrier_package_measure_required/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html new file mode 100644 index 0000000000..2c099df114 --- /dev/null +++ b/delivery_carrier_package_measure_required/static/description/index.html @@ -0,0 +1,423 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" /> +<title>Delivery Carrier Package Measure Required</title> +<style type="text/css"> + +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +.subscript { + vertical-align: sub; + font-size: smaller } + +.superscript { + vertical-align: super; + font-size: smaller } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { + overflow: hidden; +} + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title, .code .error { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left, .figure.align-left, object.align-left, table.align-left { + clear: left ; + float: left ; + margin-right: 1em } + +img.align-right, .figure.align-right, object.align-right, table.align-right { + clear: right ; + float: right ; + margin-left: 1em } + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left } + +.align-center { + clear: both ; + text-align: center } + +.align-right { + text-align: right } + +/* reset inner alignment in figures */ +div.align-right { + text-align: inherit } + +/* div.align-center * { */ +/* text-align: left } */ + +.align-top { + vertical-align: top } + +.align-middle { + vertical-align: middle } + +.align-bottom { + vertical-align: bottom } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font: inherit } + +pre.literal-block, pre.doctest-block, pre.math, pre.code { + margin-left: 2em ; + margin-right: 2em } + +pre.code .ln { color: grey; } /* line numbers */ +pre.code, code { background-color: #eeeeee } +pre.code .comment, code .comment { color: #5C6576 } +pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } +pre.code .literal.string, code .literal.string { color: #0C5404 } +pre.code .name.builtin, code .name.builtin { color: #352B84 } +pre.code .deleted, code .deleted { background-color: #DEB0A1} +pre.code .inserted, code .inserted { background-color: #A3D289} + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +/* "booktabs" style (no vertical lines) */ +table.docutils.booktabs { + border: 0px; + border-top: 2px solid; + border-bottom: 2px solid; + border-collapse: collapse; +} +table.docutils.booktabs * { + border: 0px; +} +table.docutils.booktabs th { + border-bottom: thin solid; + text-align: left; +} + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } + +</style> +</head> +<body> +<div class="document" id="delivery-carrier-package-measure-required"> +<h1 class="title">Delivery Carrier Package Measure Required</h1> + +<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! This file is generated by oca-gen-addon-readme !! +!! changes will be overwritten. !! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> +<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p> +<p>This module adds the possibility to flag some measurements on package to be required for delivery.</p> +<p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p> +<p>The required measurement can be flagged on the product packaging.</p> +<p>Then the dimension can be set on the wizard displayed by the Put In Pack button.</p> +<p>A check is also done on transfer validation, to ensure that the required measurements are set.</p> +<p><strong>Table of contents</strong></p> +<div class="contents local topic" id="contents"> +<ul class="simple"> +<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li> +<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul> +<li><a class="reference internal" href="#authors" id="id3">Authors</a></li> +<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li> +<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li> +</ul> +</li> +</ul> +</div> +<div class="section" id="bug-tracker"> +<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1> +<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> +<p>Do not contact contributors directly about support or help with technical issues.</p> +</div> +<div class="section" id="credits"> +<h1><a class="toc-backref" href="#id2">Credits</a></h1> +<div class="section" id="authors"> +<h2><a class="toc-backref" href="#id3">Authors</a></h2> +<ul class="simple"> +<li>Camptocamp</li> +</ul> +</div> +<div class="section" id="contributors"> +<h2><a class="toc-backref" href="#id4">Contributors</a></h2> +<ul class="simple"> +<li>Thierry Ducrest <<a class="reference external" href="mailto:thierry.ducrest@camptocamp.com">thierry.ducrest@camptocamp.com</a>></li> +</ul> +</div> +<div class="section" id="maintainers"> +<h2><a class="toc-backref" href="#id5">Maintainers</a></h2> +<p>This module is maintained by the OCA.</p> +<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a> +<p>OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.</p> +<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p> +<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> +</div> +</div> +</div> +</body> +</html> diff --git a/delivery_carrier_package_measure_required/tests/__init__.py b/delivery_carrier_package_measure_required/tests/__init__.py new file mode 100644 index 0000000000..815b653cf9 --- /dev/null +++ b/delivery_carrier_package_measure_required/tests/__init__.py @@ -0,0 +1 @@ +from . import test_delivery_carrier_package_measure_require diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py new file mode 100644 index 0000000000..112364f4fe --- /dev/null +++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py @@ -0,0 +1,95 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + + +from odoo.exceptions import ValidationError + +from odoo.addons.stock.tests.test_packing import TestPackingCommon + + +class TestDeliveryCarrierPackageMeasureRequire(TestPackingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.normal_carrier = cls.env.ref("delivery.normal_delivery_carrier") + cls.uom_kg = cls.env.ref("uom.product_uom_kgm") + cls.product_aw = cls.env["product.product"].create( + { + "name": "Product AW", + "type": "product", + "weight": 2.4, + "uom_id": cls.uom_kg.id, + "uom_po_id": cls.uom_kg.id, + } + ) + cls.packaging = cls.env["product.packaging"].create( + {"name": "Test Delivery Packaging"} + ) + cls.env["stock.quant"]._update_available_quantity( + cls.product_aw, cls.stock_location, 20.0 + ) + cls.pick = cls.env["stock.picking"].create( + { + "partner_id": cls.env["res.partner"].create({"name": "A partner"}).id, + "picking_type_id": cls.warehouse.out_type_id.id, + "location_id": cls.stock_location.id, + "location_dest_id": cls.customer_location.id, + "carrier_id": cls.normal_carrier.id, + } + ) + cls.env["stock.move.line"].create( + { + "product_id": cls.product_aw.id, + "product_uom_id": cls.uom_kg.id, + "picking_id": cls.pick.id, + "qty_done": 5, + "location_id": cls.stock_location.id, + "location_dest_id": cls.customer_location.id, + } + ) + cls.pick.action_confirm() + + def test_required_measurement_are_properly_set(self): + """Check required measurement are fullfilled on validation.""" + pack_action = self.pick.action_put_in_pack() + pack_action_ctx = pack_action["context"] + pack_wiz = ( + self.env["choose.delivery.package"].with_context(pack_action_ctx).create({}) + ) + pack_wiz.action_put_in_pack() + package = self.pick.move_line_ids.mapped("result_package_id") + package.packaging_id = self.packaging + # No measurement required + self.pick._check_required_package_measurement() + # Check length is required + self.packaging.package_length_required = True + with self.assertRaises(ValidationError): + self.pick.button_validate() + package.pack_length = 55 + self.pick._check_required_package_measurement() + # Check width is required + self.packaging.package_width_required = True + with self.assertRaises(ValidationError): + self.pick._check_required_package_measurement() + package.width = 25 + self.pick._check_required_package_measurement() + # Check weight is required + self.packaging.package_weight_required = True + package.shipping_weight = False + with self.assertRaises(ValidationError): + self.pick._check_required_package_measurement() + package.shipping_weight = 250 + self.pick._check_required_package_measurement() + # Check height is required + self.packaging.package_height_required = True + with self.assertRaises(ValidationError): + self.pick._check_required_package_measurement() + package.height = 250 + self.pick._check_required_package_measurement() + # Missing requirement on validate + package.width_required = False + package.width = False + package.width_required = True + with self.assertRaises(ValidationError): + self.pick.button_validate() diff --git a/delivery_carrier_package_measure_required/views/product_packaging.xml b/delivery_carrier_package_measure_required/views/product_packaging.xml new file mode 100644 index 0000000000..12dbe65106 --- /dev/null +++ b/delivery_carrier_package_measure_required/views/product_packaging.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<odoo> + <record id="view_product_packaging_delivery_form_inherit" model="ir.ui.view"> + <field name="name">product.packaging.form.delivery</field> + <field name="model">product.packaging</field> + <field name="inherit_id" ref="delivery.product_packaging_delivery_form" /> + <field name="arch" type="xml"> + <xpath expr="//group[@name='delivery']" position="inside"> + <group + name="carrier_required_mesaurement" + string="Carrier Required Measurements" + > + <field name="package_length_required" /> + <field name="package_width_required" /> + <field name="package_height_required" /> + <field name="package_weight_required" /> + </group> + </xpath> + </field> + </record> +</odoo> diff --git a/delivery_carrier_package_measure_required/wizard/__init__.py b/delivery_carrier_package_measure_required/wizard/__init__.py new file mode 100644 index 0000000000..9925e2632c --- /dev/null +++ b/delivery_carrier_package_measure_required/wizard/__init__.py @@ -0,0 +1 @@ +from . import choose_delivery_package diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py new file mode 100644 index 0000000000..5f57f828e2 --- /dev/null +++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py @@ -0,0 +1,35 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class ChooseDeliveryPackage(models.TransientModel): + _inherit = "choose.delivery.package" + + pick_name = fields.Char(related="picking_id.name") + + def _default_dimension_uom_id(self): + val = self.env["product.template"]._get_length_uom_id_from_ir_config_parameter() + return val + + package_height = fields.Integer() + package_length = fields.Integer() + package_width = fields.Integer() + dimension_uom_id = fields.Many2one( + "uom.uom", + default=lambda self: self._default_dimension_uom_id(), + ) + dimension_uom_name = fields.Char(related="dimension_uom_id.name") + package_height_required = fields.Boolean( + related="delivery_packaging_id.package_height_required" + ) + package_length_required = fields.Boolean( + related="delivery_packaging_id.package_length_required" + ) + package_weight_required = fields.Boolean( + related="delivery_packaging_id.package_weight_required" + ) + package_width_required = fields.Boolean( + related="delivery_packaging_id.package_width_required" + ) diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml new file mode 100644 index 0000000000..86b74b5f74 --- /dev/null +++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <record id="choose_delivery_package_view_form" model="ir.ui.view"> + <field name="name">choose.delivery.package.inherit</field> + <field name="model">choose.delivery.package</field> + <field name="inherit_id" ref="delivery.choose_delivery_package_view_form" /> + <field name="arch" type="xml"> + <xpath expr="//label[@for='shipping_weight']" position="before"> + + <field name="package_height_required" invisible="1" /> + <field name="package_length_required" invisible="1" /> + <field name="package_weight_required" invisible="1" /> + <field name="package_width_required" invisible="1" /> + <label + for="package_length" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}" + /> + <div + class="o_row" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}" + name="package_length" + > + <field name="package_length" /> + <field name="dimension_uom_name" /> + </div> + <label + for="package_width" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}" + /> + <div + class="o_row" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}" + name="package_width" + > + <field name="package_width" /> + <field name="dimension_uom_name" /> + </div> + <label + for="package_height" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}" + /> + <div + class="o_row" + attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}" + name="package_height" + > + <field name="package_height" /> + <field name="dimension_uom_name" /> + </div> + + </xpath> + </field> + </record> +</odoo> From c1cd1f8a8912f2d652c9dcb0884339774c3d13bc Mon Sep 17 00:00:00 2001 From: Thierry Ducrest <thierry@ducrest.net> Date: Fri, 4 Nov 2022 10:31:38 +0100 Subject: [PATCH 02/10] Fix dc_package_measure_required for not done transfer The required dimensions on a package need not to be enforce before the picking is being done (package with content). Because that blocks any preparation on the package before it is delivered. But we still want to be able to check if the package is valid at will. This can be done with the `delivery_pkg_measure__ignore_package_content` context key. --- .../models/stock_quant_package.py | 8 +++- ...elivery_carrier_package_measure_require.py | 42 ++++++++++++------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py index 953606fda4..59eabc54ad 100644 --- a/delivery_carrier_package_measure_required/models/stock_quant_package.py +++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py @@ -13,11 +13,17 @@ class StockQuantPackage(models.Model): height_required = fields.Boolean(related="packaging_id.package_height_required") weight_required = fields.Boolean(related="packaging_id.package_weight_required") - @api.constrains("length", "width", "height", "weight") # The boolean field use to check if a dimension is required are intentionally left out. # To not raise error when changing packaging configuration. + @api.constrains("length", "width", "height", "weight", "quant_ids") def _check_required_dimension(self): + ignore_pack_content = self.env.context.get( + "delivery_pkg_measure__ignore_package_content" + ) for package in self: + if not ignore_pack_content and not package.quant_ids: + # Only validate a package when it contains goods + continue required_dimension = [] if package.length_required and not package.pack_length: required_dimension.append(_("length")) diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py index 112364f4fe..6d4109e913 100644 --- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py +++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py @@ -49,47 +49,59 @@ def setUpClass(cls): } ) cls.pick.action_confirm() - - def test_required_measurement_are_properly_set(self): - """Check required measurement are fullfilled on validation.""" - pack_action = self.pick.action_put_in_pack() + pack_action = cls.pick.action_put_in_pack() pack_action_ctx = pack_action["context"] pack_wiz = ( - self.env["choose.delivery.package"].with_context(pack_action_ctx).create({}) + cls.env["choose.delivery.package"] + .with_context(**pack_action_ctx) + .create({}) ) pack_wiz.action_put_in_pack() - package = self.pick.move_line_ids.mapped("result_package_id") - package.packaging_id = self.packaging + cls.package = cls.pick.move_line_ids.mapped("result_package_id") + cls.package.packaging_id = cls.packaging + + def test_force_check_required_measurement(self): + self.packaging.package_length_required = True + # Picking is not done no validation error + self.pick._check_required_package_measurement() + # Force validation error raised + pick = self.pick.with_context(delivery_pkg_measure__ignore_package_content=True) + with self.assertRaises(ValidationError): + pick.button_validate() + + def test_required_measurement_are_properly_set(self): + """Check required measurement are fullfilled on done picking.""" + self.pick._action_done() # No measurement required self.pick._check_required_package_measurement() # Check length is required self.packaging.package_length_required = True with self.assertRaises(ValidationError): self.pick.button_validate() - package.pack_length = 55 + self.package.pack_length = 55 self.pick._check_required_package_measurement() # Check width is required self.packaging.package_width_required = True with self.assertRaises(ValidationError): self.pick._check_required_package_measurement() - package.width = 25 + self.package.width = 25 self.pick._check_required_package_measurement() # Check weight is required self.packaging.package_weight_required = True - package.shipping_weight = False + self.package.shipping_weight = False with self.assertRaises(ValidationError): self.pick._check_required_package_measurement() - package.shipping_weight = 250 + self.package.shipping_weight = 250 self.pick._check_required_package_measurement() # Check height is required self.packaging.package_height_required = True with self.assertRaises(ValidationError): self.pick._check_required_package_measurement() - package.height = 250 + self.package.height = 250 self.pick._check_required_package_measurement() # Missing requirement on validate - package.width_required = False - package.width = False - package.width_required = True + self.package.width_required = False + self.package.width = False + self.package.width_required = True with self.assertRaises(ValidationError): self.pick.button_validate() From 781528f8c5ee674788f92751133a4ccc15730e96 Mon Sep 17 00:00:00 2001 From: OCA-git-bot <oca-git-bot@odoo-community.org> Date: Thu, 10 Nov 2022 08:24:35 +0000 Subject: [PATCH 03/10] delivery_carrier_package_measure_required 14.0.1.0.1 --- delivery_carrier_package_measure_required/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py index 451a459ab2..02f3ac7a22 100644 --- a/delivery_carrier_package_measure_required/__manifest__.py +++ b/delivery_carrier_package_measure_required/__manifest__.py @@ -4,7 +4,7 @@ Allow the configuration of which package measurements are required on a delivery carrier basis. """, - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/delivery-carrier", From c36b17008b1a7fda3644209ed1ec2d20f942ce8c Mon Sep 17 00:00:00 2001 From: Thierry Ducrest <thierry.ducrest@camptocamp.com> Date: Fri, 7 Jul 2023 10:06:13 +0200 Subject: [PATCH 04/10] dc_package_measure_required: fix warning constrains --- .../models/stock_quant_package.py | 2 +- .../tests/test_delivery_carrier_package_measure_require.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py index 59eabc54ad..eb966891c6 100644 --- a/delivery_carrier_package_measure_required/models/stock_quant_package.py +++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py @@ -15,7 +15,7 @@ class StockQuantPackage(models.Model): # The boolean field use to check if a dimension is required are intentionally left out. # To not raise error when changing packaging configuration. - @api.constrains("length", "width", "height", "weight", "quant_ids") + @api.constrains("pack_length", "width", "height", "shipping_weight", "quant_ids") def _check_required_dimension(self): ignore_pack_content = self.env.context.get( "delivery_pkg_measure__ignore_package_content" diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py index 6d4109e913..0057beb5e5 100644 --- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py +++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py @@ -87,8 +87,8 @@ def test_required_measurement_are_properly_set(self): self.package.width = 25 self.pick._check_required_package_measurement() # Check weight is required - self.packaging.package_weight_required = True self.package.shipping_weight = False + self.packaging.package_weight_required = True with self.assertRaises(ValidationError): self.pick._check_required_package_measurement() self.package.shipping_weight = 250 From 4202b4e100d1ae2c149083ca61b8c37ffb0a5fc3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot <oca-git-bot@odoo-community.org> Date: Mon, 10 Jul 2023 07:13:41 +0000 Subject: [PATCH 05/10] delivery_carrier_package_measure_required 14.0.1.0.2 --- .../README.rst | 15 ++++---- .../__manifest__.py | 2 +- .../static/description/index.html | 34 ++++++++++--------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst index fba20e436e..060b9db388 100644 --- a/delivery_carrier_package_measure_required/README.rst +++ b/delivery_carrier_package_measure_required/README.rst @@ -2,10 +2,13 @@ Delivery Carrier Package Measure Required ========================================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Delivery Carrier Package Measure Required .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/99/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds the possibility to flag some measurements on package to be required for delivery. @@ -45,7 +48,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/issues>`_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. Do not contact contributors directly about support or help with technical issues. diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py index 02f3ac7a22..fa9a340b1e 100644 --- a/delivery_carrier_package_measure_required/__manifest__.py +++ b/delivery_carrier_package_measure_required/__manifest__.py @@ -4,7 +4,7 @@ Allow the configuration of which package measurements are required on a delivery carrier basis. """, - "version": "14.0.1.0.1", + "version": "14.0.1.0.2", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/delivery-carrier", diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html index 2c099df114..eb7d0c4595 100644 --- a/delivery_carrier_package_measure_required/static/description/index.html +++ b/delivery_carrier_package_measure_required/static/description/index.html @@ -1,20 +1,20 @@ -<?xml version="1.0" encoding="utf-8" ?> +<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" /> <title>Delivery Carrier Package Measure Required</title> <style type="text/css"> /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $ +:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. -See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. */ @@ -366,8 +366,10 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1> <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p> +<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p> <p>This module adds the possibility to flag some measurements on package to be required for delivery.</p> <p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p> <p>The required measurement can be flagged on the product packaging.</p> @@ -376,39 +378,39 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1> <p><strong>Table of contents</strong></p> <div class="contents local topic" id="contents"> <ul class="simple"> -<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li> -<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul> -<li><a class="reference internal" href="#authors" id="id3">Authors</a></li> -<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li> -<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li> +<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li> +<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul> +<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li> +<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li> +<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li> </ul> </li> </ul> </div> <div class="section" id="bug-tracker"> -<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1> +<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1> <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> <p>Do not contact contributors directly about support or help with technical issues.</p> </div> <div class="section" id="credits"> -<h1><a class="toc-backref" href="#id2">Credits</a></h1> +<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1> <div class="section" id="authors"> -<h2><a class="toc-backref" href="#id3">Authors</a></h2> +<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2> <ul class="simple"> <li>Camptocamp</li> </ul> </div> <div class="section" id="contributors"> -<h2><a class="toc-backref" href="#id4">Contributors</a></h2> +<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2> <ul class="simple"> <li>Thierry Ducrest <<a class="reference external" href="mailto:thierry.ducrest@camptocamp.com">thierry.ducrest@camptocamp.com</a>></li> </ul> </div> <div class="section" id="maintainers"> -<h2><a class="toc-backref" href="#id5">Maintainers</a></h2> +<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2> <p>This module is maintained by the OCA.</p> <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a> <p>OCA, or the Odoo Community Association, is a nonprofit organization whose From 299caf6812f54c3ab44dcd790ab4b0190798a2cb Mon Sep 17 00:00:00 2001 From: FranciscoFactorLibre <francisco.santos@factorlibre.com> Date: Mon, 18 Sep 2023 08:25:01 +0000 Subject: [PATCH 06/10] Added translation using Weblate (Spanish) --- .../i18n/es.po | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 delivery_carrier_package_measure_required/i18n/es.po diff --git a/delivery_carrier_package_measure_required/i18n/es.po b/delivery_carrier_package_measure_required/i18n/es.po new file mode 100644 index 0000000000..985e3eb2d0 --- /dev/null +++ b/delivery_carrier_package_measure_required/i18n/es.po @@ -0,0 +1,158 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_carrier_package_measure_required +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-09-18 08:34+0000\n" +"Last-Translator: FranciscoFactorLibre <francisco.santos@factorlibre.com>\n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: delivery_carrier_package_measure_required +#: model_terms:ir.ui.view,arch_db:delivery_carrier_package_measure_required.view_product_packaging_delivery_form_inherit +msgid "Carrier Required Measurements" +msgstr "Medidas requeridas por el transportista" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_choose_delivery_package +msgid "Delivery Package Selection Wizard" +msgstr "Asistente selección paquete para el envío" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_id +msgid "Dimension Uom" +msgstr "Dimensión Uom" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__display_name +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_height_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__height_required +msgid "Height required" +msgstr "Necesario altura" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__id +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__id +msgid "ID" +msgstr "ID" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking____last_update +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package____last_update +msgid "Last Modified on" +msgstr "Ultima modificación en" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_length_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__length_required +msgid "Length required" +msgstr "Necesaria longitud" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height +msgid "Package Height" +msgstr "Altura del paquete" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length +msgid "Package Length" +msgstr "Longitud del paquete" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width +msgid "Package Width" +msgstr "Ancho del paquete" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_quant_package +msgid "Packages" +msgstr "Paquetes" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_product_packaging +msgid "Product Packaging" +msgstr "Empaquetado del producto" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__pick_name +msgid "Reference" +msgstr "Referencia" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "" +"The measurement(s) [{dimension}] are required on the package {pack_name} and" +" need to be set." +msgstr "" +"La medida(s) [{dimension}] son requeridas para el paquete {pack_name} y " +"deben configurarse." + +#. module: delivery_carrier_package_measure_required +#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_picking +msgid "Transfer" +msgstr "Transferir" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_name +msgid "Unit of Measure" +msgstr "Unidad de medida" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_weight_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_weight_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__weight_required +msgid "Weight required" +msgstr "Necesario peso" + +#. module: delivery_carrier_package_measure_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_width_required +#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__width_required +msgid "Width required" +msgstr "Necesario ancho" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "height" +msgstr "Altura" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "length" +msgstr "Longitud" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "weight" +msgstr "Peso" + +#. module: delivery_carrier_package_measure_required +#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0 +#, python-format +msgid "width" +msgstr "Ancho" From 5f13364b96a10fc9115607e0b3eca6b25b15ebf0 Mon Sep 17 00:00:00 2001 From: Rodrigo <rodrigo.bonilla@factorlibre.com> Date: Mon, 2 Oct 2023 13:17:15 +0200 Subject: [PATCH 07/10] [IMP] delivery_carrier_package_measure_required: pre-commit stuff --- .../odoo/addons/delivery_carrier_package_measure_required | 1 + setup/delivery_carrier_package_measure_required/setup.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 120000 setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required create mode 100644 setup/delivery_carrier_package_measure_required/setup.py diff --git a/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required b/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required new file mode 120000 index 0000000000..fb062084af --- /dev/null +++ b/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required @@ -0,0 +1 @@ +../../../../delivery_carrier_package_measure_required \ No newline at end of file diff --git a/setup/delivery_carrier_package_measure_required/setup.py b/setup/delivery_carrier_package_measure_required/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/delivery_carrier_package_measure_required/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From ba9257937012837618da594b644d60522a04b304 Mon Sep 17 00:00:00 2001 From: Rodrigo <rodrigo.bonilla@factorlibre.com> Date: Tue, 3 Oct 2023 13:44:31 +0200 Subject: [PATCH 08/10] [MIG] delivery_carrier_package_measure_required: Migration to 16.0" --- .../README.rst | 12 ++-- .../__manifest__.py | 4 +- .../models/__init__.py | 2 +- ...uct_packaging.py => stock_package_type.py} | 4 +- .../models/stock_quant_package.py | 8 +-- .../readme/DESCRIPTION.rst | 2 +- .../static/description/index.html | 9 ++- ...elivery_carrier_package_measure_require.py | 17 +++--- .../views/product_packaging.xml | 21 ------- .../views/stock_package_type_views.xml | 21 +++++++ .../wizard/choose_delivery_package.py | 58 +++++++++++++------ .../wizard/choose_delivery_package.xml | 12 ++-- 12 files changed, 97 insertions(+), 73 deletions(-) rename delivery_carrier_package_measure_required/models/{product_packaging.py => stock_package_type.py} (84%) delete mode 100644 delivery_carrier_package_measure_required/views/product_packaging.xml create mode 100644 delivery_carrier_package_measure_required/views/stock_package_type_views.xml diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst index 060b9db388..8cf92214e7 100644 --- a/delivery_carrier_package_measure_required/README.rst +++ b/delivery_carrier_package_measure_required/README.rst @@ -17,13 +17,13 @@ Delivery Carrier Package Measure Required :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github - :target: https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required + :target: https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required :alt: OCA/delivery-carrier .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required + :target: https://translation.odoo-community.org/projects/delivery-carrier-16-0/delivery-carrier-16-0-delivery_carrier_package_measure_required :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -32,7 +32,7 @@ This module adds the possibility to flag some measurements on package to be requ It depends on the `stock_quant_package_dimension` which adds more dimensions on packages. -The required measurement can be flagged on the product packaging. +The required measurement can be flagged on the package type. Then the dimension can be set on the wizard displayed by the Put In Pack button. @@ -49,7 +49,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/issues>`_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. +`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. Do not contact contributors directly about support or help with technical issues. @@ -79,6 +79,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required>`_ project on GitHub. +This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required>`_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py index fa9a340b1e..d6c81469b2 100644 --- a/delivery_carrier_package_measure_required/__manifest__.py +++ b/delivery_carrier_package_measure_required/__manifest__.py @@ -4,7 +4,7 @@ Allow the configuration of which package measurements are required on a delivery carrier basis. """, - "version": "14.0.1.0.2", + "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/delivery-carrier", @@ -15,7 +15,7 @@ "stock_quant_package_dimension", ], "data": [ - "views/product_packaging.xml", + "views/stock_package_type_views.xml", "wizard/choose_delivery_package.xml", ], "installable": True, diff --git a/delivery_carrier_package_measure_required/models/__init__.py b/delivery_carrier_package_measure_required/models/__init__.py index cb7177dedf..2f66e4bb1d 100644 --- a/delivery_carrier_package_measure_required/models/__init__.py +++ b/delivery_carrier_package_measure_required/models/__init__.py @@ -1,3 +1,3 @@ -from . import product_packaging +from . import stock_package_type from . import stock_picking from . import stock_quant_package diff --git a/delivery_carrier_package_measure_required/models/product_packaging.py b/delivery_carrier_package_measure_required/models/stock_package_type.py similarity index 84% rename from delivery_carrier_package_measure_required/models/product_packaging.py rename to delivery_carrier_package_measure_required/models/stock_package_type.py index 127d8bd8b5..a63d7afdc7 100644 --- a/delivery_carrier_package_measure_required/models/product_packaging.py +++ b/delivery_carrier_package_measure_required/models/stock_package_type.py @@ -4,8 +4,8 @@ from odoo import fields, models -class ProductPackaging(models.Model): - _inherit = "product.packaging" +class StockPackageType(models.Model): + _inherit = "stock.package.type" package_height_required = fields.Boolean(string="Height required") package_length_required = fields.Boolean(string="Length required") diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py index eb966891c6..c3ebdb3582 100644 --- a/delivery_carrier_package_measure_required/models/stock_quant_package.py +++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py @@ -8,10 +8,10 @@ class StockQuantPackage(models.Model): _inherit = "stock.quant.package" - length_required = fields.Boolean(related="packaging_id.package_length_required") - width_required = fields.Boolean(related="packaging_id.package_width_required") - height_required = fields.Boolean(related="packaging_id.package_height_required") - weight_required = fields.Boolean(related="packaging_id.package_weight_required") + length_required = fields.Boolean(related="package_type_id.package_length_required") + width_required = fields.Boolean(related="package_type_id.package_width_required") + height_required = fields.Boolean(related="package_type_id.package_height_required") + weight_required = fields.Boolean(related="package_type_id.package_weight_required") # The boolean field use to check if a dimension is required are intentionally left out. # To not raise error when changing packaging configuration. diff --git a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst index 51666e8352..e2db95e6c3 100644 --- a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst +++ b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst @@ -2,7 +2,7 @@ This module adds the possibility to flag some measurements on package to be requ It depends on the `stock_quant_package_dimension` which adds more dimensions on packages. -The required measurement can be flagged on the product packaging. +The required measurement can be flagged on the package type. Then the dimension can be set on the wizard displayed by the Put In Pack button. diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html index eb7d0c4595..6c4be40020 100644 --- a/delivery_carrier_package_measure_required/static/description/index.html +++ b/delivery_carrier_package_measure_required/static/description/index.html @@ -1,4 +1,3 @@ -<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> @@ -369,10 +368,10 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p> +<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-16-0/delivery-carrier-16-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p> <p>This module adds the possibility to flag some measurements on package to be required for delivery.</p> <p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p> -<p>The required measurement can be flagged on the product packaging.</p> +<p>The required measurement can be flagged on the package type.</p> <p>Then the dimension can be set on the wizard displayed by the Put In Pack button.</p> <p>A check is also done on transfer validation, to ensure that the required measurements are set.</p> <p><strong>Table of contents</strong></p> @@ -392,7 +391,7 @@ <h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1> <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> +<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> <p>Do not contact contributors directly about support or help with technical issues.</p> </div> <div class="section" id="credits"> @@ -416,7 +415,7 @@ <h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2> <p>OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.</p> -<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p> +<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p> <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> </div> </div> diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py index 0057beb5e5..10defee53d 100644 --- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py +++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py @@ -12,7 +12,7 @@ class TestDeliveryCarrierPackageMeasureRequire(TestPackingCommon): def setUpClass(cls): super().setUpClass() cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) - cls.normal_carrier = cls.env.ref("delivery.normal_delivery_carrier") + cls.normal_carrier = cls.env.ref("delivery.free_delivery_carrier") cls.uom_kg = cls.env.ref("uom.product_uom_kgm") cls.product_aw = cls.env["product.product"].create( { @@ -23,7 +23,7 @@ def setUpClass(cls): "uom_po_id": cls.uom_kg.id, } ) - cls.packaging = cls.env["product.packaging"].create( + cls.packaging = cls.env["stock.package.type"].create( {"name": "Test Delivery Packaging"} ) cls.env["stock.quant"]._update_available_quantity( @@ -38,12 +38,13 @@ def setUpClass(cls): "carrier_id": cls.normal_carrier.id, } ) - cls.env["stock.move.line"].create( + cls.env["stock.move"].create( { + "name": cls.product_aw.name, "product_id": cls.product_aw.id, - "product_uom_id": cls.uom_kg.id, + "product_uom_qty": 5, + "product_uom": cls.uom_kg.id, "picking_id": cls.pick.id, - "qty_done": 5, "location_id": cls.stock_location.id, "location_dest_id": cls.customer_location.id, } @@ -58,14 +59,16 @@ def setUpClass(cls): ) pack_wiz.action_put_in_pack() cls.package = cls.pick.move_line_ids.mapped("result_package_id") - cls.package.packaging_id = cls.packaging + cls.package.package_type_id = cls.packaging def test_force_check_required_measurement(self): self.packaging.package_length_required = True # Picking is not done no validation error self.pick._check_required_package_measurement() # Force validation error raised - pick = self.pick.with_context(delivery_pkg_measure__ignore_package_content=True) + pick = self.pick.with_context( + delivery_pkg_measure__force_validation_package=True + ) with self.assertRaises(ValidationError): pick.button_validate() diff --git a/delivery_carrier_package_measure_required/views/product_packaging.xml b/delivery_carrier_package_measure_required/views/product_packaging.xml deleted file mode 100644 index 12dbe65106..0000000000 --- a/delivery_carrier_package_measure_required/views/product_packaging.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<odoo> - <record id="view_product_packaging_delivery_form_inherit" model="ir.ui.view"> - <field name="name">product.packaging.form.delivery</field> - <field name="model">product.packaging</field> - <field name="inherit_id" ref="delivery.product_packaging_delivery_form" /> - <field name="arch" type="xml"> - <xpath expr="//group[@name='delivery']" position="inside"> - <group - name="carrier_required_mesaurement" - string="Carrier Required Measurements" - > - <field name="package_length_required" /> - <field name="package_width_required" /> - <field name="package_height_required" /> - <field name="package_weight_required" /> - </group> - </xpath> - </field> - </record> -</odoo> diff --git a/delivery_carrier_package_measure_required/views/stock_package_type_views.xml b/delivery_carrier_package_measure_required/views/stock_package_type_views.xml new file mode 100644 index 0000000000..0431ecd9e9 --- /dev/null +++ b/delivery_carrier_package_measure_required/views/stock_package_type_views.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<odoo> + <record id="view_stock_package_type_form_delivery_inherit" model="ir.ui.view"> + <field name="name">stock.package.type.form.delivery</field> + <field name="model">stock.package.type</field> + <field name="inherit_id" ref="delivery.stock_package_type_form_delivery" /> + <field name="arch" type="xml"> + <xpath expr="//group[@name='delivery']" position="inside"> + <group + name="carrier_required_mesaurement" + string="Carrier Required Measurements" + > + <field name="package_length_required" /> + <field name="package_width_required" /> + <field name="package_height_required" /> + <field name="package_weight_required" /> + </group> + </xpath> + </field> + </record> +</odoo> diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py index 5f57f828e2..6c78a2fc5b 100644 --- a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py +++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py @@ -1,35 +1,57 @@ # Copyright 2022 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models +from odoo import api, fields, models class ChooseDeliveryPackage(models.TransientModel): _inherit = "choose.delivery.package" - pick_name = fields.Char(related="picking_id.name") + @api.depends("delivery_package_type_id") + def _compute_dimension_uom_name(self): + length_uom_id = self.env[ + "product.template" + ]._get_length_uom_id_from_ir_config_parameter() + for package in self: + package.dimension_uom_name = length_uom_id.name - def _default_dimension_uom_id(self): - val = self.env["product.template"]._get_length_uom_id_from_ir_config_parameter() - return val + @api.depends("delivery_package_type_id") + def _compute_dimension(self): + for package in self: + package.package_length = ( + package.delivery_package_type_id.packaging_length or 0 + ) + package.package_width = package.delivery_package_type_id.width or 0 + package.package_height = package.delivery_package_type_id.height or 0 - package_height = fields.Integer() - package_length = fields.Integer() - package_width = fields.Integer() - dimension_uom_id = fields.Many2one( - "uom.uom", - default=lambda self: self._default_dimension_uom_id(), + package_length = fields.Integer( + compute="_compute_dimension", store=True, readonly=False ) - dimension_uom_name = fields.Char(related="dimension_uom_id.name") + package_width = fields.Integer( + compute="_compute_dimension", store=True, readonly=False + ) + package_height = fields.Integer( + compute="_compute_dimension", store=True, readonly=False + ) + dimension_uom_name = fields.Char(compute="_compute_dimension_uom_name") package_height_required = fields.Boolean( - related="delivery_packaging_id.package_height_required" + related="delivery_package_type_id.package_height_required" ) package_length_required = fields.Boolean( - related="delivery_packaging_id.package_length_required" - ) - package_weight_required = fields.Boolean( - related="delivery_packaging_id.package_weight_required" + related="delivery_package_type_id.package_length_required" ) package_width_required = fields.Boolean( - related="delivery_packaging_id.package_width_required" + related="delivery_package_type_id.package_width_required" ) + package_weight_required = fields.Boolean( + related="delivery_package_type_id.package_weight_required" + ) + + def action_put_in_pack(self): + self = self.with_context( + choose_delivery_package_length=self.package_length, + choose_delivery_package_width=self.package_width, + choose_delivery_package_height=self.package_height, + choose_delivery_package_pack_weight=self.shipping_weight, + ) + return super().action_put_in_pack() diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml index 86b74b5f74..d31f38ef1d 100644 --- a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml +++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml @@ -13,11 +13,11 @@ <field name="package_width_required" invisible="1" /> <label for="package_length" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_length_required', '=', False)]}" /> <div class="o_row" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_length_required', '=', False)]}" name="package_length" > <field name="package_length" /> @@ -25,11 +25,11 @@ </div> <label for="package_width" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_width_required', '=', False)]}" /> <div class="o_row" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_width_required', '=', False)]}" name="package_width" > <field name="package_width" /> @@ -37,11 +37,11 @@ </div> <label for="package_height" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_height_required', '=', False)]}" /> <div class="o_row" - attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}" + attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_height_required', '=', False)]}" name="package_height" > <field name="package_height" /> From 9d544d6b598ae0c026295e859b91af2b3ff7046a Mon Sep 17 00:00:00 2001 From: Rodrigo <rodrigo.bonilla@factorlibre.com> Date: Wed, 22 May 2024 15:32:59 +0200 Subject: [PATCH 09/10] [IMP] delivery_carrier_package_measure_required: put in pack add measures to package when you add producto to pack. --- .../models/stock_picking.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/delivery_carrier_package_measure_required/models/stock_picking.py b/delivery_carrier_package_measure_required/models/stock_picking.py index 0654c14b43..2adc07ed75 100644 --- a/delivery_carrier_package_measure_required/models/stock_picking.py +++ b/delivery_carrier_package_measure_required/models/stock_picking.py @@ -8,14 +8,30 @@ class StockPicking(models.Model): _inherit = "stock.picking" def _check_required_package_measurement(self): - """Check the required measurement on destination pacakges. - - If package is None all result packages on the stock pickings are checked - otherwise only the one - """ + """Check the required measurement on destination pacakges.""" packages = self.move_line_ids.mapped("result_package_id") packages._check_required_dimension() def button_validate(self): self._check_required_package_measurement() return super().button_validate() + + def _put_in_pack(self, move_line_ids, create_package_level=True): + res = super()._put_in_pack( + move_line_ids, create_package_level=create_package_level + ) + package_length = self._context.get("choose_delivery_package_length", 0) + package_width = self._context.get("choose_delivery_package_width", 0) + package_height = self._context.get("choose_delivery_package_height", 0) + package_weight = self._context.get("choose_delivery_package_pack_weight", 0) + + res.write( + { + "pack_length": package_length, + "width": package_width, + "height": package_height, + "pack_weight": package_weight, + } + ) + + return res From dbe2017244c226602b72b326a57e8b0eb562344f Mon Sep 17 00:00:00 2001 From: Rodrigo <rodrigo.bonilla@factorlibre.com> Date: Thu, 30 May 2024 09:32:37 +0200 Subject: [PATCH 10/10] [IMP] delivery_carrier_package_measure_required: dimension control exceptions greater granularity is implemented to control possible dimension control exceptions. --- .../models/stock_quant_package.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py index c3ebdb3582..107fac8bce 100644 --- a/delivery_carrier_package_measure_required/models/stock_quant_package.py +++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py @@ -18,10 +18,13 @@ class StockQuantPackage(models.Model): @api.constrains("pack_length", "width", "height", "shipping_weight", "quant_ids") def _check_required_dimension(self): ignore_pack_content = self.env.context.get( - "delivery_pkg_measure__ignore_package_content" + "delivery_pkg_measure__ignore_package_content", False + ) + force_validation = self.env.context.get( + "delivery_pkg_measure__force_validation_package", False ) for package in self: - if not ignore_pack_content and not package.quant_ids: + if ignore_pack_content or (not force_validation and not package.quant_ids): # Only validate a package when it contains goods continue required_dimension = []