Devishree Brahmbhatt (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-coverage-stock-dbr into 
lp:openobject-addons.

Requested reviews:
  OpenERP Core Team (openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-coverage-stock-dbr/+merge/83918

Hello,

Improve the test cases for stock module.
Done the changes as follows:

Update:
=======
    stock_demo_picking.yml
      Define the statements.
    stock_demo.yml
      Add new location for improve test case of chain location.
    product_demo.yml
      Add a product for improve test case of chain location.
    stock_data.yml
      Add a data for improve test case of chain location.
    stock_report.yml
      Define propar refernce.
Rename:
=======
    stock/test/stock_test.yml => stock/test/stock_update.yml
      Defien the process of update product stock.
    stock/test/stock_test_wizard.yml => stock/test/stock_chain_location.yml
      Define the process of chain location.
Add:
====
    stock/test/stock_scrap_move.yml
      Define the process of scrap move.
    stock/test/physical_inventory.yml
      Define the process of physical inventory test case for set to zero 
quantity.
    stock/test/stock_new_pack.yml
      Define the process of create a new pack.
    stock/test/cancel_stock.yml
      Define the process of cancel.
    stock/test/delete_stock.yml
      Define tyhe process of delete.

So, kindly review it.
Thanks.

-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-coverage-stock-dbr/+merge/83918
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-coverage-stock-dbr.
=== modified file 'product/product_demo.xml'
--- product/product_demo.xml	2011-05-04 09:05:49 +0000
+++ product/product_demo.xml	2011-11-30 11:16:32 +0000
@@ -321,6 +321,19 @@
             <field name="type">product</field>
             <field name="categ_id" ref="product_category_10"/>
         </record>
+        <record id="product_product_sprouting" model="product.product">
+            <field name="default_code">Sprouting</field>
+            <field name="supply_method">buy</field>
+            <field name="list_price">250.0</field>
+            <field name="standard_price">200.0</field>
+            <field name="uom_id" ref="product_uom_kgm"/>
+            <field name="uom_po_id" ref="product_uom_kgm"/>
+            <field name="procure_method">make_to_stock</field>
+            <field name="sale_delay">7.0</field>
+            <field name="name">Sprouting Foods</field>
+            <field name="type">product</field>
+            <field name="categ_id" ref="product_category_marketableproduct0"/>
+        </record> 
         <record id="product_product_tow1" model="product.product">
             <field name="default_code">TOW1</field>
             <field name="list_price">37.5</field>

=== modified file 'stock/__openerp__.py'
--- stock/__openerp__.py	2011-11-22 08:51:38 +0000
+++ stock/__openerp__.py	2011-11-30 11:16:32 +0000
@@ -82,10 +82,15 @@
         "board_warehouse_view.xml",
     ],
     'test': [
-        'test/stock_test.yml',
+        'test/stock_physical_inventory.yml',
+        'test/stock_update.yml',
+        'test/stock_chain_location.yml',
+        'test/stock_demo_backorder.yml',
+        'test/stock_scrap_move.yml',
+        'test/stock_new_pack.yml',
         'test/stock_report.yml',
-        'test/stock_test_wizard.yml',
-        'test/stock_demo_backorder.yml'
+        'test/delete_stock.yml',
+        'test/cancel_stock.yml',
     ],
     'installable': True,
     'active': False,

=== modified file 'stock/stock_data.xml'
--- stock/stock_data.xml	2011-10-27 21:11:24 +0000
+++ stock/stock_data.xml	2011-11-30 11:16:32 +0000
@@ -90,6 +90,14 @@
             <field name="usage">view</field>
             <field name="location_id" ref="stock_location_locations"/>
         </record>
+        <record id="cold_location_1" model="stock.location">
+            <field name="name">Cold Storage</field>
+            <field name="location_id" ref="stock_location_suppliers"/>
+            <field name="chained_location_type">fixed</field>
+            <field name="chained_location_id" ref="stock_location_customers"/>
+            <field name="chained_auto_packing">auto</field>
+            <field name="usage">internal</field>
+        </record>
 
         <record id="journal_delivery" model="stock.journal">
             <field name="name">Delivery Orders</field>
@@ -103,6 +111,16 @@
             <field name="chained_picking_type">out</field>
             <field name="chained_journal_id" ref="journal_delivery"/>
         </record>
+        
+        <record id="refrigerate_location_stock" model="stock.location">
+            <field name="name">Refrigerated Vehicles</field>
+            <field name="location_id" ref="stock_location_company"/>
+            <field name="chained_auto_packing">auto</field>
+            <field name="chained_location_type">fixed</field>
+            <field name="usage">internal</field>
+            <field name="chained_location_id" ref="cold_location_1"/>
+        </record>
+        
         <record id="stock_location_stock" model="stock.location">
             <field name="name">Stock</field>
             <field name="location_id" ref="stock_location_company"/>

=== modified file 'stock/stock_demo.xml'
--- stock/stock_demo.xml	2011-11-11 13:16:21 +0000
+++ stock/stock_demo.xml	2011-11-30 11:16:32 +0000
@@ -9,6 +9,14 @@
         <!--
     Resource: stock.location
     -->
+        <record id="chain_location_1" model="stock.location">
+            <field name="name">Cold Storage</field>
+            <field name="location_id" ref="stock_location_suppliers"/>
+            <field name="chained_location_type">fixed</field>
+            <field name="chained_location_id" ref="stock_location_customers"/>
+            <field name="chained_auto_packing">auto</field>
+            <field name="usage">internal</field>
+        </record>
         <record id="stock_location_3" model="stock.location">
             <field name="name">IT Suppliers</field>
             <field name="location_id" ref="stock_location_suppliers"/>

=== modified file 'stock/stock_demo_picking.yml'
--- stock/stock_demo_picking.yml	2011-11-09 15:23:27 +0000
+++ stock/stock_demo_picking.yml	2011-11-30 11:16:32 +0000
@@ -1,9 +1,13 @@
 -
+  Create a picking
+-
   !record {model: stock.picking, id: stock_picking_1}:
     type: out
     company_id: base.main_company
     address_id: res_partner_address_fabien0
 -
+  Create a move
+-
   !record {model: stock.move, id: stock_move_1}:
     product_id: product.product_product_cpu1
     product_uom: product.product_uom_unit
@@ -14,6 +18,8 @@
     name: CPU1, Processor AMD Athlon XP 1800
     picking_id: stock_picking_1
 -
+  Create another move
+-
   !record {model: stock.move, id: stock_move_2}:
     product_id: product.product_product_cpu3
     product_uom: product.product_uom_unit
@@ -23,3 +29,15 @@
     location_id: stock.stock_location_stock
     name: CPU3, Processor AMD Athlon XP 1800
     picking_id: stock_picking_1
+-
+  Create one more move
+-
+  !record {model: stock.move, id: stock_move_3}:
+    product_id: product.product_product_pc1
+    product_uom: product.product_uom_unit
+    product_uos_qty: 5.0
+    product_qty: 5.0
+    location_dest_id: stock.stock_location_customers
+    location_id: stock.stock_location_stock
+    name: PC1, Basic PC
+    picking_id: stock_picking_1

=== added file 'stock/test/cancel_stock.yml'
--- stock/test/cancel_stock.yml	1970-01-01 00:00:00 +0000
+++ stock/test/cancel_stock.yml	2011-11-30 11:16:32 +0000
@@ -0,0 +1,46 @@
+-
+  In order to test the cancel stock. I start from cancelling the incoming shipment.
+-
+  First, I create copies of incoming shipment.
+-
+  !python {model: stock.picking}: |
+    stock = self.pool.get('stock.move')
+    context.update({'active_id':ref('stock.stock_picking_1')})
+    id1 = self.copy(cr, uid, ref('stock.stock_picking_1'), context)
+    id2 = self.copy(cr, uid, ref('stock.stock_picking_1'), context)
+    id3 = self.copy(cr, uid, ref('stock.stock_picking_1'), context)
+    context.update({'id1':id1,'id2':id2,'id3':id3})
+-
+  Now, I cancel all related moves of picking so automatically picking goes to cancelled state..
+-
+  !python {model: stock.picking}: |
+    import netsvc
+    wf_service = netsvc.LocalService("workflow")
+    stock = self.pool.get('stock.move')
+    pick = self.browse(cr, uid, context.get('id1'))
+    move_ids = stock.search(cr, uid, [('picking_id','=',pick.name)])
+    for move in move_ids:
+      wf_service.trg_validate(uid, 'stock.move', move, 'action_confirm', cr)
+      stock.force_assign(cr, uid, move)
+      wf_service.trg_validate(uid, 'stock.move', move, 'action_cancel', cr)
+-
+  Now, directlly cancel the picking.
+-
+  !python {model: stock.picking}: |
+    import netsvc
+    wf_service = netsvc.LocalService("workflow")
+    pick_id = context.get('id2')
+    wf_service.trg_validate(uid, 'stock.picking', pick_id, 'button_cancel', cr)
+-
+  I return the picking.
+-
+  !python {model: stock.picking}: |
+    copy_id = context.get('id3')
+    self.draft_force_assign(cr, uid, [copy_id])
+    self.force_assign(cr, uid, [copy_id])
+    stock_partial_picking = self.pool.get('stock.partial.picking')
+    context.update({'active_model': 'stock.picking','active_ids': [copy_id],'active_id': copy_id})
+    partial_id = stock_partial_picking.create(cr, uid, {}, context=context)
+    stock_partial_picking.do_partial(cr, uid, [partial_id], context)
+    return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, context)
+    self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context)

