diff --git a/product_packaging_type/README.rst b/product_packaging_type/README.rst new file mode 100644 index 000000000000..07d23964ef6f --- /dev/null +++ b/product_packaging_type/README.rst @@ -0,0 +1,91 @@ +====================== +Product Packaging Type +====================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproduct--attribute-lightgray.png?logo=github + :target: https://github.com/OCA/product-attribute/tree/14.0/product_packaging_type + :alt: OCA/product-attribute +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/product-attribute-14-0/product-attribute-14-0-product_packaging_type + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/135/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows odoo users to declare packaging types + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To create a new packaging type: + +#. Go to *Sales > Configuration > Products > Product Packaging Type*. +#. You can create/edit/delete packaging types + +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* `Camptocamp `_ + + * Damien Crier + * Hiep (Nguyen Hoang) + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Camptocamp + +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/product-attribute `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_packaging_type/__init__.py b/product_packaging_type/__init__.py new file mode 100644 index 000000000000..0650744f6bc6 --- /dev/null +++ b/product_packaging_type/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/product_packaging_type/__manifest__.py b/product_packaging_type/__manifest__.py new file mode 100644 index 000000000000..9be991d4f107 --- /dev/null +++ b/product_packaging_type/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2019-2020 Camptocamp (). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +{ + "name": "Product Packaging Type", + "version": "14.0.0.1.0", + "development_status": "Beta", + "category": "Product", + "summary": "Product Packaging Type", + "author": "Camptocamp, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/product-attribute", + "license": "LGPL-3", + "depends": ["product", "stock"], + "data": [ + "data/product_packaging_type.xml", + "security/ir.model.access.csv", + "views/product_packaging_type_view.xml", + "views/product_packaging_view.xml", + ], + "installable": True, + "auto_install": False, +} diff --git a/product_packaging_type/data/product_packaging_type.xml b/product_packaging_type/data/product_packaging_type.xml new file mode 100644 index 000000000000..aec1d77bde3b --- /dev/null +++ b/product_packaging_type/data/product_packaging_type.xml @@ -0,0 +1,9 @@ + + + + Default Type + DEFAULT + 1 + + + diff --git a/product_packaging_type/i18n/es.po b/product_packaging_type/i18n/es.po new file mode 100644 index 000000000000..7d8a078e8ac0 --- /dev/null +++ b/product_packaging_type/i18n/es.po @@ -0,0 +1,158 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_packaging_type +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-10-14 14:08+0000\n" +"Last-Translator: claudiagn \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 3.10\n" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__active +msgid "Active" +msgstr "Activo" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__barcode_required_for_gtin +msgid "Barcode Required For Gtin" +msgstr "Código de barras obligatorio para Gtin" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__code +msgid "Code" +msgstr "Código" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: product_packaging_type +#: model:product.packaging.type,name:product_packaging_type.product_packaging_type_default +msgid "Default Type" +msgstr "Tipo predeterminado" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__has_gtin +msgid "Has Gtin" +msgstr "Tiene Gtin" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__id +msgid "ID" +msgstr "ID" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__is_default +msgid "Is Default" +msgstr "Es predeterminado" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "" +"It is forbidden to have different packagings with the same type for a given " +"product ({})." +msgstr "" +"Está prohibido tener diferentes embalajes con el mismo tipo para un producto " +"determinado ({})." + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__name +msgid "Name" +msgstr "Nombre" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "Only one product packaging type can be set as \"Is Default\"." +msgstr "" +"Solo se puede establecer un tipo de empaque de producto como \"" +"Predeterminado\"." + +#. module: product_packaging_type +#: model_terms:ir.ui.view,arch_db:product_packaging_type.product_packaging_tree_view_inherit +msgid "Packaging" +msgstr "Empaquetado" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__packaging_type_id +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_form +msgid "Packaging Type" +msgstr "Tipo de empaquetado" + +#. module: product_packaging_type +#: model:ir.model,name:product_packaging_type.model_product_packaging +msgid "Product Packaging" +msgstr "Empaquetado de producto" + +#. module: product_packaging_type +#: model:ir.actions.act_window,name:product_packaging_type.act_open_product_packaging_type_view +#: model:ir.ui.menu,name:product_packaging_type.menu_product_packaging_type +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_form +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_search +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_tree +msgid "Product Packaging Type" +msgstr "Tipo de empaquetado de producto" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__qty_per_type +msgid "Qty per package type" +msgstr "Cantidad por tipo de paquete" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "There must be one product packaging type set as \"Is Default\"." +msgstr "" +"Debe haber un tipo de empaque de producto establecido como \"Es " +"predeterminado\"." + +#. module: product_packaging_type +#: model:ir.model,name:product_packaging_type.model_product_packaging_type +msgid "Type management for product.packaging" +msgstr "Tipo de administración para empaquetado de producto" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__type_sequence +msgid "Type sequence" +msgstr "Tipo de secuencia" diff --git a/product_packaging_type/i18n/product_packaging_type.pot b/product_packaging_type/i18n/product_packaging_type.pot new file mode 100644 index 000000000000..820e21a5551e --- /dev/null +++ b/product_packaging_type/i18n/product_packaging_type.pot @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_packaging_type +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__active +msgid "Active" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__barcode_required_for_gtin +msgid "Barcode Required For Gtin" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__code +msgid "Code" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__create_uid +msgid "Created by" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__create_date +msgid "Created on" +msgstr "" + +#. module: product_packaging_type +#: model:product.packaging.type,name:product_packaging_type.product_packaging_type_default +msgid "Default Type" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__display_name +msgid "Display Name" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__has_gtin +msgid "Has Gtin" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__id +msgid "ID" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__is_default +msgid "Is Default" +msgstr "" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "" +"It is forbidden to have different packagings with the same type for a given " +"product ({})." +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type____last_update +msgid "Last Modified on" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__write_date +msgid "Last Updated on" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__name +msgid "Name" +msgstr "" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "Only one product packaging type can be set as \"Is Default\"." +msgstr "" + +#. module: product_packaging_type +#: model_terms:ir.ui.view,arch_db:product_packaging_type.product_packaging_tree_view_inherit +msgid "Packaging" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__packaging_type_id +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_form +msgid "Packaging Type" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model,name:product_packaging_type.model_product_packaging +msgid "Product Packaging" +msgstr "" + +#. module: product_packaging_type +#: model:ir.actions.act_window,name:product_packaging_type.act_open_product_packaging_type_view +#: model:ir.ui.menu,name:product_packaging_type.menu_product_packaging_type +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_form +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_search +#: model_terms:ir.ui.view,arch_db:product_packaging_type.view_product_packaging_type_tree +msgid "Product Packaging Type" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__qty_per_type +msgid "Qty per package type" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging_type__sequence +msgid "Sequence" +msgstr "" + +#. module: product_packaging_type +#: code:addons/product_packaging_type/models/product_packaging_type.py:0 +#, python-format +msgid "There must be one product packaging type set as \"Is Default\"." +msgstr "" + +#. module: product_packaging_type +#: model:ir.model,name:product_packaging_type.model_product_packaging_type +msgid "Type management for product.packaging" +msgstr "" + +#. module: product_packaging_type +#: model:ir.model.fields,field_description:product_packaging_type.field_product_packaging__type_sequence +msgid "Type sequence" +msgstr "" diff --git a/product_packaging_type/models/__init__.py b/product_packaging_type/models/__init__.py new file mode 100644 index 000000000000..643870a78dff --- /dev/null +++ b/product_packaging_type/models/__init__.py @@ -0,0 +1 @@ +from . import product_packaging_type diff --git a/product_packaging_type/models/product_packaging_type.py b/product_packaging_type/models/product_packaging_type.py new file mode 100644 index 000000000000..ca33f6ba8ca5 --- /dev/null +++ b/product_packaging_type/models/product_packaging_type.py @@ -0,0 +1,144 @@ +# Copyright 2019-2020 Camptocamp (). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) +from collections import OrderedDict + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ProductPackagingType(models.Model): + _name = "product.packaging.type" + _description = "Type management for product.packaging" + _order = "sequence, code" + + name = fields.Char(required=True, translate=True) + code = fields.Char(required=True) + sequence = fields.Integer(required=True) + has_gtin = fields.Boolean() + active = fields.Boolean(default=True) + is_default = fields.Boolean() + + @api.constrains("is_default") + def _check_is_default(self): + msg = False + default_count = self.search_count([("is_default", "=", True)]) + if default_count == 0: + msg = _('There must be one product packaging type set as "Is Default".') + elif default_count > 1: + msg = _('Only one product packaging type can be set as "Is Default".') + if msg: + raise ValidationError(msg) + + def name_get(self): + result = [] + for record in self: + result.append((record.id, "{} ({})".format(record.name, record.code))) + return result + + +class ProductPackaging(models.Model): + _inherit = "product.packaging" + _order = "product_id, type_sequence" + + def default_packaging_type_id(self): + return self.env["product.packaging.type"].search( + [("is_default", "=", True)], limit=1 + ) + + packaging_type_id = fields.Many2one( + "product.packaging.type", + required=True, + ondelete="restrict", + default=lambda p: p.default_packaging_type_id(), + ) + barcode_required_for_gtin = fields.Boolean( + readonly=True, compute="_compute_barcode_required_for_gtin" + ) + type_sequence = fields.Integer( + string="Type sequence", + related="packaging_type_id.sequence", + readonly=True, + store=True, + ) + qty_per_type = fields.Html( + compute="_compute_qty_per_type", string="Qty per package type" + ) + + @api.constrains("packaging_type_id", "product_id") + def _check_one_packaging_type_per_product(self): + for packaging in self: + product = packaging.product_id + # do not use a mapped/filtered because it would union the duplicates + packaging_type_ids = [ + packaging.packaging_type_id.id + for packaging in product.packaging_ids + # We have to allow several packaging using the default type, + # because when we install the module on an existing database, + # the default value will be set to default and we'll have + # duplicates. Anyway "default" is not meant to be used as a + # real type. + if not packaging.packaging_type_id.is_default + ] + if len(set(packaging_type_ids)) != len(packaging_type_ids): + raise ValidationError( + _( + "It is forbidden to have different packagings " + "with the same type for a given product ({})." + ).format(product.display_name) + ) + + @api.depends("packaging_type_id", "packaging_type_id.has_gtin", "qty") + def _compute_barcode_required_for_gtin(self): + for packaging in self: + packaging.barcode_required_for_gtin = packaging.packaging_type_id.has_gtin + if not packaging.qty: + packaging.barcode_required_for_gtin = False + + @api.depends( + "product_id", + "product_id.packaging_ids", + "packaging_type_id", + "packaging_type_id.code", + ) + def _compute_qty_per_type(self): + for packaging in self: + product = packaging.product_id + if not product: + packaging.qty_per_type = "" + continue + + smaller_product_packagings = product.packaging_ids.filtered( + lambda p: p.id != packaging.id and packaging.qty > p.qty > 0.0 + ) + res = OrderedDict() + for p_pack in smaller_product_packagings.sorted(lambda p: p.qty): + res[p_pack.packaging_type_id.code] = p_pack.qty + packaging.qty_per_type = packaging._format_qty_per_type(res) + + def _format_qty_per_type(self, qty_per_type_dict): + self.ensure_one() + res = [] + for code, qty in qty_per_type_dict.items(): + new_qty = self.qty / qty + if not new_qty.is_integer(): + new_qty_int = int(new_qty) + new_qty_decimals = new_qty - new_qty_int + new_qty = '{}{}'.format( + new_qty_int, str(new_qty_decimals).lstrip("0") + ) + res.append("{} {}".format(new_qty, code)) + return "; ".join(res) + + @api.onchange("packaging_type_id") + def _onchange_name(self): + if self.packaging_type_id: + self.name = self.packaging_type_id.name + + def name_get(self): + result = [] + for record in self: + if record.product_id and record.packaging_type_id: + result.append((record.id, record.packaging_type_id.display_name)) + else: + result.append((record.id, record.name)) + return result diff --git a/product_packaging_type/readme/CONTRIBUTORS.rst b/product_packaging_type/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..c886be798cca --- /dev/null +++ b/product_packaging_type/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Camptocamp `_ + + * Damien Crier + * Hiep (Nguyen Hoang) diff --git a/product_packaging_type/readme/CREDITS.rst b/product_packaging_type/readme/CREDITS.rst new file mode 100644 index 000000000000..f5cc070c78ea --- /dev/null +++ b/product_packaging_type/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Camptocamp diff --git a/product_packaging_type/readme/DESCRIPTION.rst b/product_packaging_type/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..ef1a4cf03a42 --- /dev/null +++ b/product_packaging_type/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows odoo users to declare packaging types diff --git a/product_packaging_type/readme/USAGE.rst b/product_packaging_type/readme/USAGE.rst new file mode 100644 index 000000000000..c8fb954fb99a --- /dev/null +++ b/product_packaging_type/readme/USAGE.rst @@ -0,0 +1,4 @@ +To create a new packaging type: + +#. Go to *Sales > Configuration > Products > Product Packaging Type*. +#. You can create/edit/delete packaging types diff --git a/product_packaging_type/security/ir.model.access.csv b/product_packaging_type/security/ir.model.access.csv new file mode 100644 index 000000000000..a14a57604325 --- /dev/null +++ b/product_packaging_type/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +access_product_packaging_type_user,product.packaging.type.user,model_product_packaging_type,base.group_user,1,0,0,0 +access_product_packaging_type_manager,product.packaging.type.manager,model_product_packaging_type,product.group_stock_packaging,1,1,1,1 diff --git a/product_packaging_type/static/description/icon.png b/product_packaging_type/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/product_packaging_type/static/description/icon.png differ diff --git a/product_packaging_type/static/description/index.html b/product_packaging_type/static/description/index.html new file mode 100644 index 000000000000..94625b154a96 --- /dev/null +++ b/product_packaging_type/static/description/index.html @@ -0,0 +1,440 @@ + + + + + + +Product Packaging Type + + + +
+

