[IMP] nan_prodlot_quality_control: finalized (re)implementation of Quality Control for Production Lots, with complet YAML tests included.
This commit is contained in:
commit
3067b86fcf
|
@ -0,0 +1,32 @@
|
|||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||
# All Rights Reserved.
|
||||
# http://www.NaN-tic.com
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsability of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# garantees and support are strongly adviced to contract a Free Software
|
||||
# Service Company
|
||||
#
|
||||
# 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 2
|
||||
# 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, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import stock
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,62 @@
|
|||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||
# All Rights Reserved.
|
||||
# http://www.NaN-tic.com
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsability of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# garantees and support are strongly adviced to contract a Free Software
|
||||
# Service Company
|
||||
#
|
||||
# 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 2
|
||||
# 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, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name" : "Production Lot Quality Control - Input",
|
||||
"version" : "0.2",
|
||||
"author" : "NaN Projectes de Programari Lliure S.L.",
|
||||
"category" : "Generic Modules/Quality Control",
|
||||
"website": "http://www.nan-tic.com",
|
||||
"description": """
|
||||
Module developed for Trod y Avia, S.L.
|
||||
|
||||
This module adds quality control to Production Lots on arrival (input
|
||||
pickings).
|
||||
The idea is that the first test will be 'Generic' and check for things like
|
||||
correct packaging. The second will be specific to the product in question.
|
||||
""",
|
||||
"depends" : [
|
||||
'nan_prodlot_quality_control',
|
||||
'stock',
|
||||
],
|
||||
"init_xml" : [],
|
||||
"update_xml" : [
|
||||
'quality_control_data.xml',
|
||||
],
|
||||
"demo_xml" : [
|
||||
'prodlot_quality_control_input_demo.xml',
|
||||
],
|
||||
"test": [
|
||||
'test/prodlot_quality_control_input.yml',
|
||||
],
|
||||
"active": False,
|
||||
"installable": True,
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record id="qc_posible_value_yes0" model="qc.posible.value">
|
||||
<field name="name">Yes</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="active" eval="1"/>
|
||||
</record>
|
||||
<record id="qc_posible_value_no0" model="qc.posible.value">
|
||||
<field name="name">No</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="active" eval="1"/>
|
||||
</record>
|
||||
|
||||
<record id="qc_proof_simpleproof0" model="qc.proof">
|
||||
<field name="name">Simple Proof</field>
|
||||
<field name="type">qualitative</field>
|
||||
<field name="value_ids" eval="[(6,0,[ref('qc_posible_value_yes0'),ref('qc_posible_value_no0')])]"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="active" eval="1"/>
|
||||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="qc_test_template_generic0" model="qc.test.template">
|
||||
<field name="name">Generic Template for Input Lots</field>
|
||||
<field name="type">generic</field>
|
||||
<field name="fill_correct_values" eval="0"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="active" eval="1"/>
|
||||
</record>
|
||||
<record id="qc_test_template_line_generic0" model="qc.test.template.line">
|
||||
<field name="test_template_id" ref="qc_test_template_generic0"/>
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="proof_id" ref="qc_proof_simpleproof0"/>
|
||||
<field name="type">qualitative</field>
|
||||
<field name="valid_value_ids" eval="[(6,0,[ref('qc_posible_value_yes0')])]"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="qc_test_template_related0" model="qc.test.template">
|
||||
<field name="name">Specific Template for Input Lots</field>
|
||||
<field name="type">related</field>
|
||||
<field name="fill_correct_values" eval="0"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="active" eval="1"/>
|
||||
</record>
|
||||
<record id="qc_test_template_line_related0" model="qc.test.template.line">
|
||||
<field name="test_template_id" ref="qc_test_template_related0"/>
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="proof_id" ref="qc_proof_simpleproof0"/>
|
||||
<field name="type">qualitative</field>
|
||||
<field name="valid_value_ids" eval="[(6,0,[ref('qc_posible_value_yes0')])]"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="qc_trigger_input" model="qc.trigger">
|
||||
<field name="name">Input</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,125 @@
|
|||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2010-2012 NaN Projectes de Programari Lliure, S.L.
|
||||
# All Rights Reserved.
|
||||
# http://www.NaN-tic.com
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsability of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# garantees and support are strongly adviced to contract a Free Software
|
||||
# Service Company
|
||||
#
|
||||
# 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 2
|
||||
# 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, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv
|
||||
|
||||
class stock_move(osv.osv):
|
||||
_inherit = 'stock.move'
|
||||
|
||||
# stock.move
|
||||
def _calc_qc_test_input_vals(self, cr, uid, move, context):
|
||||
reference = 'stock.production.lot,%d' % move.prodlot_id.id
|
||||
return {
|
||||
'object_id': reference,
|
||||
}
|
||||
|
||||
# stock.move
|
||||
def _calc_qc_test_trigger_ids_input_vals(self, cr, uid, move, trigger_id,
|
||||
context):
|
||||
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||
not move.prodlot_id or move.prodlot_id.state != 'draft' or
|
||||
trigger_id in
|
||||
[x.id for x in move.prodlot_id.qc_trigger_ids] or
|
||||
trigger_id not in
|
||||
[x.id for x in move.product_id.qc_trigger_ids]):
|
||||
return False
|
||||
|
||||
qc_test_proxy = self.pool.get('qc.test')
|
||||
test_trigger_vals = []
|
||||
for template_trigger in move.product_id.qc_template_trigger_ids:
|
||||
if template_trigger.trigger_id.id != trigger_id:
|
||||
continue
|
||||
|
||||
test_vals = self._calc_qc_test_input_vals(cr, uid, move, context)
|
||||
test_id = qc_test_proxy.create(cr, uid, test_vals, context)
|
||||
|
||||
qc_test_proxy.set_test_template(cr, uid, [test_id],
|
||||
template_trigger.template_id.id, context)
|
||||
|
||||
test_trigger_vals.append((0, 0, {
|
||||
'sequence': template_trigger.sequence,
|
||||
'trigger_id': template_trigger.trigger_id.id,
|
||||
'template_type': template_trigger.template_type,
|
||||
'test_id': test_id,
|
||||
}))
|
||||
return test_trigger_vals
|
||||
|
||||
|
||||
# stock.move
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
move_id = super(stock_move, self).create(cr, uid, vals, context)
|
||||
|
||||
if 'input' in context.get('no_create_trigger_test',[]):
|
||||
return move_id
|
||||
|
||||
input_trigger_id = self.pool.get('qc.trigger').search(cr, uid,
|
||||
[('name','=','Input')], context=context)
|
||||
if not input_trigger_id:
|
||||
return move_id
|
||||
|
||||
move = self.browse(cr, uid, move_id, context)
|
||||
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||
not move.prodlot_id):
|
||||
return move_id
|
||||
|
||||
self.pool.get('stock.production.lot').create_qc_test_triggers(cr, uid,
|
||||
move.prodlot_id, input_trigger_id[0], True, context)
|
||||
|
||||
return move_id
|
||||
|
||||
|
||||
# stock.move
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
prodlot_proxy = self.pool.get('stock.production.lot')
|
||||
|
||||
res = super(stock_move, self).write(cr, uid, ids, vals,
|
||||
context)
|
||||
|
||||
if 'input' in context.get('no_create_trigger_test',[]):
|
||||
return res
|
||||
|
||||
input_trigger_id = self.pool.get('qc.trigger').search(cr, uid,
|
||||
[('name','=','Input')], context=context)
|
||||
if not input_trigger_id:
|
||||
return res
|
||||
|
||||
for move in self.browse(cr, uid, ids, context):
|
||||
if (not move.picking_id or move.picking_id.type != 'in' or
|
||||
not move.prodlot_id):
|
||||
continue
|
||||
prodlot_proxy.create_qc_test_triggers(cr, uid, move.prodlot_id,
|
||||
input_trigger_id[0], True, context)
|
||||
|
||||
return res
|
||||
stock_move()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,406 @@
|
|||
-
|
||||
------ Prodlot Quality Control on Input ------
|
||||
-
|
||||
In order to test functionality of set Quality Control Tests to Production Lots
|
||||
in Input Pickings...
|
||||
-
|
||||
I create a Product without Quality Control
|
||||
-
|
||||
!record {model: product.product, id: product_product_wo_qc0}:
|
||||
name: Product without quality control
|
||||
type: product
|
||||
categ_id: product.cat0
|
||||
procure_method: make_to_stock
|
||||
supply_method: buy
|
||||
cost_method: standard
|
||||
valuation: manual_periodic
|
||||
standard_price: 200.0
|
||||
uom_id: product.product_uom_unit
|
||||
uom_po_id: product.product_uom_unit
|
||||
|
||||
-
|
||||
I create a Production Lot of Product
|
||||
-
|
||||
!record {model: stock.production.lot, id: prodlot_wo_qc0}:
|
||||
product_id: nan_prodlot_quality_control_input.product_product_wo_qc0
|
||||
|
||||
-
|
||||
I create a Product with the generic template assigned with Input trigger
|
||||
-
|
||||
!record {model: product.product, id: product_product_generic0}:
|
||||
name: Product with generic test
|
||||
type: product
|
||||
categ_id: product.cat0
|
||||
procure_method: make_to_stock
|
||||
supply_method: buy
|
||||
cost_method: standard
|
||||
valuation: manual_periodic
|
||||
standard_price: 300.0
|
||||
uom_id: product.product_uom_unit
|
||||
uom_po_id: product.product_uom_unit
|
||||
qc_template_trigger_ids:
|
||||
- sequence: 1
|
||||
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||
template_type: generic
|
||||
template_id: nan_prodlot_quality_control_input.qc_test_template_generic0
|
||||
|
||||
-
|
||||
I create a Production Lot of Product
|
||||
-
|
||||
!record {model: stock.production.lot, id: prodlot_generic0}:
|
||||
product_id: nan_prodlot_quality_control_input.product_product_generic0
|
||||
|
||||
-
|
||||
I create a Product with the generic and specific template assigned with Input trigger
|
||||
-
|
||||
!record {model: product.product, id: product_product_related0}:
|
||||
name: Product with specific test
|
||||
type: product
|
||||
categ_id: product.cat0
|
||||
procure_method: make_to_stock
|
||||
supply_method: buy
|
||||
cost_method: standard
|
||||
valuation: manual_periodic
|
||||
standard_price: 450.0
|
||||
uom_id: product.product_uom_unit
|
||||
uom_po_id: product.product_uom_unit
|
||||
qc_template_trigger_ids:
|
||||
- sequence: 1
|
||||
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||
template_type: generic
|
||||
template_id: nan_prodlot_quality_control_input.qc_test_template_generic0
|
||||
- sequence: 2
|
||||
trigger_id: nan_prodlot_quality_control_input.qc_trigger_input
|
||||
template_type: related
|
||||
template_id: nan_prodlot_quality_control_input.qc_test_template_related0
|
||||
|
||||
-
|
||||
Checking the Product has two Template Trigger lines
|
||||
-
|
||||
!assert {model: product.product, id: product_product_related0, string: The Product with generic and specific templates doesn't have two lines of Template Triggers!}:
|
||||
- len(qc_template_trigger_ids) == 2
|
||||
|
||||
-
|
||||
I create a Production Lot of Product
|
||||
-
|
||||
!record {model: stock.production.lot, id: prodlot_related0}:
|
||||
product_id: nan_prodlot_quality_control_input.product_product_related0
|
||||
|
||||
-
|
||||
Creating an Input Picking with three movements for the three Lots
|
||||
-
|
||||
!record {model: stock.picking, id: stock_picking_input0}:
|
||||
type: in
|
||||
# name: AC120002
|
||||
partner_id: base.main_partner
|
||||
address_id: base.main_address
|
||||
invoice_state: none
|
||||
move_type: direct
|
||||
date: '2012-02-21 17:19:01'
|
||||
max_date: '2012-02-21 17:19:31'
|
||||
min_date: '2012-02-21 17:19:17'
|
||||
move_lines:
|
||||
- name: Product without quality control
|
||||
product_id: nan_prodlot_quality_control_input.product_product_wo_qc0
|
||||
prodlot_id: nan_prodlot_quality_control_input.prodlot_wo_qc0
|
||||
product_uom: product.product_uom_unit
|
||||
product_qty: 5.0
|
||||
product_uos_qty: 5.0
|
||||
location_id: stock.stock_location_suppliers
|
||||
location_dest_id: stock.stock_location_stock
|
||||
company_id: base.main_company
|
||||
- name: Product with generic test
|
||||
product_id: nan_prodlot_quality_control_input.product_product_generic0
|
||||
prodlot_id: nan_prodlot_quality_control_input.prodlot_generic0
|
||||
product_uom: product.product_uom_unit
|
||||
product_qty: 3.0
|
||||
product_uos_qty: 3.0
|
||||
location_id: stock.stock_location_suppliers
|
||||
location_dest_id: stock.stock_location_stock
|
||||
company_id: base.main_company
|
||||
- name: Product with specific test
|
||||
product_id: nan_prodlot_quality_control_input.product_product_related0
|
||||
prodlot_id: nan_prodlot_quality_control_input.prodlot_related0
|
||||
product_uom: product.product_uom_unit
|
||||
product_qty: 1.0
|
||||
product_uos_qty: 1.0
|
||||
location_id: stock.stock_location_suppliers
|
||||
location_dest_id: stock.stock_location_stock
|
||||
company_id: base.main_company
|
||||
company_id: base.main_company
|
||||
|
||||
-
|
||||
Checking the Production Lot of product without Quality Control is in 'Valid'
|
||||
state, doesn't have current Test nor any Trigger Test line
|
||||
-
|
||||
!assert {model: stock.production.lot, id: prodlot_wo_qc0, string: The Lot of product without Quality Control is not in the expected 'Valid' state!}:
|
||||
- state == 'valid'
|
||||
- not current_qc_test_id
|
||||
- len(qc_test_trigger_ids) == 0
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic QC Template is in
|
||||
'Pending Test' state and it has only one Test Trigger
|
||||
#-
|
||||
# !assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'pending test' state or it hasn't the expected number of test triggers (expected only one)!}:
|
||||
# - state == 'pending_test'
|
||||
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0')
|
||||
# - len(qc_test_trigger_ids) == 1
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_generic0'), lot.current_qc_test_id.test_template_id.id)
|
||||
assert len(lot.qc_test_trigger_ids) == 1, "The number of Test Trigger lines is not 1 as expected. It is %d" % len(lot.qc_test_trigger_ids)
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic and related QC Template
|
||||
is in 'Pending Test' state and it has two Test Trigger
|
||||
#-
|
||||
# !assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state or it hasn't the expected number of test triggers (expected only two)!}:
|
||||
# - state == 'pending_test'
|
||||
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0')
|
||||
# - len(qc_test_trigger_ids) == 2
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_generic0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_generic0'), lot.current_qc_test_id.test_template_id.id)
|
||||
assert len(lot.qc_test_trigger_ids) == 2, "The number of Test Trigger lines is not 2 as expected. It is %d" % len(lot.qc_test_trigger_ids)
|
||||
|
||||
-
|
||||
Filling up the two current Quality Tests with valid values and 'Confirm' it
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
import netsvc
|
||||
|
||||
test_line_proxy = self.pool.get('qc.test.line')
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
|
||||
lot1 = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||
lot2 = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||
|
||||
test_line_proxy.write(cr, uid, [
|
||||
lot1.current_qc_test_id.test_line_ids[0].id,
|
||||
lot2.current_qc_test_id.test_line_ids[0].id,
|
||||
], {'actual_value_ql': ref('qc_posible_value_yes0')}, context)
|
||||
|
||||
wf_service.trg_validate(uid, 'qc.test', lot1.current_qc_test_id.id,
|
||||
'confirm', cr)
|
||||
wf_service.trg_validate(uid, 'qc.test', lot2.current_qc_test_id.id,
|
||||
'confirm', cr)
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic QC Template remains in
|
||||
'Pending Test' state and its test is success and in 'Waiting' state
|
||||
-
|
||||
!assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'pending test' state or its test is not in expected 'Waiting' state!}:
|
||||
- state == 'pending_test'
|
||||
- current_qc_test_id.state == 'waiting'
|
||||
- current_qc_test_id.success == True
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic and related QC Template
|
||||
remains in 'Pending Test' state and its test is success and in 'Waiting' state
|
||||
-
|
||||
!assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state or its test is not in expected 'Waiting' state!}:
|
||||
- state == 'pending_test'
|
||||
- current_qc_test_id.state == 'waiting'
|
||||
- current_qc_test_id.success == True
|
||||
|
||||
-
|
||||
Aproving the two current Quality Tests
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
import netsvc
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
|
||||
lot1 = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||
lot2 = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||
|
||||
wf_service.trg_validate(uid, 'qc.test', lot1.current_qc_test_id.id,
|
||||
'approve', cr)
|
||||
wf_service.trg_validate(uid, 'qc.test', lot2.current_qc_test_id.id,
|
||||
'approve', cr)
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic QC Template is in 'Valid'
|
||||
state and its test is in 'Success' state
|
||||
-
|
||||
!assert {model: stock.production.lot, id: prodlot_generic0, string: The lot of product with generic qc template is not in the expected 'Valid' state or its test is not in expected 'Success' state!}:
|
||||
- state == 'valid'
|
||||
- current_qc_test_id.state == 'success'
|
||||
|
||||
-
|
||||
Canceling the Quality Test of Lot with generic Template and checking test is
|
||||
in 'Draft' state and the Lot is in 'Pending Test'
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
import netsvc
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
|
||||
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||
print "State: %s" % lot.state
|
||||
|
||||
|
||||
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||
print "Workitems: ",wkf_workitem_ids
|
||||
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||
wkf_workitem.inst_id.id,
|
||||
wkf_workitem.act_id.name,
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.state)
|
||||
if wkf_workitem.subflow_id:
|
||||
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.subflow_id.res_type,
|
||||
wkf_workitem.subflow_id.res_id,
|
||||
wkf_workitem.subflow_id.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
|
||||
wf_service.trg_validate(uid, 'qc.test', lot.current_qc_test_id.id, 'cancel', cr)
|
||||
|
||||
lot = self.browse(cr, uid, ref('prodlot_generic0'), context)
|
||||
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||
print "State: %s" % lot.state
|
||||
|
||||
|
||||
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||
print "Workitems: ",wkf_workitem_ids
|
||||
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||
wkf_workitem.inst_id.id,
|
||||
wkf_workitem.act_id.name,
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.state)
|
||||
if wkf_workitem.subflow_id:
|
||||
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.subflow_id.res_type,
|
||||
wkf_workitem.subflow_id.res_id,
|
||||
wkf_workitem.subflow_id.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
-
|
||||
Checking the Production Lot of product with generic and related QC Template
|
||||
is in 'Pending Test' state because its current test is now the second test
|
||||
(related)
|
||||
#-
|
||||
# !assert {model: stock.production.lot, id: prodlot_related0, string: The lot of product with generic and related qc template is not in the expected 'pending test' state!}:
|
||||
# - state == 'pending_test'
|
||||
# - current_qc_test_id.test_template_id.id == ref('qc_test_template_related0')
|
||||
# - current_qc_test_id.state == 'draft'
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
import netsvc
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
|
||||
lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||
print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||
print "Second Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[1]), lot.qc_test_trigger_ids[1].test_id.id, lot.qc_test_trigger_ids[1].test_id.state)
|
||||
print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||
print "State: %s" % lot.state
|
||||
|
||||
|
||||
wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||
for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||
print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||
print "Workitems: ",wkf_workitem_ids
|
||||
for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||
print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||
wkf_workitem.inst_id.id,
|
||||
wkf_workitem.act_id.name,
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.state)
|
||||
if wkf_workitem.subflow_id:
|
||||
print "Wkf instance %d (%s, %d): state=%s" % (
|
||||
wkf_workitem.subflow_id.id,
|
||||
wkf_workitem.subflow_id.res_type,
|
||||
wkf_workitem.subflow_id.res_id,
|
||||
wkf_workitem.subflow_id.state)
|
||||
|
||||
wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||
for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
|
||||
# wf_service.trg_validate(uid, 'stock.production.lot', lot.id, 'next_test', cr)
|
||||
#
|
||||
#
|
||||
# lot = self.browse(cr, uid, ref('prodlot_related0'), context)
|
||||
# print "First Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[0]), lot.qc_test_trigger_ids[0].test_id.id, lot.qc_test_trigger_ids[0].test_id.state)
|
||||
# print "Second Test Trigger: %s (%d, %s)" % (str(lot.qc_test_trigger_ids[1]), lot.qc_test_trigger_ids[1].test_id.id, lot.qc_test_trigger_ids[1].test_id.state)
|
||||
# print "Current Trigger: %s (%d, %s)" % (str(lot.current_qc_test_trigger_id), lot.current_qc_test_trigger_id.test_id.id, lot.current_qc_test_trigger_id.test_id.state)
|
||||
# print "State: %s" % lot.state
|
||||
#
|
||||
# wkf_instance_ids = self.pool.get('workflow.instance').search(cr, uid, [('wkf_id','=',16),('res_id','=',lot.id)], context=context)
|
||||
# for wkf_instance in self.pool.get('workflow.instance').browse(cr, uid, wkf_instance_ids):
|
||||
# print "Wkf instance %d: state=%s" % (wkf_instance.id, wkf_instance.state)
|
||||
#
|
||||
# wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','in',wkf_instance_ids)], context=context)
|
||||
# for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
# print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
#
|
||||
# wkf_workitem_ids = self.pool.get('workflow.workitem').search(cr, uid, [('inst_id','in',wkf_instance_ids)], context=context)
|
||||
# print "Workitems: ",wkf_workitem_ids
|
||||
# for wkf_workitem in self.pool.get('workflow.workitem').browse(cr, uid, wkf_workitem_ids):
|
||||
# print "Wkf workitem for instance %d in activity %s: subflow_id=%d and state=%s" % (
|
||||
# wkf_workitem.inst_id.id,
|
||||
# wkf_workitem.act_id.name,
|
||||
# wkf_workitem.subflow_id.id,
|
||||
# wkf_workitem.state)
|
||||
# if wkf_workitem.subflow_id:
|
||||
# print "Wkf instance %d (%s, %d): state=%s" % (
|
||||
# wkf_workitem.subflow_id.id,
|
||||
# wkf_workitem.subflow_id.res_type,
|
||||
# wkf_workitem.subflow_id.res_id,
|
||||
# wkf_workitem.subflow_id.state)
|
||||
#
|
||||
# wkf_trigger_ids = self.pool.get('workflow.triggers').search(cr, uid, [('instance_id','=',wkf_workitem.subflow_id.id)], context=context)
|
||||
# for wkf_trigger in self.pool.get('workflow.triggers').browse(cr, uid, wkf_trigger_ids):
|
||||
# print "Wkf trigger for instance %d (%s, %d): workitem=%d" % (wkf_trigger.instance_id.id, wkf_trigger.model, wkf_trigger.res_id, wkf_trigger.workitem_id.id)
|
||||
|
||||
assert lot.state == 'pending_test', "The State of Lot is not the expected 'pending_test'. It is '%s'" % lot.state
|
||||
assert lot.current_qc_test_id.test_template_id.id == ref('qc_test_template_related0'), "The template of current Test Trigger is not the expected '%d'. It is '%d'" % (ref('qc_test_template_related0'), lot.current_qc_test_id.test_template_id.id)
|
||||
|
||||
|
||||
-
|
||||
END OK!!
|
||||
-
|
||||
!python {model: stock.production.lot}: |
|
||||
print "ADEU"
|
||||
|
||||
|
Loading…
Reference in New Issue