=== added file 'stock/test/delete_stock.yml'
--- stock/test/delete_stock.yml	1970-01-01 00:00:00 +0000
+++ stock/test/delete_stock.yml	2011-11-30 11:16:32 +0000
@@ -0,0 +1,25 @@
+-
+  In order to test the delete stock, create a copy of picking.
+-
+  First, I create copy of picking.
+-
+  !python {model: stock.picking}: |
+    context.update({'active_id':ref('stock.stock_picking_1')})
+    pick = self.browse(cr, uid, ref('stock.stock_picking_1'))
+    stock = self.pool.get('stock.move')
+    move_ids = stock.search(cr, uid, [('picking_id','=',pick.name)])
+    id1 = self.copy(cr, uid, ref('stock.stock_picking_1'), context)
+    move_id = stock.copy(cr, uid, move_ids[0],context)
+    context.update({'id1':id1,'move':move_id})
+-
+  Now, I delete a related moves of picking.
+-
+  !python {model: stock.move}: |
+    move = context.get('move')
+    self.unlink(cr, uid, [move])
+-
+  Now, directlly delete the picking.
+-
+  !python {model: stock.picking}: |
+    id = context.get('id1')
+    self.unlink(cr, uid, [id])

=== renamed file 'stock/test/stock_test_wizard.yml' => 'stock/test/stock_chain_location.yml'
--- stock/test/stock_test_wizard.yml	2011-08-29 10:58:54 +0000
+++ stock/test/stock_chain_location.yml	2011-11-30 11:16:32 +0000
@@ -1,78 +1,36 @@
-
--
-  I create stock.tracking record.
--
-  !record {model: stock.tracking, id: stock_tracking_0}:
-    move_ids:
-      - product_id: product.product_product_pc1
-        product_qty: 5.0
-        product_uom: product.product_uom_unit
-        location_id : stock.stock_location_suppliers
-        location_dest_id: stock.stock_location_shop0
-        name : '[PC1] Basic PC'
-        date_expected : !eval time.strftime('%Y-%m-%d %H:%M:%S')
-    name: 0000007
-    active: True
+-
+  In order to test the chain location functionality,
+  I create stock production lot for product 'Sprouting Foods'.
+-
+  !record {model: stock.production.lot, id: stock_production_lot2}:
+    product_id: product.product_product_sprouting
     date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-
