mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
[IMP] Port workcenter hierarchical to version 9.0
This commit is contained in:
committed by
Florian da Costa
parent
d7081654f1
commit
f714a33d10
@@ -84,6 +84,7 @@ To contribute to this module, please visit http://odoo-community.org.
|
|||||||
'workcenter_view.xml',
|
'workcenter_view.xml',
|
||||||
],
|
],
|
||||||
'demo': [
|
'demo': [
|
||||||
|
'demo/mrp_demo.xml',
|
||||||
],
|
],
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'tests': [],
|
'tests': [],
|
||||||
|
|||||||
96
mrp_workcenter_hierarchical/demo/mrp_demo.xml
Normal file
96
mrp_workcenter_hierarchical/demo/mrp_demo.xml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data noupdate="0">
|
||||||
|
<record id="mrp_workcenter_top" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly 1</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp_workcenter_2" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly workshop 2</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
<field name="parent_id" ref="mrp_workcenter_top"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp_workcenter_A" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly A</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
<field name="parent_id" ref="mrp_workcenter_2"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp_workcenter_B" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly B</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
<field name="parent_id" ref="mrp_workcenter_2"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp_workcenter_C" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly C</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
<field name="parent_id" ref="mrp.mrp_workcenter_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp_workcenter_E" model="mrp.workcenter">
|
||||||
|
<field name="name">Assembly E</field>
|
||||||
|
<field name="calendar_id" ref="resource.timesheet_group1"/>
|
||||||
|
<field name="capacity_per_cycle">5</field>
|
||||||
|
<field name="time_cycle">1</field>
|
||||||
|
<field name="time_start">0.1</field>
|
||||||
|
<field name="time_stop">0.1</field>
|
||||||
|
<field name="time_efficiency">0.87</field>
|
||||||
|
<field name="product_id" ref="product.product_assembly"/>
|
||||||
|
<field name="costs_hour">0.1</field>
|
||||||
|
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
|
||||||
|
<field name="costs_cycle">0.05</field>
|
||||||
|
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
|
||||||
|
</record>
|
||||||
|
<record id="mrp.mrp_workcenter_0" model="mrp.workcenter">
|
||||||
|
<field name="parent_id" ref="mrp_workcenter_top"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
1
mrp_workcenter_hierarchical/tests/__init__.py
Normal file
1
mrp_workcenter_hierarchical/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import test_compute_level
|
||||||
58
mrp_workcenter_hierarchical/tests/test_compute_level.py
Normal file
58
mrp_workcenter_hierarchical/tests/test_compute_level.py
Normal file
@@ -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)
|
||||||
|
|
||||||
@@ -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'
|
_inherit = 'mrp.workcenter'
|
||||||
_order = 'parent_left'
|
_order = 'parent_left'
|
||||||
|
_parent_store = True
|
||||||
def _get_workcenter_ids_to_recompute_level(self, cr, uid, ids, context=None):
|
|
||||||
return self.search(cr, uid, [
|
parent_id = fields.Many2one('mrp.workcenter', string='Parent')
|
||||||
'|',
|
child_ids = fields.One2many(
|
||||||
'|',
|
'mrp.workcenter',
|
||||||
('parent_id', 'child_of', ids),
|
'parent_id',
|
||||||
('id', 'in', ids),
|
string='Children')
|
||||||
('child_ids', 'in', ids),
|
parent_level_1_id = fields.Many2one(
|
||||||
])
|
'mrp.workcenter',
|
||||||
|
compute='_compute_parent_level',
|
||||||
def _get_parent_ids(self, workcenter):
|
string='Parent Level 1',
|
||||||
if workcenter.parent_id:
|
store=True)
|
||||||
ids = self._get_parent_ids(workcenter.parent_id)
|
parent_level_2_id = fields.Many2one(
|
||||||
ids.append(workcenter.parent_id.id)
|
'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:
|
else:
|
||||||
ids = []
|
ids = []
|
||||||
return ids
|
return ids
|
||||||
|
|
||||||
def _get_parent_level(self, cr, uid, ids, field_name, args, context=None):
|
@api.multi
|
||||||
result = {}
|
@api.depends('parent_id.parent_id.parent_id', 'child_ids')
|
||||||
|
def _compute_parent_level(self):
|
||||||
def get_next_level(parent_ids, workcenter):
|
def get_next_level(parent_ids, workcenter):
|
||||||
return parent_ids and parent_ids.pop(0) or (
|
return parent_ids and parent_ids.pop(0) or (
|
||||||
workcenter.child_ids and workcenter.id
|
workcenter.child_ids and workcenter.id
|
||||||
or workcenter.parent_id.id)
|
or workcenter.parent_id.id)
|
||||||
|
|
||||||
for workcenter in self.browse(cr, uid, ids, context=context):
|
for workcenter in self:
|
||||||
parent_ids = self._get_parent_ids(workcenter)
|
parent_ids = workcenter._get_parent_ids()
|
||||||
parent_level_1_id = get_next_level(parent_ids, workcenter)
|
workcenter.parent_level_1_id = get_next_level(parent_ids, workcenter)
|
||||||
parent_level_2_id = get_next_level(parent_ids, workcenter)
|
workcenter.parent_level_2_id = get_next_level(parent_ids, workcenter)
|
||||||
parent_level_3_id = get_next_level(parent_ids, workcenter)
|
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
|
|
||||||
|
|
||||||
_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),
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<field name="model">mrp.workcenter</field>
|
<field name="model">mrp.workcenter</field>
|
||||||
<field name="inherit_id" ref="mrp.view_mrp_workcenter_search"/>
|
<field name="inherit_id" ref="mrp.view_mrp_workcenter_search"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//filter[@string='Type']" position="before">
|
<xpath expr="//group/filter" position="before">
|
||||||
<filter string="Parent Level 1" domain="[]" name="group_by_level_1"
|
<filter string="Parent Level 1" domain="[]" name="group_by_level_1"
|
||||||
context="{'group_by':'parent_level_1_id'}"/>
|
context="{'group_by':'parent_level_1_id'}"/>
|
||||||
<filter string="Parent Level 2" domain="[]" name="group_by_level_2"
|
<filter string="Parent Level 2" domain="[]" name="group_by_level_2"
|
||||||
|
|||||||
Reference in New Issue
Block a user