Product Packaging Type

+ + +

Beta License: LGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runbot

+

This module allows odoo users to declare packaging types

+

Table of contents

+ +
+

Usage

+

To create a new packaging type:

+
    +
  1. Go to Sales > Configuration > Products > Product Packaging Type.
  2. +
  3. You can create/edit/delete packaging types
  4. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub 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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+
    +
  • Camptocamp
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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/product-attribute project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/product_packaging_type/views/product_packaging_type_view.xml b/product_packaging_type/views/product_packaging_type_view.xml new file mode 100644 index 000000000000..00af2068ee4d --- /dev/null +++ b/product_packaging_type/views/product_packaging_type_view.xml @@ -0,0 +1,67 @@ + + + + product.packaging.type.tree + product.packaging.type + + + + + + + + + + + + + product.packaging.type.form + product.packaging.type + + +
+ + +
+
+
+ + product.packaging.type.search + product.packaging.type + + + + + + + + + + Product Packaging Type + ir.actions.act_window + product.packaging.type + tree,form + + + +
diff --git a/product_packaging_type/views/product_packaging_view.xml b/product_packaging_type/views/product_packaging_view.xml new file mode 100644 index 000000000000..99f332868afd --- /dev/null +++ b/product_packaging_type/views/product_packaging_view.xml @@ -0,0 +1,43 @@ + + + + product.packaging.form + product.packaging + + + + + + + + + + {'required': [('barcode_required_for_gtin', '=', True)]} + + + 1 + + + + + + + + product.packaging.tree.view.inherit + product.packaging + + + + + + + 1 + + + + + + + diff --git a/setup/product_packaging_type/odoo/addons/product_packaging_type b/setup/product_packaging_type/odoo/addons/product_packaging_type new file mode 120000 index 000000000000..1e405db9efea --- /dev/null +++ b/setup/product_packaging_type/odoo/addons/product_packaging_type @@ -0,0 +1 @@ +../../../../product_packaging_type \ No newline at end of file diff --git a/setup/product_packaging_type/setup.py b/setup/product_packaging_type/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/product_packaging_type/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)