[IMP] Port workcenter hierarchical to version 9.0

This commit is contained in:
Thibault Rey
2016-01-25 17:51:09 +01:00
committed by Florian da Costa
parent d7081654f1
commit f714a33d10
6 changed files with 201 additions and 78 deletions

View File

@@ -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': [],

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

View File

@@ -0,0 +1 @@
from . import test_compute_level

View 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)

View File

@@ -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),
}

View File

@@ -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"