From 6ddd999faf2dcc9c43ac8944b1da3a0c839eebc7 Mon Sep 17 00:00:00 2001 From: haman-odoo Date: Fri, 2 Jan 2026 19:09:47 +0530 Subject: [PATCH 1/4] [ADD] modular_types: Added modular types on products, BOM lines and sales order Add modular types(m2m field) on product form Add m20 field 'modular_type_id' in BoM form Add flask button to product for atleast one modular type on sale order form task-5454990 --- .gitignore | 7 +++++++ modular_types/__init__.py | 1 + modular_types/__manifest__.py | 15 +++++++++++++++ modular_types/models/__init__.py | 5 +++++ modular_types/models/modular_type.py | 8 ++++++++ modular_types/models/mrp_bom.py | 14 ++++++++++++++ modular_types/models/product_template.py | 7 +++++++ modular_types/models/sale_order_line.py | 15 +++++++++++++++ .../sale_order_line_modular_type_value.py | 10 ++++++++++ modular_types/security/ir.model.access.csv | 3 +++ modular_types/views/mrp_bom_views.xml | 13 +++++++++++++ modular_types/views/product_views.xml | 13 +++++++++++++ modular_types/views/sale_order_views.xml | 18 ++++++++++++++++++ 13 files changed, 129 insertions(+) create mode 100644 modular_types/__init__.py create mode 100644 modular_types/__manifest__.py create mode 100644 modular_types/models/__init__.py create mode 100644 modular_types/models/modular_type.py create mode 100644 modular_types/models/mrp_bom.py create mode 100644 modular_types/models/product_template.py create mode 100644 modular_types/models/sale_order_line.py create mode 100644 modular_types/models/sale_order_line_modular_type_value.py create mode 100644 modular_types/security/ir.model.access.csv create mode 100644 modular_types/views/mrp_bom_views.xml create mode 100644 modular_types/views/product_views.xml create mode 100644 modular_types/views/sale_order_views.xml diff --git a/.gitignore b/.gitignore index b6e47617de1..f79670dfc2e 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,10 @@ dmypy.json # Pyre type checker .pyre/ + +node_modules +.eslintignore +.eslintrc.json +jsconfig.json +package-lock.json +package.json diff --git a/modular_types/__init__.py b/modular_types/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/modular_types/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/modular_types/__manifest__.py b/modular_types/__manifest__.py new file mode 100644 index 00000000000..f705c264641 --- /dev/null +++ b/modular_types/__manifest__.py @@ -0,0 +1,15 @@ +{ + 'name': 'Modular Types', + 'version': '1.0', + 'category': 'Manufacturing', + 'author': 'haman', + 'depends': ['product', 'mrp', 'sale_management'], + 'license': 'LGPL-3', + 'data': [ + 'security/ir.model.access.csv', + 'views/product_views.xml', + 'views/mrp_bom_views.xml', + 'views/sale_order_views.xml', + ], + 'installable': True, +} diff --git a/modular_types/models/__init__.py b/modular_types/models/__init__.py new file mode 100644 index 00000000000..416ad66b6cb --- /dev/null +++ b/modular_types/models/__init__.py @@ -0,0 +1,5 @@ +from . import modular_type +from . import mrp_bom +from . import product_template +from . import sale_order_line +from . import sale_order_line_modular_type_value diff --git a/modular_types/models/modular_type.py b/modular_types/models/modular_type.py new file mode 100644 index 00000000000..d60b905094b --- /dev/null +++ b/modular_types/models/modular_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class ModularType(models.Model): + _name = 'modular.type' + _description = 'Modular Type' + + name = fields.Char(required=True) diff --git a/modular_types/models/mrp_bom.py b/modular_types/models/mrp_bom.py new file mode 100644 index 00000000000..09487393771 --- /dev/null +++ b/modular_types/models/mrp_bom.py @@ -0,0 +1,14 @@ +from odoo import api, fields, models + + +class MrpBomLine(models.Model): + _inherit = 'mrp.bom.line' + + modular_type_id = fields.Many2one('modular.type', domain="[('id', 'in', available_modular_type_ids)]") + + available_modular_type_ids = fields.Many2many('modular.type', compute='_compute_available_modular_type_ids') + + @api.depends('product_id') + def _compute_available_modular_type_ids(self): + for line in self: + line.available_modular_type_ids = line.parent_product_tmpl_id.modular_types if line.product_id else False diff --git a/modular_types/models/product_template.py b/modular_types/models/product_template.py new file mode 100644 index 00000000000..6b47c774257 --- /dev/null +++ b/modular_types/models/product_template.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + modular_types = fields.Many2many('modular.type') diff --git a/modular_types/models/sale_order_line.py b/modular_types/models/sale_order_line.py new file mode 100644 index 00000000000..40fef45e4c8 --- /dev/null +++ b/modular_types/models/sale_order_line.py @@ -0,0 +1,15 @@ +from odoo import api, fields, models + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + has_modular_type = fields.Boolean(compute='_compute_has_modular_type', store=True) + modular_value_ids = fields.One2many('sale.order.line.modular.value', 'order_line_id') + + @api.depends('product_template_id', 'product_template_id.modular_types') + def _compute_has_modular_type(self): + for line in self: + line.has_modular_type = bool( + line.product_template_id.modular_types + ) diff --git a/modular_types/models/sale_order_line_modular_type_value.py b/modular_types/models/sale_order_line_modular_type_value.py new file mode 100644 index 00000000000..6b36fbefe70 --- /dev/null +++ b/modular_types/models/sale_order_line_modular_type_value.py @@ -0,0 +1,10 @@ +from odoo import models, fields + + +class SaleOrderLineModularValue(models.Model): + _name = 'sale.order.line.modular.value' + _description = 'Sale order line modular value' + + order_line_id = fields.Many2one('sale.order.line') + modular_type_id = fields.Many2one('modular.type', required=True) + value = fields.Float() diff --git a/modular_types/security/ir.model.access.csv b/modular_types/security/ir.model.access.csv new file mode 100644 index 00000000000..d2ad14b4ce4 --- /dev/null +++ b/modular_types/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 +modular_types.access_modular_type,access_modular_type,modular_types.model_modular_type,base.group_user,1,1,1,1 +access_sale_order_line_modular_value,sale.order.line.modular.value,model_sale_order_line_modular_value,base.group_user,1,1,1,1 diff --git a/modular_types/views/mrp_bom_views.xml b/modular_types/views/mrp_bom_views.xml new file mode 100644 index 00000000000..026ebf4141b --- /dev/null +++ b/modular_types/views/mrp_bom_views.xml @@ -0,0 +1,13 @@ + + + + mrp.bom.form.modular.type + mrp.bom + + + + + + + + diff --git a/modular_types/views/product_views.xml b/modular_types/views/product_views.xml new file mode 100644 index 00000000000..4fd4ac41828 --- /dev/null +++ b/modular_types/views/product_views.xml @@ -0,0 +1,13 @@ + + + + product.template.form.modular.types + product.template + + + + + + + + diff --git a/modular_types/views/sale_order_views.xml b/modular_types/views/sale_order_views.xml new file mode 100644 index 00000000000..1e37586f9ec --- /dev/null +++ b/modular_types/views/sale_order_views.xml @@ -0,0 +1,18 @@ + + + + sale.order.form.modular.button + sale.order + + + +