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 - +