diff --git a/mrp_bom_hierarchy/README.rst b/mrp_bom_hierarchy/README.rst
new file mode 100644
index 000000000..e69de29bb
diff --git a/mrp_bom_hierarchy/__init__.py b/mrp_bom_hierarchy/__init__.py
index a8ed7470c..a85801536 100644
--- a/mrp_bom_hierarchy/__init__.py
+++ b/mrp_bom_hierarchy/__init__.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2015 Eficent ()
@@ -18,4 +17,4 @@
# along with this program. If not, see .
#
##############################################################################
-from . import model
\ No newline at end of file
+from . import model
diff --git a/mrp_bom_hierarchy/__manifest__.py b/mrp_bom_hierarchy/__manifest__.py
new file mode 100644
index 000000000..07c2e141d
--- /dev/null
+++ b/mrp_bom_hierarchy/__manifest__.py
@@ -0,0 +1,35 @@
+##############################################################################
+#
+# Copyright (C) 2015 Eficent ()
+#
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+{
+ "name": "MRP BOM Hierarchy",
+ "version": "1.0",
+ "author": "Eficent, Odoo Community Association (OCA)",
+ "category": "Manufacturing",
+ "depends": ["mrp"],
+ "website": "https://github.com/OCA/manufacture",
+ "license": "AGPL-3",
+ "demo": [],
+ "data": [
+ "view/mrp.xml",
+ ],
+ "test": [],
+ "installable": True,
+ "auto_install": False,
+}
diff --git a/mrp_bom_hierarchy/__openerp__.py b/mrp_bom_hierarchy/__openerp__.py
deleted file mode 100644
index 9f488449a..000000000
--- a/mrp_bom_hierarchy/__openerp__.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# Copyright (C) 2015 Eficent ()
-#
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-{
- "name": "MRP BOM Hierarchy",
- "version": "1.0",
- "author": "Eficent",
- "website": "www.eficent.com",
- "category": "Manufacturing",
- "depends": ["mrp"],
- "description": """
-.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
- :alt: License: AGPL-3
-
-MRP BOM Hierarchy
-=================
-
-This module was written to extend the functionality of Bill of
-Materials to support users to better maintain the BOM hierarchy.
-
-This module replaces the existing BOM tree views with a new one, from
-which the user can create a complete BOM hierarchy.
-
-The user can navigate from the tree view to child BOM's, or to the
-product's BOM components with a single click.
-
-The user can now search using the field 'Complete Reference' (or Name) to
-find all the BOM hierarchy associated to a particular BOM Reference (or
-Name) at once.
-
-
-Installation
-============
-
-No specific installation steps are required.
-
-Configuration
-=============
-
-No specific configuration steps are required.
-
-Usage
-=====
-
-To use this module, you need to go to 'Manufacturing | Products | Bill of
-Materials Hierarchy'
-
-Known issues / Roadmap
-======================
-
-No issues have been identified with this module.
-
-Credits
-=======
-
-Contributors
-------------
-
-* Jordi Ballester Alomar
-
-Maintainer
-----------
-
-.. image:: http://odoo-community.org/logo.png
- :alt: Odoo Community Association
- :target: http://odoo-community.org
-
-This module is maintained by the OCA.
-
-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.
-
-To contribute to this module, please visit http://odoo-community.org.
-""",
- "website": "http://www.eficent.com/",
- "license": "AGPL-3",
- "demo": [],
- "data": [
- "view/mrp.xml",
- ],
- "test": [],
- "installable": True,
- "auto_install": False,
- "active": False
-}
\ No newline at end of file
diff --git a/mrp_bom_hierarchy/model/__init__.py b/mrp_bom_hierarchy/model/__init__.py
index a2d2420eb..4bc3d01cd 100644
--- a/mrp_bom_hierarchy/model/__init__.py
+++ b/mrp_bom_hierarchy/model/__init__.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Eficent ()
@@ -18,4 +17,4 @@
# along with this program. If not, see .
#
##############################################################################
-from . import mrp
\ No newline at end of file
+from . import mrp
diff --git a/mrp_bom_hierarchy/model/mrp.py b/mrp_bom_hierarchy/model/mrp.py
index c9f8fda90..2b28aa247 100644
--- a/mrp_bom_hierarchy/model/mrp.py
+++ b/mrp_bom_hierarchy/model/mrp.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
@@ -19,11 +18,11 @@
#
##############################################################################
-from openerp.osv import osv, fields, expression
+from odoo import fields, models
-class mrp_bom(osv.osv):
- _inherit = 'mrp.bom'
+class Bom(models.Model):
+ _inherit = "mrp.bom"
def get_child_boms(self, cr, uid, ids, context=None):
result = {}
@@ -32,7 +31,8 @@ class mrp_bom(osv.osv):
for curr_id in ids:
result[curr_id] = True
# Now add the children
- cr.execute('''
+ cr.execute(
+ """
WITH RECURSIVE children AS (
SELECT bom_id, id
FROM mrp_bom
@@ -43,20 +43,20 @@ class mrp_bom(osv.osv):
JOIN children b ON(a.bom_id = b.id)
)
SELECT * FROM children order by bom_id
- ''', (tuple(ids),))
+ """,
+ (tuple(ids),),
+ )
res = cr.fetchall()
- for x, y in res:
+ for _x, y in res:
result[y] = True
return result
def _get_boms_from_product(self, cr, uid, ids, context=None):
result = {}
- bom_obj = self.pool.get('mrp.bom')
+ bom_obj = self.pool.get("mrp.bom")
for p in ids:
- product_bom_ids = bom_obj.search(
- cr, uid, [('product_id', '=', p)])
- bom_ids = bom_obj.get_child_boms(cr, uid, product_bom_ids,
- context=context)
+ product_bom_ids = bom_obj.search(cr, uid, [("product_id", "=", p)])
+ bom_ids = bom_obj.get_child_boms(cr, uid, product_bom_ids, context=context)
for bom_id in bom_ids:
result[bom_id] = True
return result
@@ -71,8 +71,7 @@ class mrp_bom(osv.osv):
result[bom.id] = True
return result
- def _bom_hierarchy_indent_calc(self, cr, uid, ids, prop, unknow_none,
- unknow_dict):
+ def _bom_hierarchy_indent_calc(self, cr, uid, ids, prop, unknow_none, unknow_dict):
if not ids:
return []
res = []
@@ -81,17 +80,18 @@ class mrp_bom(osv.osv):
b = bom
while b:
if b.name and b.bom_id:
- data.insert(0, '>')
+ data.insert(0, ">")
else:
- data.insert(0, '')
+ data.insert(0, "")
b = b.bom_id
- data = ''.join(data)
+ data = "".join(data)
res.append((bom.id, data))
return dict(res)
def _complete_bom_hierarchy_code_calc(
- self, cr, uid, ids, prop, unknow_none, unknow_dict):
+ self, cr, uid, ids, prop, unknow_none, unknow_dict
+ ):
if not ids:
return []
res = []
@@ -106,17 +106,18 @@ class mrp_bom(osv.osv):
elif b.product_id.default_code:
data.insert(0, b.product_id.default_code)
else:
- data.insert(0, '')
+ data.insert(0, "")
b = b.bom_id
- data = ' / '.join(data)
- data = '[' + data + '] '
+ data = " / ".join(data)
+ data = "[" + data + "] "
res.append((bom.id, data))
return dict(res)
def _complete_bom_hierarchy_name_calc(
- self, cr, uid, ids, prop, unknow_none, unknow_dict):
+ self, cr, uid, ids, prop, unknow_none, unknow_dict
+ ):
if not ids:
return []
res = []
@@ -129,11 +130,11 @@ class mrp_bom(osv.osv):
elif b.product_id.name:
data.insert(0, b.product_id.name)
else:
- data.insert(0, '')
+ data.insert(0, "")
b = b.bom_id
- data = ' / '.join(data)
+ data = " / ".join(data)
res.append((bom.id, data))
return dict(res)
@@ -146,13 +147,15 @@ class mrp_bom(osv.osv):
res[bom.id] = False
return res
- def _product_has_own_bom(self, cr, uid, ids, prop, unknow_none,
- unknow_dict):
+ def _product_has_own_bom(self, cr, uid, ids, prop, unknow_none, unknow_dict):
res = {}
for bom in self.browse(cr, uid, ids, context=None):
- bom_ids = self.pool.get('mrp.bom').search(
- cr, uid, [('product_id', '=', bom.product_id.id),
- ('bom_id', '=', False)], context=None)
+ bom_ids = self.pool.get("mrp.bom").search(
+ cr,
+ uid,
+ [("product_id", "=", bom.product_id.id), ("bom_id", "=", False)],
+ context=None,
+ )
if bom_ids:
res[bom.id] = True
else:
@@ -160,42 +163,59 @@ class mrp_bom(osv.osv):
return res
_columns = {
- 'is_parent': fields.function(_is_parent, string="Is parent BOM",
- type='boolean', readonly=True,
- store=True),
- 'has_child': fields.function(_is_bom, string="Has components",
- type='boolean', readonly=True),
- 'product_has_own_bom': fields.function(_product_has_own_bom,
- string="Product has own BOM",
- type='boolean', readonly=True),
- 'bom_hierarchy_indent': fields.function(_bom_hierarchy_indent_calc,
- method=True,
- type='char', string='Level',
- size=32, readonly=True),
- 'complete_bom_hierarchy_code': fields.function(
- _complete_bom_hierarchy_code_calc, method=True, type='char',
- string='Complete Reference', size=250,
- help='Describes the full path of this '
- 'component within the BOM hierarchy using the BOM reference.',
+ "is_parent": fields.function(
+ _is_parent,
+ string="Is parent BOM",
+ type="boolean",
+ readonly=True,
+ store=True,
+ ),
+ "has_child": fields.function(
+ _is_bom, string="Has components", type="boolean", readonly=True
+ ),
+ "product_has_own_bom": fields.function(
+ _product_has_own_bom,
+ string="Product has own BOM",
+ type="boolean",
+ readonly=True,
+ ),
+ "bom_hierarchy_indent": fields.function(
+ _bom_hierarchy_indent_calc,
+ method=True,
+ type="char",
+ string="Level",
+ size=32,
+ readonly=True,
+ ),
+ "complete_bom_hierarchy_code": fields.function(
+ _complete_bom_hierarchy_code_calc,
+ method=True,
+ type="char",
+ string="Complete Reference",
+ size=250,
+ help="Describes the full path of this "
+ "component within the BOM hierarchy using the BOM reference.",
store={
- 'mrp.bom': (get_child_boms, ['name', 'code', 'position',
- 'bom_id'], 20),
- 'product.product': (_get_boms_from_product, ['default_code'],
- 20),
- }),
- 'complete_bom_hierarchy_name': fields.function(
- _complete_bom_hierarchy_name_calc, method=True, type='char',
- string='Complete Name', size=250,
- help='Describes the full path of this '
- 'component within the BOM hierarchy using the BOM name.',
- store={
- 'mrp.bom': (get_child_boms, ['name', 'bom_id'], 20),
- 'product.product': (_get_boms_from_product, ['name'], 20),
+ "mrp.bom": (get_child_boms, ["name", "code", "position", "bom_id"], 20),
+ "product.product": (_get_boms_from_product, ["default_code"], 20),
},
- ),
+ ),
+ "complete_bom_hierarchy_name": fields.function(
+ _complete_bom_hierarchy_name_calc,
+ method=True,
+ type="char",
+ string="Complete Name",
+ size=250,
+ help="Describes the full path of this "
+ "component within the BOM hierarchy using the BOM name.",
+ store={
+ "mrp.bom": (get_child_boms, ["name", "bom_id"], 20),
+ "product.product": (_get_boms_from_product, ["name"], 20),
+ },
+ ),
}
- _order = 'complete_bom_hierarchy_code'
+ _order = "complete_bom_hierarchy_code"
def action_openChildTreeView(self, cr, uid, ids, context=None):
"""
@@ -204,17 +224,17 @@ class mrp_bom(osv.osv):
if context is None:
context = {}
bom = self.browse(cr, uid, ids[0], context)
- child_bom_ids = self.pool.get('mrp.bom').search(
- cr, uid, [('bom_id', '=', bom.id)])
- res = self.pool.get('ir.actions.act_window').for_xml_id(
- cr, uid, 'mrp_bom_hierarchy', 'action_mrp_bom_hierarchy_tree2',
- context)
- res['context'] = {
- 'default_bom_id': bom.id,
+ child_bom_ids = self.pool.get("mrp.bom").search(
+ cr, uid, [("bom_id", "=", bom.id)]
+ )
+ res = self.pool.get("ir.actions.act_window").for_xml_id(
+ cr, uid, "mrp_bom_hierarchy", "action_mrp_bom_hierarchy_tree2", context
+ )
+ res["context"] = {
+ "default_bom_id": bom.id,
}
- res['domain'] = "[('id', 'in', ["+','.join(
- map(str, child_bom_ids))+"])]"
- res['nodestroy'] = False
+ res["domain"] = "[('id', 'in', [" + ",".join(map(str, child_bom_ids)) + "])]"
+ res["nodestroy"] = False
return res
def action_openParentTreeView(self, cr, uid, ids, context=None):
@@ -224,15 +244,15 @@ class mrp_bom(osv.osv):
if context is None:
context = {}
bom = self.browse(cr, uid, ids[0], context)
- res = self.pool.get('ir.actions.act_window').for_xml_id(
- cr, uid, 'mrp_bom_hierarchy', 'action_mrp_bom_hierarchy_tree2',
- context)
+ res = self.pool.get("ir.actions.act_window").for_xml_id(
+ cr, uid, "mrp_bom_hierarchy", "action_mrp_bom_hierarchy_tree2", context
+ )
if bom.bom_id:
- for parent_bom_id in self.pool.get('mrp.bom').search(
- cr, uid, [('id', '=',
- bom.bom_id.id)]):
- res['domain'] = "[('id','=',"+str(parent_bom_id)+")]"
- res['nodestroy'] = False
+ for parent_bom_id in self.pool.get("mrp.bom").search(
+ cr, uid, [("id", "=", bom.bom_id.id)]
+ ):
+ res["domain"] = "[('id','='," + str(parent_bom_id) + ")]"
+ res["nodestroy"] = False
return res
def action_openProductBOMTreeView(self, cr, uid, ids, context=None):
@@ -242,17 +262,19 @@ class mrp_bom(osv.osv):
if context is None:
context = {}
bom = self.browse(cr, uid, ids[0], context)
- product_bom_ids = self.pool.get('mrp.bom').search(
- cr, uid, [('product_id', '=', bom.product_id.id),
- ('bom_id', '=', False)], context=context)
- res = self.pool.get('ir.actions.act_window').for_xml_id(
- cr, uid, 'mrp', 'mrp_bom_form_action2',
- context)
+ product_bom_ids = self.pool.get("mrp.bom").search(
+ cr,
+ uid,
+ [("product_id", "=", bom.product_id.id), ("bom_id", "=", False)],
+ context=context,
+ )
+ res = self.pool.get("ir.actions.act_window").for_xml_id(
+ cr, uid, "mrp", "mrp_bom_form_action2", context
+ )
- res['context'] = {
- 'default_product_id': bom.product_id.id,
+ res["context"] = {
+ "default_product_id": bom.product_id.id,
}
- res['domain'] = "[('id', 'in', ["+','.join(
- map(str, product_bom_ids))+"])]"
- res['nodestroy'] = False
- return res
\ No newline at end of file
+ res["domain"] = "[('id', 'in', [" + ",".join(map(str, product_bom_ids)) + "])]"
+ res["nodestroy"] = False
+ return res
diff --git a/mrp_bom_hierarchy/readme/CONTRIBUTORS.rst b/mrp_bom_hierarchy/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..c84e2e8e0
--- /dev/null
+++ b/mrp_bom_hierarchy/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Jordi Ballester Alomar
diff --git a/mrp_bom_hierarchy/readme/DESCRIPTION.rst b/mrp_bom_hierarchy/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..8e34ee0ef
--- /dev/null
+++ b/mrp_bom_hierarchy/readme/DESCRIPTION.rst
@@ -0,0 +1,12 @@
+This module was written to extend the functionality of Bill of
+Materials to support users to better maintain the BOM hierarchy.
+
+This module replaces the existing BOM tree views with a new one, from
+which the user can create a complete BOM hierarchy.
+
+The user can navigate from the tree view to child BOM's, or to the
+product's BOM components with a single click.
+
+The user can now search using the field 'Complete Reference' (or Name) to
+find all the BOM hierarchy associated to a particular BOM Reference (or
+Name) at once.
diff --git a/mrp_bom_hierarchy/readme/USAGE.rst b/mrp_bom_hierarchy/readme/USAGE.rst
new file mode 100644
index 000000000..ef67c3843
--- /dev/null
+++ b/mrp_bom_hierarchy/readme/USAGE.rst
@@ -0,0 +1,2 @@
+To use this module, you need to go to 'Manufacturing | Products | Bill of
+Materials Hierarchy'.
diff --git a/mrp_bom_hierarchy/view/mrp.xml b/mrp_bom_hierarchy/view/mrp.xml
index d17715095..421766d9a 100644
--- a/mrp_bom_hierarchy/view/mrp.xml
+++ b/mrp_bom_hierarchy/view/mrp.xml
@@ -1,20 +1,25 @@
-
-
+
+mrp.bom.formmrp.bom
-
+
-
-
-
-
+
+
+
+
@@ -22,74 +27,87 @@
mrp.bom.selectmrp.bom
-
+
-
-
-
-
-
+
+
+
+
+
-
+ mrp.bom.treemrp.bomchild_complete_ids
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+ Bill of Material Hierarchyir.actions.act_windowmrp.bomform
-
+ []
-
+
diff --git a/setup/mrp_bom_hierarchy/odoo/addons/mrp_bom_hierarchy b/setup/mrp_bom_hierarchy/odoo/addons/mrp_bom_hierarchy
new file mode 120000
index 000000000..fa3dbc615
--- /dev/null
+++ b/setup/mrp_bom_hierarchy/odoo/addons/mrp_bom_hierarchy
@@ -0,0 +1 @@
+../../../../mrp_bom_hierarchy
\ No newline at end of file
diff --git a/setup/mrp_bom_hierarchy/setup.py b/setup/mrp_bom_hierarchy/setup.py
new file mode 100644
index 000000000..28c57bb64
--- /dev/null
+++ b/setup/mrp_bom_hierarchy/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)