From c02d71cbcd6ca9a449341a11167b8b0313438f81 Mon Sep 17 00:00:00 2001 From: hapt-odoo Date: Mon, 30 Jun 2025 18:29:52 +0530 Subject: [PATCH 1/4] [ADD] new_producttype: created wizard in sale.order,line and created new fields In the new_producttype module created in the product form to add sub-products field in specific products and in sale.order.line added a button in that by clicking on it, created a wizard of sub_product linked with the main product. --- new_producttype/__init__.py | 2 ++ new_producttype/__manifest__.py | 16 ++++++++++++ new_producttype/models/__init__.py | 2 ++ new_producttype/models/product_template.py | 25 +++++++++++++++++++ new_producttype/models/sale_order_line.py | 22 ++++++++++++++++ new_producttype/security/ir.model.access.csv | 3 +++ new_producttype/views/product_views.xml | 14 +++++++++++ new_producttype/views/sale_order_view.xml | 17 +++++++++++++ new_producttype/wizard/__init__.py | 2 ++ .../wizard/sub_product_kit_wizard.py | 11 ++++++++ .../wizard/sub_product_kit_wizard_view.xml | 24 ++++++++++++++++++ .../wizard/sub_product_line_kit_wizard.py | 10 ++++++++ 12 files changed, 148 insertions(+) create mode 100644 new_producttype/__init__.py create mode 100644 new_producttype/__manifest__.py create mode 100644 new_producttype/models/__init__.py create mode 100644 new_producttype/models/product_template.py create mode 100644 new_producttype/models/sale_order_line.py create mode 100644 new_producttype/security/ir.model.access.csv create mode 100644 new_producttype/views/product_views.xml create mode 100644 new_producttype/views/sale_order_view.xml create mode 100644 new_producttype/wizard/__init__.py create mode 100644 new_producttype/wizard/sub_product_kit_wizard.py create mode 100644 new_producttype/wizard/sub_product_kit_wizard_view.xml create mode 100644 new_producttype/wizard/sub_product_line_kit_wizard.py diff --git a/new_producttype/__init__.py b/new_producttype/__init__.py new file mode 100644 index 00000000000..9b4296142f4 --- /dev/null +++ b/new_producttype/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/new_producttype/__manifest__.py b/new_producttype/__manifest__.py new file mode 100644 index 00000000000..7595c7562ec --- /dev/null +++ b/new_producttype/__manifest__.py @@ -0,0 +1,16 @@ +{ + 'name': "New Product Type", + 'category': '', + 'version': '0.1', + 'depends': ['sale'], + 'sequence': 1, + 'application': True, + 'installable': True, + 'data': [ + 'security/ir.model.access.csv', + "wizard/sub_product_kit_wizard_view.xml", + "views/product_views.xml", + "views/sale_order_view.xml", + ], + 'license': 'AGPL-3' +} diff --git a/new_producttype/models/__init__.py b/new_producttype/models/__init__.py new file mode 100644 index 00000000000..83527162d00 --- /dev/null +++ b/new_producttype/models/__init__.py @@ -0,0 +1,2 @@ +from . import product_template +from . import sale_order_line diff --git a/new_producttype/models/product_template.py b/new_producttype/models/product_template.py new file mode 100644 index 00000000000..f1ec80566f9 --- /dev/null +++ b/new_producttype/models/product_template.py @@ -0,0 +1,25 @@ +from odoo import fields, models, api +from odoo.exceptions import ValidationError + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_kit = fields.Boolean(default=False, string='Is kit') + sub_products_ids = fields.Many2many('product.product', string='Sub products') + + @api.constrains("sub_products_ids") + def check_sub_product_not_itself(self): + for record in self: + if record.id in record.sub_products_ids.mapped("product_tmpl_id.id"): + raise ValidationError( + "A product cannot be added as its own sub-product" + ) + + @api.constrains("sub_products_ids", "is_kit") + def check_sub_product(self): + for record in self: + if record.is_kit and not record.sub_products_ids: + raise ValidationError( + "A kit product must have at least one sub-product" + ) diff --git a/new_producttype/models/sale_order_line.py b/new_producttype/models/sale_order_line.py new file mode 100644 index 00000000000..e30416582cb --- /dev/null +++ b/new_producttype/models/sale_order_line.py @@ -0,0 +1,22 @@ +from odoo import fields, models + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + is_kit = fields.Boolean(string='Is kit', related='product_id.is_kit') + parent_line_id = fields.Many2one("sale.order.line", ondelete="cascade") + sub_products_ids = fields.Many2many( + "product.product", + related="product_template_id.sub_products_ids", + string="Sub Products", + ) + + def action_open_kit_wizard(self): + return { + 'type': 'ir.actions.act_window', + 'name': 'sub.product.kit.wizard.view', + 'res_model': 'sub.product.kit.wizard', + 'view_mode': 'form', + 'target': 'new', + } diff --git a/new_producttype/security/ir.model.access.csv b/new_producttype/security/ir.model.access.csv new file mode 100644 index 00000000000..2ec380ca018 --- /dev/null +++ b/new_producttype/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_sub_product_kit_wizard,access_sub_product_kit_wizard,model_sub_product_kit_wizard,base.group_user,1,1,1,1 +access_sub_product_line_kit_wizard,access_sub_product_line_kit_wizard,model_sub_product_line_kit_wizard,base.group_user,1,1,1,1 diff --git a/new_producttype/views/product_views.xml b/new_producttype/views/product_views.xml new file mode 100644 index 00000000000..2924bde217e --- /dev/null +++ b/new_producttype/views/product_views.xml @@ -0,0 +1,14 @@ + + + + product.template.form.view.inherit + product.template + + + + + + + + + diff --git a/new_producttype/views/sale_order_view.xml b/new_producttype/views/sale_order_view.xml new file mode 100644 index 00000000000..ab9dd32a3a6 --- /dev/null +++ b/new_producttype/views/sale_order_view.xml @@ -0,0 +1,17 @@ + + + + view.order.form.inherit.sub.product + sale.order + + + +