--
-  I trace the information of a product.
--
-  !python {model: stock.tracking}: |
-     self.name_get(cr, uid, [ref('stock_tracking_0')],{'lang': 'en_US', 'tz': False, 'active_model': 'ir.ui.menu', 'field': '', 'type': ''})
-     self.action_traceability(cr,uid,[ref('stock_tracking_0')], {'lang': 'en_US', 'tz': False, 'active_model': 'ir.ui.menu', 'field': '', 'type': ''})
-
--
-  I creat stock.move Record
--
-  !record {model: stock.move, id: stock_move_test0}:
-    location_dest_id: stock.stock_location_shop0
-    product_id: product.product_product_pc1
-    product_qty: 5.0
-    product_uom: product.product_uom_unit
-    date_expected : !eval time.strftime('%Y-%m-%d %H:%M:%S')
-    location_id : stock.stock_location_suppliers
-    name : '[PC1] Basic PC'
-    company_id: base.main_company
-    product_uos_qty : 5.0
-    name: IN/00010
-    state: assigned
-
--
-  I Check  onchange function of stock.move object
--
-  !python {model: stock.move }: |
-    self.onchange_lot_id(cr, uid, [ref("stock_move_test0")], ref("stock.stock_production_lot0"), 5, ref("stock.stock_location_suppliers"), ref("product.product_product_pc1"), ref("product.product_uom_unit"), None)
-    self.onchange_quantity(cr, uid, [ref("stock_move_test0")], ref("product.product_product_pc1"), 10, ref("product.product_uom_unit"), ref("product.product_uom_unit"))
-    self.onchange_uos_quantity(cr, uid, [ref("stock_move_test0")], ref("product.product_product_pc1"), 10, ref("product.product_uom_unit"), ref("product.product_uom_unit"))
-    self.onchange_product_id(cr, uid, [ref("stock_move_test0")], ref("product.product_product_pc1"), ref("stock.stock_location_suppliers"), ref("stock.stock_location_shop0"), False)
-
--
-  I Check _getSSCC  and action_partial_move function of stock.move object
--
-  !python {model: stock.move }: |
-    context = {"lang": 'en_US', "default_location_dest_id": ref("stock.stock_location_shop0"), "active_model":
-      "stock.move", "search_default_receive": 1, 'product_receive': True, "default_location_id": ref("stock.stock_location_suppliers"),"active_ids":[ref("stock_move_test0")], "tz": False, "active_id":ref("stock_move_test0")}
-    self._getSSCC(cr, uid , context)
-    self.action_partial_move(cr, uid , [ref("stock_move_test0")], context)
-
--
-  I check write function
--
-  !python {model: stock.move }: |
-    vals = {"product_qty" : 2, "product_uos_qty": 2}
-    self.write(cr, uid, [ref("stock_move_test0")], vals, {"lang": 'en_US', "default_location_dest_id": ref("stock.stock_location_shop0"), "active_model":
-      "ir.ui.menu", "search_default_receive": 1, 'product_receive': True, "default_location_id": ref("stock.stock_location_suppliers"),"active_ids":[ref("stock_move_tree")], "tz": False, "active_id":ref("stock_move_tree")})
-
--
-  I check default function
--
-  !python {model: stock.move }: |
-    self.name_get(cr, uid, [ref("stock_move_test0")], {"lang": 'en_US', "default_location_dest_id": ref("stock.stock_location_shop0"), "active_model":
-      "stock.move", "search_default_receive": 1, 'product_receive': True, "default_location_id": ref("stock.stock_location_suppliers"),"active_ids":[ref("stock_move_test0")], "tz": False, "active_id":ref("stock_move_test0")})
-    ctx = {"lang": 'en_US', "default_location_dest_id": ref("stock.stock_location_shop0"), "active_model":
-      "ir.ui.menu", "search_default_receive": 1, 'product_receive': True, "default_location_id": ref("stock.stock_location_suppliers"),"active_ids":[ref("view_move_form_reception_picking")], "tz": False, "active_id":ref("view_move_form_reception_picking")}
-    self._default_location_destination(cr, uid, ctx)
-    self._default_location_source(cr, uid, ctx)
-
+    name: 0000002
+-
+  I update product 'Sprouting Foods' with the help of 'Change Product Quantity' wizard
+  and assign a location 'Refrigerated Vehicles' to test the chained location flow.
+-
+  !python {model: stock.change.product.qty}: |
+    product = self.pool.get('product.product').browse(cr, uid, ref('product.product_product_sprouting'))
+    fields = {'location_id' : ref('refrigerate_location_stock'), 'new_quantity': 1, 'product_id': product.id, 'prodlot_id': ref('stock.stock_production_lot2')}
+    ids = self.create(cr, uid, fields)
+    self.change_product_qty(cr, uid, [ids], {'active_model':'product.product', 'active_id': product.id, 'active_ids':[product.id]})
+-
+  I check stock moves of product 'Sprouting Foods'.
+-
+  !python {model: stock.move}: |
+    ids = self.search(cr, uid, [('product_id','=',ref('product.product_product_sprouting'))])
+    for i in self.browse(cr, uid, ids):
+      assert i.product_qty >= 1,"Product is not correspond"
+      if i.location_id.name == 'Inventory loss':
+        assert i.location_dest_id.name == 'Refrigerated Vehicles',"Destination location must be 'Refrigerated Vehicles'"
+      if i.location_id.name == 'Refrigerated Vehicles':
+        assert i.location_dest_id.name == 'Cold Storage',"Destination location must be 'Cold Storage' because the source location is 'Refrigerated Vehicles'"
+      if i.location_id.name == 'Cold Storage':
+        assert i.location_dest_id.name == 'Customers',"Destination location must be 'Customers' because the source location is 'Cold Storage'"
+-
+  I trace the stock production lot for product 'Sprouting Foods'.
+-
+  !python {model: stock.production.lot }: |
+    self.action_traceability(cr,uid,[ref('stock_production_lot2')], {'active_model': 'ir.ui.menu', 'field': '', 'type': ''})
 

