diff --git a/mrp_workcenter_hierarchical/__openerp__.py b/mrp_workcenter_hierarchical/__openerp__.py
index 0dc0392f3..5ef023c3e 100644
--- a/mrp_workcenter_hierarchical/__openerp__.py
+++ b/mrp_workcenter_hierarchical/__openerp__.py
@@ -84,6 +84,7 @@ To contribute to this module, please visit http://odoo-community.org.
'workcenter_view.xml',
],
'demo': [
+ 'demo/mrp_demo.xml',
],
'license': 'AGPL-3',
'tests': [],
diff --git a/mrp_workcenter_hierarchical/demo/mrp_demo.xml b/mrp_workcenter_hierarchical/demo/mrp_demo.xml
new file mode 100644
index 000000000..ab9f5fac7
--- /dev/null
+++ b/mrp_workcenter_hierarchical/demo/mrp_demo.xml
@@ -0,0 +1,96 @@
+
+
+
+
+ Assembly 1
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+ Assembly workshop 2
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+
+ Assembly A
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+
+ Assembly B
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+
+ Assembly C
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+
+ Assembly E
+
+ 5
+ 1
+ 0.1
+ 0.1
+ 0.87
+
+ 0.1
+
+ 0.05
+
+
+
+
+
+
+
diff --git a/mrp_workcenter_hierarchical/tests/__init__.py b/mrp_workcenter_hierarchical/tests/__init__.py
new file mode 100644
index 000000000..f1f7bc77c
--- /dev/null
+++ b/mrp_workcenter_hierarchical/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_compute_level
diff --git a/mrp_workcenter_hierarchical/tests/test_compute_level.py b/mrp_workcenter_hierarchical/tests/test_compute_level.py
new file mode 100644
index 000000000..22d305945
--- /dev/null
+++ b/mrp_workcenter_hierarchical/tests/test_compute_level.py
@@ -0,0 +1,58 @@
+from openerp.tests.common import TransactionCase
+
+class ComputeParentLevel(TransactionCase):
+ def test_compute_parent_level0(self):
+ workcenter = self.env['mrp.workcenter'].create({
+ 'name': 'New Assembly',
+ 'calendar_id': self.env.ref('resource.timesheet_group1').id,
+ 'capacity_per_cycle': 5,
+ 'time_cycle': 1,
+ 'time_start': 0.1,
+ 'time_stop': 0.1,
+ 'time_efficiency': 0.87,
+ 'product_id': self.env.ref('product.product_assembly').id,
+ 'costs_hour': 0,
+ 'costs_hour_account_id': self.env.ref('mrp.account_assembly_hours').id,
+ 'costs_cycle': 0.05,
+ 'costs_cycle_account_id': self.env.ref('mrp.account_assembly_cycle').id,
+ })
+ workcenter_child = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_A')
+ workcenter_child.write({'parent_id': workcenter.id})
+ self.assertEqual(workcenter.parent_level_1_id, workcenter)
+
+ def test_compute_parent_level1(self):
+ workcenter_child = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_E')
+ workcenter_parent = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_top')
+ workcenter_child.write({'parent_id': workcenter_parent.id})
+ self.assertEqual(workcenter_child.parent_level_1_id, workcenter_parent)
+
+ def test_compute_parent_level2(self):
+ workcenter_child = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_A')
+ workcenter_parent1 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_top')
+ workcenter_parent2 = self.env.ref('mrp.mrp_workcenter_0')
+
+ workcenter_child.write({'parent_id': workcenter_parent2.id})
+ import pdb; pdb.set_trace()
+ self.assertEqual(workcenter_child.parent_level_2_id, workcenter_parent2)
+ self.assertEqual(workcenter_child.parent_level_1_id, workcenter_parent1)
+
+ def test_compute_parent_level3(self):
+ workcenter_child = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_B')
+ workcenter_parent1 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_top')
+ workcenter_parent2 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_2')
+ workcenter_parent3 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_A')
+ workcenter_child.write({'parent_id': workcenter_parent3.id})
+ self.assertEqual(workcenter_child.parent_level_3_id, workcenter_parent3)
+ self.assertEqual(workcenter_child.parent_level_2_id, workcenter_parent2)
+ self.assertEqual(workcenter_child.parent_level_1_id, workcenter_parent1)
+
+ def test_compute_parent_level3(self):
+ workcenter_child = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_C')
+ workcenter_parent1 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_top')
+ workcenter_parent2 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_2')
+ workcenter_parent3 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_A')
+ workcenter_parent4 = self.env.ref('mrp_workcenter_hierarchical.mrp_workcenter_B')
+ workcenter_parent4.write({'parent_id': workcenter_parent3.id})
+ workcenter_child.write({'parent_id': workcenter_parent4.id})
+ self.assertEqual(workcenter_child.parent_id, workcenter_parent4)
+
diff --git a/mrp_workcenter_hierarchical/workcenter.py b/mrp_workcenter_hierarchical/workcenter.py
index b37ff116d..e9d036450 100644
--- a/mrp_workcenter_hierarchical/workcenter.py
+++ b/mrp_workcenter_hierarchical/workcenter.py
@@ -19,92 +19,59 @@
#
##############################################################################
-from openerp.osv import orm, fields
-class MrpWorkcenter(orm.Model):
+from openerp import api, fields, models
+
+class MrpWorkcenter(models.Model):
_inherit = 'mrp.workcenter'
_order = 'parent_left'
-
- def _get_workcenter_ids_to_recompute_level(self, cr, uid, ids, context=None):
- return self.search(cr, uid, [
- '|',
- '|',
- ('parent_id', 'child_of', ids),
- ('id', 'in', ids),
- ('child_ids', 'in', ids),
- ])
-
- def _get_parent_ids(self, workcenter):
- if workcenter.parent_id:
- ids = self._get_parent_ids(workcenter.parent_id)
- ids.append(workcenter.parent_id.id)
+ _parent_store = True
+
+ parent_id = fields.Many2one('mrp.workcenter', string='Parent')
+ child_ids = fields.One2many(
+ 'mrp.workcenter',
+ 'parent_id',
+ string='Children')
+ parent_level_1_id = fields.Many2one(
+ 'mrp.workcenter',
+ compute='_compute_parent_level',
+ string='Parent Level 1',
+ store=True)
+ parent_level_2_id = fields.Many2one(
+ 'mrp.workcenter',
+ compute='_compute_parent_level',
+ string='Parent Level 2',
+ store=True)
+ parent_level_3_id = fields.Many2one(
+ 'mrp.workcenter',
+ compute='_compute_parent_level',
+ string='Parent Level 3',
+ store=True)
+ parent_left=fields.Integer(select=1)
+ parent_right=fields.Integer(select=1)
+
+ @api.multi
+ def _get_parent_ids(self):
+ self.ensure_one()
+ if self.parent_id:
+ ids = self.parent_id._get_parent_ids()
+ ids.append(self.parent_id.id)
else:
ids = []
return ids
-
- def _get_parent_level(self, cr, uid, ids, field_name, args, context=None):
- result = {}
+
+ @api.multi
+ @api.depends('parent_id.parent_id.parent_id', 'child_ids')
+ def _compute_parent_level(self):
def get_next_level(parent_ids, workcenter):
return parent_ids and parent_ids.pop(0) or (
workcenter.child_ids and workcenter.id
or workcenter.parent_id.id)
- for workcenter in self.browse(cr, uid, ids, context=context):
- parent_ids = self._get_parent_ids(workcenter)
- parent_level_1_id = get_next_level(parent_ids, workcenter)
- parent_level_2_id = get_next_level(parent_ids, workcenter)
- parent_level_3_id = get_next_level(parent_ids, workcenter)
- result[workcenter.id] = {
- 'parent_level_1_id': parent_level_1_id,
- 'parent_level_2_id': parent_level_2_id,
- 'parent_level_3_id': parent_level_3_id,
- }
- return result
+ for workcenter in self:
+ parent_ids = workcenter._get_parent_ids()
+ workcenter.parent_level_1_id = get_next_level(parent_ids, workcenter)
+ workcenter.parent_level_2_id = get_next_level(parent_ids, workcenter)
+ workcenter.parent_level_3_id = get_next_level(parent_ids, workcenter)
- _columns = {
- 'parent_id': fields.many2one(
- 'mrp.workcenter',
- string='Parent'),
- 'child_ids': fields.one2many(
- 'mrp.workcenter',
- 'parent_id',
- string='Children'),
- 'parent_level_1_id': fields.function(
- _get_parent_level,
- relation='mrp.workcenter',
- type='many2one',
- string='Parent Level 1',
- multi='parent_level',
- store={
- 'mrp.workcenter': (
- _get_workcenter_ids_to_recompute_level,
- ['parent_id'],
- 10),
- },),
- 'parent_level_2_id': fields.function(
- _get_parent_level,
- relation='mrp.workcenter',
- type='many2one',
- string='Parent Level 2',
- multi='parent_level',
- store={
- 'mrp.workcenter': (
- _get_workcenter_ids_to_recompute_level,
- ['parent_id'],
- 10),
- },),
- 'parent_level_3_id': fields.function(
- _get_parent_level,
- relation='mrp.workcenter',
- type='many2one',
- string='Parent Level 3',
- multi='parent_level',
- store={
- 'mrp.workcenter': (
- _get_workcenter_ids_to_recompute_level,
- ['parent_id'],
- 10),
- },),
- 'parent_left': fields.integer('Left Parent', select=1),
- 'parent_right': fields.integer('Right Parent', select=1),
- }
+
diff --git a/mrp_workcenter_hierarchical/workcenter_view.xml b/mrp_workcenter_hierarchical/workcenter_view.xml
index 1e5611d6e..0b7473f3b 100644
--- a/mrp_workcenter_hierarchical/workcenter_view.xml
+++ b/mrp_workcenter_hierarchical/workcenter_view.xml
@@ -8,7 +8,7 @@
mrp.workcenter
-
+