=== modified file 'stock/test/stock_demo_backorder.yml'
--- stock/test/stock_demo_backorder.yml	2011-11-09 16:21:48 +0000
+++ stock/test/stock_demo_backorder.yml	2011-11-30 11:16:32 +0000
@@ -1,26 +1,25 @@
-- 
-  In order to test partial delivery and back orders, I will use a delivery order with 5 CPU1 and 5 CPU3
--
-  I confirm and force the availability of all products on the picking OUT001
-- 
+-
+  In order to test partial delivery and back orders,
+  I select a delivery order of CPU1 and CPU3 product each contain five quantities.
+-
+  I confirm the picking 'OUT001' and make it available .
+-
   !python {model: stock.picking}: |
     self.draft_force_assign(cr, uid, [ref('stock.stock_picking_1')], {})
     self.force_assign(cr, uid, [ref('stock.stock_picking_1')], {})
 -
-  After having confirmed the picking and its two lines, I add a new move line in draft state with 7 FAN2
+  After confirmed the picking and its two lines,
+  I add a new move line in draft state with 'FAN2' of seven quantities.
 -
   !record {model: stock.move, id: stock_move_3}:
     product_id: product.product_product_fan2
-    product_uom: product.product_uom_unit
-    product_uos_qty: 7.0
     product_qty: 7.0
     location_dest_id: stock.stock_location_customers
     location_id: stock.stock_location_stock
-    name: CPU3, Processor AMD Athlon XP 1800
     picking_id: stock_picking_1
 - |
   I click on 'Process Now' to process the delivery order and I change quantities to:
-  7 CPU1, 0 CPU3, 3 FAN2 and a new product of 4 PC1
+  seven for CPU1, zero for CPU3, three for FAN2 and a new product PC1 for four quantites for test the partial delivery.
 -
   !python {model: stock.picking}: |
     result = self.action_process(cr, uid, [ref('stock.stock_picking_1')], {})['res_id']
@@ -49,17 +48,32 @@
     }, {})
     self.pool.get('stock.partial.picking').do_partial(cr, uid, [result], {})
 -
-  I test that the back order contains 5 CPU3, 4 FAN2 and nothing else
+  I test that the back order contains five CPU3 and four FAN2.
 -
   !python {model: stock.picking}: |
     pick = self.browse(cr, uid, ref('stock.stock_picking_1'), {})
     for line in pick.move_lines:
         if line.product_id.id == ref('product.product_product_cpu3'):
-            assert line.product_qty == 5.0, "Wrong quantity %.2f for CPU3 back order" % (line.product_qty,)
+            assert line.product_qty == 5.0, "Wrong quantity %s for CPU3 back order" % (line.product_qty,)
         elif line.product_id.id == ref('product.product_product_fan2'):
-            assert line.product_qty == 4.0, "Wrong quantity %.2f for FAN2 back order" % (line.product_qty,)
+            assert line.product_qty == 4.0, "Wrong quantity %s for FAN2 back order" % (line.product_qty,)
         elif line.product_id.id == ref('product.product_product_pc1'):
             assert line.product_qty == 0.0, "Wrong quantity for PC1 back order"
         else:
             assert line.product_qty == 0.0, "Wrong quantity for %s back order" % (line.product_id.code,)
+-
+  After the partial picking I check the delivery order or backorder and stock moves.
+-
+  !python {model: stock.picking}: |
+    result = self.search(cr, uid, [('name','=','OUT/00001')])
+    pick = self.pool.get('stock.picking').browse(cr, uid, result)
+    stock = self.pool.get('stock.move')
+    assert pick[0].state == 'assigned',"After partial picking the remaining product's delivery order must be in 'Ready to process' state"
+    assert pick[0].backorder_id.state == 'done',"The backorder state should be 'Done'"
+    done_move = stock.search(cr, uid, [('picking_id','=',pick[0].backorder_id.id)])
+    assign_move = stock.search(cr, uid, [('picking_id','=',pick[0].id)])
+    for move in stock.browse(cr, uid, done_move):
+      assert move.state == 'done',"Stock move of %s picking should be in 'Done' state"%(move.picking_id)
+    for move in stock.browse(cr, uid, assign_move):
+      assert move.state == 'assigned' or 'draft',"Stock move of %s picking should be in 'Available' state"%(move.picking_id)
 

=== added file 'stock/test/stock_new_pack.yml'
--- stock/test/stock_new_pack.yml	1970-01-01 00:00:00 +0000
+++ stock/test/stock_new_pack.yml	2011-11-30 11:16:32 +0000
@@ -0,0 +1,24 @@
+-
+  In order to test the new packing from the existing one, First I create a pack.
+-
+  !record {model: stock.tracking, id: stock_tracking_0}:
+    name: 0000007
+    date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
+-
+  I have to take one delivery order move and set the craeted pack.
+-
+  !record {model: stock.move, id: stock_move_3}:
+    tracking_id: stock_tracking_0
+-
+  I split the picking in to two quantities.
+-
+  !python {model: stock.move }: |
+    move_ids=self.browse(cr,uid,ref('stock_move_3'))
+    old_moves = self.search(cr, uid, [('picking_id','=',move_ids.picking_id.id)])
+    split_obj=self.pool.get('stock.split.into')
+    split_id = split_obj.create(cr, uid, { 'quantity': 1 })
+    split_obj.split(cr, uid, [split_id],{"active_model": "stock.move", "active_ids": [ref('stock_move_3')],"active_id": ref('stock_move_2')})
+    moves = self.search(cr, uid, [('picking_id','=',move_ids.picking_id.id)])
+    assert len(moves) > len(old_moves),"After spliting the picking, new move should be created"
+    new_move = self.browse(cr, uid, moves[-1])
+    assert new_move.tracking_id,"After spliting the picking, new move should be created with new pack"

=== added file 'stock/test/stock_physical_inventory.yml'
--- stock/test/stock_physical_inventory.yml	1970-01-01 00:00:00 +0000
+++ stock/test/stock_physical_inventory.yml	2011-11-30 11:16:32 +0000
@@ -0,0 +1,43 @@
+-
+  In order to test the stock module, I start it from physical inventory.
+-
+  I create a record for physical inventory and change the product quantity zero by making a physical inventory.
+-
+   !record {model: stock.inventory, id: stock_physical_inventory0}:
+    company_id: base.main_company
+    date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
+    name: Physical inventory
+    state: draft
+-
+  Now, Define the location for import inventory.
+-
+  !record {model: stock.fill.inventory, id: stock_fill_inventory_0}:
+    location_id: stock.stock_location_stock
+    recursive: False
+    set_stock_zero: True
+-
+  I fill inventory.
+-
+  !python {model: stock.fill.inventory}: |
+    context = {"full": "1", "active_model": "stock.inventory", "active_ids":[ref("stock_physical_inventory0")], "active_id": ref("stock_physical_inventory0")}
+    self.view_init(cr, uid, ["set_stock_zero", "location_id", "recursive"], context)
+    try:
+      self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context)
+    except:
+      pass
+-
+  I confirm the inventory.
+-
+  !python {model: stock.inventory}: |
+   inventory = self.browse(cr, uid, [ref('stock_physical_inventory0')])
+   self.action_confirm(cr,uid,[ref('stock_physical_inventory0')])
+   assert inventory[0].state == 'confirm',"After confirm the inventory it should be in 'Confirm' state"
+   for line in inventory[0].inventory_line_id:
+     assert line.product_qty == 0.0,"Product Quantity should be Zero"
+   self.action_done(cr,uid,[ref('stock_physical_inventory0')])
+-
+  I check the inventory after validation.
+-
+  !python {model: stock.inventory}: |
+   inventory = self.browse(cr, uid, [ref('stock_physical_inventory0')])
+   assert inventory[0].state == 'done',"After validate the inventory it should be in 'Done' state"

=== modified file 'stock/test/stock_report.yml'
--- stock/test/stock_report.yml	2011-01-14 00:11:01 +0000
+++ stock/test/stock_report.yml	2011-11-30 11:16:32 +0000
@@ -27,7 +27,7 @@
 -
   !python {model: stock.picking}: |
     import netsvc, tools, os
-    (data, format) = netsvc.LocalService('report.stock.picking.list').create(cr, uid, [ref('stock.stock_picking_0')], {}, {})
+    (data, format) = netsvc.LocalService('report.stock.picking.list').create(cr, uid, [ref('stock.stock_picking_1')], {}, {})
     if tools.config['test_report_directory']:
         file(os.path.join(tools.config['test_report_directory'], 'stock-picking_list'+format), 'wb+').write(data)
 -

=== added file 'stock/test/stock_scrap_move.yml'
--- stock/test/stock_scrap_move.yml	1970-01-01 00:00:00 +0000
+++ stock/test/stock_scrap_move.yml	2011-11-30 11:16:32 +0000
@@ -0,0 +1,24 @@
+-
+  In order to test the scrap move, I add create a new move line in draft state with  FAN2
+-
+  !record {model: stock.move, id: stock_move_4}:
+    product_id: product.product_product_fan2
+    product_qty: 4.0
+    location_dest_id: stock.stock_location_customers
+    location_id: stock.stock_location_stock
+-
+  Now, with the help of 'Scrap Move' wizard, I scap the move of same Quantity.
+-
+  !python {model: stock.move.scrap}: |
+    context = {'active_model':'stock.move', 'active_id': ref('stock_move_4'), 'active_ids': [ref('stock_move_4')]}
+    values = self.default_get(cr, uid, ['location_id','product_id','product_uom','product_qty'], context)
+    ids = self.create(cr, uid, values)
+    self.move_scrap(cr, uid, [ids], context)
+-
+  I check Scraped Move details.
+-
+  !python {model: stock.move}: |
+    ids = self.search(cr, uid, [('product_id','=',ref('product.product_product_fan2'))])
+    for scrap_move in self.browse(cr, uid, ids):
+      if scrap_move.product_qty == 4.0 and scrap_move.location_dest_id == ref('stock_location_scrapped'):
+        assert scrap_move.state == 'done',"The scraped move should be in Done state"

=== renamed file 'stock/test/stock_test.yml' => 'stock/test/stock_update.yml'
--- stock/test/stock_test.yml	2011-10-16 01:28:00 +0000
+++ stock/test/stock_update.yml	2011-11-30 11:16:32 +0000
@@ -1,425 +1,44 @@
-
--
-  In order to test the stock module, I will create product,
-  create physical inventory ,fill inventory lines from location,split inventory line into production lot
--
-  I create Stock Production Lot for product PC3
+-
+  I update the current stock of the product '[CPU2]High speed processor config'.
+-
+  I assignd the created location in to warehouse.
+-
+  !record {model: stock.warehouse, id: stock.warehouse0}:
+    lot_stock_id: stock_location_stock
+-
+  I create stock production lot for '[CPU2]High speed processor config' product.
 -
   !record {model: stock.production.lot, id: stock_production_lot0}:
-    product_id: product.product_product_pc3
+    product_id: product.product_product_cpu2
     date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
     name: 0000001
 -
-  I trace the Stock Production Lot for product PC3.
+  I take '[CPU2]High speed processor config' product and with the help of 'Change Product Quantity' wizard update the product stock.
+-
+  !python {model: stock.change.product.qty}: |
+    product = self.pool.get('product.product').browse(cr, uid, ref('product.product_product_cpu2'))
+    fields = {'location_id' : ref('stock_location_stock'), 'new_quantity': 5, 'product_id': product.id, 'prodlot_id': ref('stock.stock_production_lot0')}
+    ids = self.create(cr, uid, fields)
+    self.change_product_qty(cr, uid, [ids], {'active_model':'product.product', 'active_id': product.id, 'active_ids':[product.id]})
+    assert product.qty_available == 5,'Product Quantity is not Updated'
+-
+  I trace the stock production lot for '[CPU2]High speed processor config' product.
 -
   !python {model: stock.production.lot }: |
     self.action_traceability(cr,uid,[ref('stock_production_lot0')], {'lang': 'en_US', 'tz': False, 'active_model': 'ir.ui.menu', 'field': '', 'type': ''})
-
--
-  I create change product quantity for product PC3.
--
-  !record {model: stock.change.product.qty, id: stock_change_product_qty0}:
-    product_id: product.product_product_pc3
-    new_quantity: 100
-    location_id: stock.stock_location_stock
-    prodlot_id: stock.stock_production_lot0
-
--
-  I apply the new quantity on product PC3.
--
-  !python {model: stock.change.product.qty }: |
-    context = {"lang": 'en_US', "active_model":
-      "product.product", "active_ids": [ref("product.product_product_pc3")], "tz": False, "active_id":ref('product.product_product_pc3')}
-    self.default_get(cr, uid, ["prodlot_id", "location_id", "new_quantity", "product_id"], context)
-    self.fields_view_get(cr, uid, ref("stock.view_change_product_quantity"),"form", context)
-    self.change_product_qty(cr, uid, [ref("stock_change_product_qty0")], {"lang": 'en_US', "active_model":
-      "stock.change.product.qty", "active_ids": ref("product.product_product_pc3"), "tz": False, "active_id":ref('product.product_product_pc3')})
-
--
-  I check that the quantity on product PC3 is updated.
--
-  !python {model: product.product }: |
-    pro_obj = self.browse(cr, uid, ref("product.product_product_pc3"))
-    assert (pro_obj.qty_available >= 100) , "The quantity of PC3 is not updated!"
-
--
-  I Read quantity on product PC3.
--
-  !python {model: stock.location }: |
-    self.read(cr, uid, [ref("stock.stock_location_stock")],['stock_real_value','stock_virtual'], {'lang': 'en_GB', 'tz': False, 'active_model': 'product.product', 'bin_size': True, 'active_ids': [ref("product.product_product_pc3")], 'product_id':ref("product.product_product_pc3"), 'active_id': ref("product.product_product_pc3")})
-
-- 
-  I Creating a chained stock.location record
-- 
-  !record {model: stock.location, id: stock_location_loc0}:
-    chained_auto_packing: auto
-    chained_delay: 0.0
-    chained_location_id: stock.stock_location_customers
-    chained_location_type: fixed
-    location_id: stock.stock_location_company
-    name: chain location
-    parent_left: 2
-    parent_right: 3
-    usage: internal
-
--
-  I create Product By location chart for stock.location.product Object.
--
-  !record {model: stock.location.product, id: stock_location_product0}:
-    from_date: '2011-07-01 00:00:00'
-    to_date: '2011-07-31 23:59:00'
-
--
-  I open product chart.
--
-  !python {model: stock.location.product }: |
-    self.action_open_window(cr, uid, [ref("stock_location_product0")], {'lang': 'en_US', 'full': 1, 'tz': False, 'active_model': 'stock.location', 'search_default_in_location': 1, 'active_ids': [ref("stock.stock_location_stock")], 'active_id': ref("stock.stock_location_stock")})
-
--
-  I open product form from stock.location object .
--
-  !python {model: product.product }: |
-    self.fields_view_get(cr, uid, False, "tree", {'lang': 'en_US', 'full': 1, 'tz': False, 'active_model': 'stock.location', 'location': ref('stock.stock_location_stock'), 'search_default_in_location': 1, 'active_ids': [ref("stock.stock_location_stock")], 'active_id': ref("stock.stock_location_stock")})
-
--
-  I create change product standard price for product PC3.
--
-  !record {model: stock.change.standard.price, id: stock_change_standard_price0}:
-    new_price: 1515
-    stock_account_input: account.a_recv
-    stock_account_output: account.a_pay
-    stock_journal: account.expenses_journal
-    enable_stock_in_out_acc: True
-
--
-  I apply the new product standard price on product PC3.
--
-  !python {model: stock.change.standard.price }: |
-    context = {"lang": 'en_US', "active_model":
-      "product.product", "active_ids": [ref("product.product_product_pc3")], "tz": False, "active_id":ref('product.product_product_pc3')}
-    self.default_get(cr, uid, ["new_price"], context)
-    self.change_price(cr, uid, [ref("stock_change_product_qty0")], context)
-
--
-  I create Physical Inventory for the products.
--
-   !record {model: stock.inventory, id: stock_inventory_physicalinventoy0}:
-    company_id: base.main_company
-    date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-    inventory_line_id:
-      - company_id: base.main_company
-        location_id: stock.stock_location_stock
-        product_id: product.product_product_pc3
-        product_qty: 10.0
-        product_uom: product.product_uom_unit
-      - company_id: base.main_company
-        location_id: stock.stock_location_stock
-        product_id: product.product_product_pc1
-        product_qty: 10.0
-        product_uom: product.product_uom_unit
-    name: Physical inventory
-    state: draft
-
--
-  I create merge Inventory for the products.
--
-   !record {model: stock.inventory, id: stock_inventory_mergeinventoy0}:
-    company_id: base.main_company
-    date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-    inventory_line_id:
-      - company_id: base.main_company
-        location_id: stock.stock_location_stock
-        product_id: product.product_product_pc3
-        product_qty: 20.0
-        product_uom: product.product_uom_unit
-      - company_id: base.main_company
-        location_id: stock.stock_location_stock
-        product_id: product.product_product_pc1
-        product_qty: 20.0
-        product_uom: product.product_uom_unit
-    name: Physical inventory
-    state: draft
-
--
-  I merge inventory .
--
-  !python {model: stock.inventory.merge}: |
-    context = {"lang": 'en_US',
-      "full": "1", "tz": False, "active_model": "stock.inventory", "active_ids":
-      [ref("stock_inventory_physicalinventoy0"), ref("stock_inventory_mergeinventoy0")], "active_id": ref("stock_inventory_physicalinventoy0"), }
-    self.fields_view_get(cr, uid, False, "form", context)
-    self.do_merge(cr, uid, [ref("stock_inventory_mergeinventoy0")], context)
-
--
-  I create stock.inventory.line record.
--
-  !record {model: stock.inventory.line, id: stock_inventory_line}:
-    product_id: product.product_product_pc1
-    product_uom: product.product_uom_unit
-    product_qty: 10
-    inventory_id: stock_inventory_mergeinventoy0
-    location_id: stock.stock_location_stock
-
--
-  I Change a Product oF stock.inventory.line record.
--
-  !python {model: stock.inventory.line}: |
-    self.on_change_product_id(cr, uid, [ref("stock_inventory_line")], ref('stock.stock_location_stock'), ref('product.product_product_pc3'), False, False)
-
--
-  I create stock.fill.inventory .
--
-  !record {model: stock.fill.inventory, id: stock_fill_inventory_0}:
-    location_id: stock.stock_location_stock
-    recursive: False
-    set_stock_zero: False
-
--
-  I fill inventory for PC3.
--
-  !python {model: stock.fill.inventory}: |
-    context = {"lang": 'en_US',"full": "1", "tz": False, "active_model": "stock.inventory", "active_ids":
-      [ref("stock_inventory_physicalinventoy0")], "active_id": ref("stock_inventory_physicalinventoy0")}
-    self.view_init(cr, uid, ["set_stock_zero", "location_id", "recursive"], context)
-    self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context)
-
--
-  I split the PC3 inventory line to create 5 PC3 with production lot 00002-stock-test
--
-  !record {model: stock.inventory.line.split, id: stock_inventory_line_0}:
-    line_ids:
-      - name: '00002-stock-test'
-        quantity: 5
-    product_id: product.product_product_pc1
-    product_uom: product.product_uom_unit
-    use_exist: False
-    qty: 10
--
-  I confirm the split operation
--
-  !python {model: stock.inventory.line}: |
-    line_ids = self.search(cr, uid, [('inventory_id','=',ref('stock_inventory_physicalinventoy0')),
-                                     ('product_id','=',ref('product.product_product_pc1'))])
-    assert line_ids, 'Inventory lines are missing'
-    self.pool.get('stock.inventory.line.split').split_lot(cr, uid, [ref("stock_inventory_line_0")],
-                                                            {'active_model': 'stock.inventory.line',
-                                                             'active_ids': [line_ids[0]]})
--
-  I confirm the Inventory for PC3.
--
-  !python {model: stock.inventory}: |
-   self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')])
-   self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')])
--
-  I cancel the Inventory for PC3.
--
-  !python {model: stock.inventory}: |
-   self.action_cancel_inventary(cr,uid,[ref('stock_inventory_physicalinventoy0')])
-
--
-  I change inventory state to draft for PC3.
--
-  !python {model: stock.inventory}: |
-   self.action_cancel_draft(cr,uid,[ref('stock_inventory_physicalinventoy0')])
-
--
-  In Order to test the picking I create picking with move lines.
--
-  !record {model: stock.picking, id: stock_picking_0}:
-    name: test_picking
-    address_id: base.res_partner_address_4
-    company_id: base.main_company
-    date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-    invoice_state: 2binvoiced
-    move_lines:
-      - company_id: base.main_company
-        date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-        location_dest_id: stock.stock_location_loc0
-        location_id: stock.stock_location_stock
-        name: PC3
-        product_id: product.product_product_pc3
-        product_qty: 100.0
-        product_uom: product.product_uom_unit
-        date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-        product_uos_qty: 100.0
-    move_type: direct
-    type: out
-
--
-  I split the picking with a first batch of 20 PCs
--
-  !python {model: stock.picking }: |
-    pick=self.browse(cr,uid,ref('stock_picking_0'))
-    split_obj=self.pool.get('stock.split.into')
-    partial_datas={}
-    move=pick.move_lines[0]
-    partial_datas= {
-          'quantity': 20,
-      }
-    split_id = self.pool.get('stock.split.into').create(cr, uid, partial_datas)
-    split_obj.split(cr, uid, [split_id], {"lang": "en_US", "tz":
-    False, "active_model": "stock.move", "active_ids": [move.id],
-    "active_id": move.id, })
-
--
-  I click on draft_force_assign on picking.
--
-  !python {model: stock.picking}: |
-    self.draft_force_assign(cr, uid, [ref("stock_picking_0")], {"lang": "en_US", "active_model":
-      "ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display":
-      "partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id":
-      ref("stock.menu_action_picking_tree6"), })
-
--
-  I click on action_assign on picking.
--
-  !python {model: stock.picking}: |
-    self.action_assign(cr, uid, [ref("stock_picking_0")], {"lang": "en_US", "active_model":
-      "ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display":
-      "partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id":
-      ref("stock.menu_action_picking_tree6"), })
-
--
-  I process the partial picking with 20 PCE
--
-  !python {model: stock.picking }: |
-   pick = self.browse(cr,uid,ref('stock_picking_0'))
-   stock_partial_move = self.pool.get('stock.partial.move')
-   partial_id = stock_partial_move.create(cr, uid, {},
-           context={'active_model': 'stock.move',
-                    'active_ids': [x.id for x in pick.move_lines]})
-   stock_partial_move.do_partial(cr, uid, [partial_id])
--
-  I Performing an osv_memory action split_lot on module stock.move.split
--
-
-  !python {model: stock.picking }: |
-    split_obj=self.pool.get('stock.move.split')
-    split_move_lines=self.pool.get('stock.move.split.lines')
-    pick=self.browse(cr,uid,ref('stock_picking_0'))
-    partial_datas={}
-    move=pick.move_lines[0]
-    partial_datas= {
-          'product_id': move.product_id.id,
-          'qty': 80,
-          'product_uom': move.product_uom.id,
-          'use_exist': move.picking_id and move.picking_id.type=='out' and True or False
-      }
-    split_id = self.pool.get('stock.move.split').create(cr, uid, partial_datas, context={})
-    split_move_data= {
-          'lot_id': split_id,
-          'quantity': 10,
-          'name': 'lot',
-    }
-    split_move_id = split_move_lines.create(cr, uid, split_move_data, context={})
-    split_obj.default_get(cr, uid, ["product_id", "product_uom", "line_exist_ids", "qty",
-     "line_ids", "use_exist"], {'lang': 'en_US', 'default_location_dest_id': ref('stock.stock_location_stock'), 'tz': False, 'active_model': 'stock.move', 'search_default_receive': 1, 'product_receive': True, 'active_ids': [move.id], 'default_location_id': ref('stock.stock_location_locations'), 'active_id': move.id})
-    split_obj.split_lot(cr, uid, [split_id], context={"lang": "en_US", "tz":
-    False, "active_model": "stock.move", "scrap": True, "active_ids": [move.id],
-    "active_id": move.id, })
-
--
-  I Performed an osv_memory action move_scrap on module stock.move.scrap
--
-  !python {model: stock.picking }: |
-    location_obj = self.pool.get('stock.location')
-    scrpaed_location_ids = location_obj.search(cr, uid, [('scrap_location','=',True)])
-    pick=self.browse(cr,uid,ref('stock_picking_0'))
-    scrap_obj=self.pool.get('stock.move.scrap')
-    partial_datas={}
-    move=pick.move_lines[0]
-    partial_datas= {
-          'product_id': move.product_id.id,
-          'location_id': scrpaed_location_ids[0],
-          'product_qty': 1,
-          'product_uom': move.product_uom.id,
-      }
-    scrap_id = scrap_obj.create(cr, uid, partial_datas)
-    context = {"lang": "en_US", "tz": False, "active_model": "stock.move", 
-    "scrap": True, "active_ids": [move.id], "active_id": move.id, }
-    scrap_obj.default_get(cr, uid, ["location_id", "product_id", "product_uom", "product_qty"], context)
-    scrap_obj.move_scrap(cr, uid, [scrap_id], context)
-
--
-  I Performed an osv_memory do move consume  on module stock.move.consume
--
-  !python {model: stock.picking }: |
-    location_obj = self.pool.get('stock.location')
-    scrpaed_location_ids = location_obj.search(cr, uid, [('scrap_location','=',True)])
-    pick=self.browse(cr,uid,ref('stock_picking_0'))
-    consume_obj=self.pool.get('stock.move.consume')
-    partial_datas={}
-    move=pick.move_lines[0]
-    partial_datas= {
-          'product_id': move.product_id.id,
-          'location_id': scrpaed_location_ids[0],
-          'product_qty': 1,
-          'product_uom': move.product_uom.id,
-      }
-    context = {"lang": "en_US", "tz": False, "active_model": "stock.move", 
-    "scrap": True, "active_ids": [move.id], "active_id": move.id, }
-    consume_id = consume_obj.create(cr, uid, partial_datas)
-    consume_obj.default_get(cr, uid, ["location_id", "product_id", "product_uom", "product_qty"], context)
-    consume_obj.do_move_consume(cr, uid, [consume_id], context)
-
--
-  I process the picking with the 80 remaining PCs
--
-  !python {model: stock.picking}: |
-     stock_partial_picking = self.pool.get('stock.partial.picking')
-     partial_id = stock_partial_picking.create(cr, uid, {},
-             context={'active_model': 'stock.picking',
-                      'active_ids': [ref('stock_picking_0')]})
-     stock_partial_picking.do_partial(cr, uid, [partial_id])
--
-  I Performing an osv_memory action create_invoice on module stock.invoice.onshipping
--
-  !python {model: stock.invoice.onshipping}: |
-    invoice_line_id = self.create(cr, uid,{}, {"lang": 'en_US', "active_model":
-      "stock.picking", "active_ids": [ref("stock_picking_0")], "tz": False, "active_id":ref("stock_picking_0")})
-    self.open_invoice(cr, uid, [invoice_line_id], {"lang": "en_US",
-      "search_default_available": 1, "inv_type": "in_invoice" , "tz": False, "active_model": "stock.picking",
-      "contact_display": "partner_address", "active_ids": [ref("stock_picking_0")],
-      "active_id": ref("stock_picking_0")})
-    self._get_journal_id(cr, uid, {"lang": "en_US", "search_default_available": 1, "tz": False, "active_model": "stock.picking",
-      "contact_display": "partner_address", "active_ids": [ref("stock_picking_0")],
-      "active_id": ref("stock_picking_0"), })
-
--
-  I create a record of stock.picking and unlink a record
--
-  !python {model: stock.picking}: |
-    copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
-    ctx = {"lang": "en_US", "active_model":
-      "ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display":
-      "partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id":
-      ref("stock.menu_action_picking_tree6"), }
-    self.draft_force_assign(cr, uid, [copy_id], ctx)
-    self.unlink(cr, uid, [copy_id], ctx)
-
--
-  I create a record of stock.picking and cancel a record
--
-  !python {model: stock.picking}: |
-    copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
-    self.draft_validate(cr, uid, [copy_id], {"lang": "en_US", "search_default_available":
-      1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner_address",
-      "active_ids": [ref("stock.menu_action_picking_tree4")], "active_id": ref("stock.menu_action_picking_tree4"),
-      })
-    self.allow_cancel(cr, uid, [copy_id], context= None)
-
--
-  I process a copy of the picking and I return it
--
-  !python {model: stock.picking}: |
-    copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
-    self.draft_force_assign(cr, uid, [copy_id])
-    self.force_assign(cr, uid, [copy_id])
-    stock_partial_picking = self.pool.get('stock.partial.picking')
-    context = {'active_model': 'stock.picking',
-               'active_ids': [copy_id],
-               'active_id': copy_id}
-    partial_id = stock_partial_picking.create(cr, uid, {}, context=context)
-    stock_partial_picking.do_partial(cr, uid, [partial_id], context)
-    return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, context)
-    self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context)
+-
+  I check that physical inventory created.
+-
+  !python {model: stock.inventory.line}: |
+    ids = self.search(cr, uid, [('product_id','=',ref('product.product_product_cpu2'))])
+    inventory = self.browse(cr, uid, ids)[0]
+    assert inventory.product_id.id == ref('product.product_product_cpu2'), 'Product is not correspond'
+    assert inventory.product_qty == 5,'product Quantity is not correspond'
+    assert inventory.location_id.id == ref('stock_location_stock'), 'Location is not correspond'
+    assert inventory.state == 'done', 'State should be in Done state'
+-
+  I check that stock moves created.
+-
+  !python {model: stock.move}: |
+    ids = self.search(cr, uid, [('product_id','=',ref('product.product_product_cpu2'))])
+    assert [x.state for x in self.browse(cr, uid, ids) if x.state == 'done'], 'stock moves should be done!'

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to