Merge lp:~acsone-openerp/stock-logistic-warehouse/7.0-inventory-hierarchical-fill-lga into lp:~numerigraphe-team/stock-logistic-warehouse/7.0-inventory-hierarchical
- 7.0-inventory-hierarchical-fill-lga
- Merge into 7.0-inventory-hierarchical
Proposed by
Laetitia Gangloff (Acsone)
Status: | Superseded |
---|---|
Proposed branch: | lp:~acsone-openerp/stock-logistic-warehouse/7.0-inventory-hierarchical-fill-lga |
Merge into: | lp:~numerigraphe-team/stock-logistic-warehouse/7.0-inventory-hierarchical |
Diff against target: |
343 lines (+259/-14) 8 files modified
stock_inventory_hierarchical_location/__openerp__.py (+1/-1) stock_inventory_hierarchical_location/inventory_hierarchical_location.py (+19/-9) stock_inventory_hierarchical_location/inventory_hierarchical_location_view.xml (+1/-1) stock_inventory_hierarchical_location/tests/__init__.py (+39/-0) stock_inventory_hierarchical_location/tests/fill_inventory_test.py (+117/-0) stock_inventory_hierarchical_location/wizard/__init__.py (+1/-0) stock_inventory_hierarchical_location/wizard/stock_fill_location_inventory.py (+76/-0) stock_inventory_location/stock_inventory_location.py (+5/-3) |
To merge this branch: | bzr merge lp:~acsone-openerp/stock-logistic-warehouse/7.0-inventory-hierarchical-fill-lga |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Lionel Sausin - Initiatives/Numérigraphe | has conflicts | Needs Fixing | |
Review via email: mp+222965@code.launchpad.net |
This proposal has been superseded by a proposal from 2014-06-12.
Commit message
Description of the change
I make some change in the module stock_inventory
The goal is to take account of sub-inventories in case of an exhaustive inventory in two case :
-confirm inventory
-fill inventory
To post a comment you must log in.
Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) wrote : | # |
review:
Needs Resubmitting
(has conflicts)
Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) : | # |
review:
Needs Fixing
(has conflicts)
Unmerged revisions
- 39. By Laetitia Gangloff (Acsone)
-
stock_inventory
_hierarchical_ location: to fill inventory, check if it is an exhaustive fill to define if location should be exclude - 38. By Laetitia Gangloff (Acsone)
-
stock_inventory
_hierarchical_ location: use sub-inventories to determine missing locations and to fill inventory with the fill_inventory wizard - move test in tests and add some python test for the previous issue / stock_inventory _location: correct a mysterious problem that hapenned when many inventory ids are passed
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'stock_inventory_hierarchical_location/__openerp__.py' | |||
2 | --- stock_inventory_hierarchical_location/__openerp__.py 2014-06-10 14:04:38 +0000 | |||
3 | +++ stock_inventory_hierarchical_location/__openerp__.py 2014-06-12 15:33:45 +0000 | |||
4 | @@ -43,6 +43,6 @@ | |||
5 | 43 | "data": [ | 43 | "data": [ |
6 | 44 | "inventory_hierarchical_location_view.xml", | 44 | "inventory_hierarchical_location_view.xml", |
7 | 45 | ], | 45 | ], |
9 | 46 | "test": ["test/inventory_hierarchical_location_test.yml"], | 46 | "test": ["tests/inventory_hierarchical_location_test.yml"], |
10 | 47 | "demo": ["inventory_hierarchical_location_demo.xml"], | 47 | "demo": ["inventory_hierarchical_location_demo.xml"], |
11 | 48 | } | 48 | } |
12 | 49 | 49 | ||
13 | === modified file 'stock_inventory_hierarchical_location/inventory_hierarchical_location.py' | |||
14 | --- stock_inventory_hierarchical_location/inventory_hierarchical_location.py 2014-06-10 14:09:03 +0000 | |||
15 | +++ stock_inventory_hierarchical_location/inventory_hierarchical_location.py 2014-06-12 15:33:45 +0000 | |||
16 | @@ -44,6 +44,25 @@ | |||
17 | 44 | return super(HierarchicalExhInventory, self).action_open( | 44 | return super(HierarchicalExhInventory, self).action_open( |
18 | 45 | cr, uid, ids, context=context) | 45 | cr, uid, ids, context=context) |
19 | 46 | 46 | ||
20 | 47 | def _get_all_sub_inventories(self, cr, uid, ids, res, context=None): | ||
21 | 48 | """Get the list of all sub inventories of a list inventories | ||
22 | 49 | """ | ||
23 | 50 | for inventory in self.browse(cr, uid, ids, context=context): | ||
24 | 51 | for i in inventory.inventory_ids: | ||
25 | 52 | res.append(i.id) | ||
26 | 53 | self._get_all_sub_inventories(cr, uid, [i.id], res, context) | ||
27 | 54 | return res | ||
28 | 55 | |||
29 | 56 | def get_missing_locations(self, cr, uid, ids, context=None): | ||
30 | 57 | """Compute the list of location_ids which are missing from the lines | ||
31 | 58 | |||
32 | 59 | Here, "missing" means the location is the inventory's location or one | ||
33 | 60 | of it's children, and the inventory or a sub-inventory does not contain | ||
34 | 61 | any line with this location.""" | ||
35 | 62 | # remove location of sub inventory | ||
36 | 63 | inventory_ids = self._get_all_sub_inventories(cr, uid, ids, ids, context=context) | ||
37 | 64 | return super(HierarchicalExhInventory, self).get_missing_locations(cr, uid, inventory_ids, context=context) | ||
38 | 65 | |||
39 | 47 | # TODO v8: probably only keep the state "done" | 66 | # TODO v8: probably only keep the state "done" |
40 | 48 | def confirm_missing_locations(self, cr, uid, ids, context=None): | 67 | def confirm_missing_locations(self, cr, uid, ids, context=None): |
41 | 49 | """Do something only if children state are confirm or done.""" | 68 | """Do something only if children state are confirm or done.""" |
42 | @@ -80,12 +99,3 @@ | |||
43 | 80 | } | 99 | } |
44 | 81 | return {} | 100 | return {} |
45 | 82 | 101 | ||
46 | 83 | def _fill_location_lines(self, cr, uid, inventory_id, location_ids, | ||
47 | 84 | set_stock_zero, context=None): | ||
48 | 85 | """Add ids of children inventory into list """ | ||
49 | 86 | children_inventory_ids = self.search( | ||
50 | 87 | cr, uid, [('parent_id', 'child_of', inventory_id)]) | ||
51 | 88 | context['children_inventory_ids'] = children_inventory_ids | ||
52 | 89 | return super(HierarchicalExhInventory, self)._fill_location_lines( | ||
53 | 90 | cr, uid, inventory_id, location_ids, set_stock_zero, | ||
54 | 91 | context=context) | ||
55 | 92 | 102 | ||
56 | === modified file 'stock_inventory_hierarchical_location/inventory_hierarchical_location_view.xml' | |||
57 | --- stock_inventory_hierarchical_location/inventory_hierarchical_location_view.xml 2014-06-11 15:02:33 +0000 | |||
58 | +++ stock_inventory_hierarchical_location/inventory_hierarchical_location_view.xml 2014-06-12 15:33:45 +0000 | |||
59 | @@ -5,7 +5,7 @@ | |||
60 | 5 | <record model="ir.ui.view" id="stock_inventory_hierarchical_location_form_view"> | 5 | <record model="ir.ui.view" id="stock_inventory_hierarchical_location_form_view"> |
61 | 6 | <field name="name">hierarchical.inventory.location.form</field> | 6 | <field name="name">hierarchical.inventory.location.form</field> |
62 | 7 | <field name="model">stock.inventory</field> | 7 | <field name="model">stock.inventory</field> |
64 | 8 | <field name="inherit_id" ref="stock.view_inventory_form" /> | 8 | <field name="inherit_id" ref="stock_inventory_hierarchical.stock_inventory_hierarchical_form_view" /> |
65 | 9 | <field name="arch" type="xml"> | 9 | <field name="arch" type="xml"> |
66 | 10 | <xpath expr="/form//field[@name='exhaustive']" position="attributes"> | 10 | <xpath expr="/form//field[@name='exhaustive']" position="attributes"> |
67 | 11 | <attribute name="attrs">{'readonly':[('parent_id', '!=', False)]}</attribute> | 11 | <attribute name="attrs">{'readonly':[('parent_id', '!=', False)]}</attribute> |
68 | 12 | 12 | ||
69 | === renamed directory 'stock_inventory_hierarchical_location/test' => 'stock_inventory_hierarchical_location/tests' | |||
70 | === added file 'stock_inventory_hierarchical_location/tests/__init__.py' | |||
71 | --- stock_inventory_hierarchical_location/tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
72 | +++ stock_inventory_hierarchical_location/tests/__init__.py 2014-06-12 15:33:45 +0000 | |||
73 | @@ -0,0 +1,39 @@ | |||
74 | 1 | # -*- coding: utf-8 -*- | ||
75 | 2 | # | ||
76 | 3 | # | ||
77 | 4 | # Authors: Laetitia Gangloff | ||
78 | 5 | # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) | ||
79 | 6 | # All Rights Reserved | ||
80 | 7 | # | ||
81 | 8 | # WARNING: This program as such is intended to be used by professional | ||
82 | 9 | # programmers who take the whole responsibility of assessing all potential | ||
83 | 10 | # consequences resulting from its eventual inadequacies and bugs. | ||
84 | 11 | # End users who are looking for a ready-to-use solution with commercial | ||
85 | 12 | # guarantees and support are strongly advised to contact a Free Software | ||
86 | 13 | # Service Company. | ||
87 | 14 | # | ||
88 | 15 | # This program is free software: you can redistribute it and/or modify | ||
89 | 16 | # it under the terms of the GNU Affero General Public License as | ||
90 | 17 | # published by the Free Software Foundation, either version 3 of the | ||
91 | 18 | # License, or (at your option) any later version. | ||
92 | 19 | # | ||
93 | 20 | # This program is distributed in the hope that it will be useful, | ||
94 | 21 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
95 | 22 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
96 | 23 | # GNU Affero General Public License for more details. | ||
97 | 24 | # | ||
98 | 25 | # You should have received a copy of the GNU Affero General Public License | ||
99 | 26 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
100 | 27 | # | ||
101 | 28 | # | ||
102 | 29 | |||
103 | 30 | import fill_inventory_test | ||
104 | 31 | |||
105 | 32 | fast_suite = [ | ||
106 | 33 | ] | ||
107 | 34 | |||
108 | 35 | checks = [ | ||
109 | 36 | fill_inventory_test, | ||
110 | 37 | ] | ||
111 | 38 | |||
112 | 39 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||
113 | 0 | 40 | ||
114 | === added file 'stock_inventory_hierarchical_location/tests/fill_inventory_test.py' | |||
115 | --- stock_inventory_hierarchical_location/tests/fill_inventory_test.py 1970-01-01 00:00:00 +0000 | |||
116 | +++ stock_inventory_hierarchical_location/tests/fill_inventory_test.py 2014-06-12 15:33:45 +0000 | |||
117 | @@ -0,0 +1,117 @@ | |||
118 | 1 | # -*- coding: utf-8 -*- | ||
119 | 2 | # | ||
120 | 3 | # | ||
121 | 4 | # Authors: Laetitia Gangloff | ||
122 | 5 | # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) | ||
123 | 6 | # All Rights Reserved | ||
124 | 7 | # | ||
125 | 8 | # WARNING: This program as such is intended to be used by professional | ||
126 | 9 | # programmers who take the whole responsibility of assessing all potential | ||
127 | 10 | # consequences resulting from its eventual inadequacies and bugs. | ||
128 | 11 | # End users who are looking for a ready-to-use solution with commercial | ||
129 | 12 | # guarantees and support are strongly advised to contact a Free Software | ||
130 | 13 | # Service Company. | ||
131 | 14 | # | ||
132 | 15 | # This program is free software: you can redistribute it and/or modify | ||
133 | 16 | # it under the terms of the GNU Affero General Public License as | ||
134 | 17 | # published by the Free Software Foundation, either version 3 of the | ||
135 | 18 | # License, or (at your option) any later version. | ||
136 | 19 | # | ||
137 | 20 | # This program is distributed in the hope that it will be useful, | ||
138 | 21 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
139 | 22 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
140 | 23 | # GNU Affero General Public License for more details. | ||
141 | 24 | # | ||
142 | 25 | # You should have received a copy of the GNU Affero General Public License | ||
143 | 26 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
144 | 27 | # | ||
145 | 28 | # | ||
146 | 29 | |||
147 | 30 | import openerp.tests.common as common | ||
148 | 31 | |||
149 | 32 | DB = common.DB | ||
150 | 33 | ADMIN_USER_ID = common.ADMIN_USER_ID | ||
151 | 34 | |||
152 | 35 | |||
153 | 36 | class fill_inventory_test(common.TransactionCase): | ||
154 | 37 | |||
155 | 38 | def setUp(self): | ||
156 | 39 | super(fill_inventory_test, self).setUp() | ||
157 | 40 | |||
158 | 41 | def test_missing_location(self): | ||
159 | 42 | """ | ||
160 | 43 | Test that when confirm a parent inventory, the child location are not in the confirmation result | ||
161 | 44 | """ | ||
162 | 45 | parent_inventory_id = self.ref('stock_inventory_hierarchical_location.parent_inventory_location') | ||
163 | 46 | self.registry('stock.inventory').action_open(self.cr, self.uid, [parent_inventory_id]) | ||
164 | 47 | # confirm shelf 1 inventory | ||
165 | 48 | inventory_id = self.ref('stock_inventory_hierarchical_location.child_1_id') | ||
166 | 49 | self.registry('stock.inventory').action_open(self.cr, self.uid, [inventory_id]) | ||
167 | 50 | missing_location = self.registry('stock.inventory').get_missing_locations(self.cr, self.uid, [inventory_id]) | ||
168 | 51 | self.assertEqual(len(missing_location), 1, "1 missing location should be find, because the inventory is empty") | ||
169 | 52 | wizard_id = self.registry('stock.inventory.uninventoried.locations').create(self.cr, self.uid, {}, context={'active_ids': [inventory_id]}) | ||
170 | 53 | self.registry('stock.inventory.uninventoried.locations').confirm_uninventoried_locations(self.cr, self.uid, wizard_id, context={'active_ids': [inventory_id]}) | ||
171 | 54 | missing_location = self.registry('stock.inventory').get_missing_locations(self.cr, self.uid, [inventory_id]) | ||
172 | 55 | self.assertEqual(len(missing_location), 0, "No missing location should be find, because the inventory is confirmed") | ||
173 | 56 | # confirm shelf 2 inventory | ||
174 | 57 | inventory_id = self.ref('stock_inventory_hierarchical_location.child_2_id') | ||
175 | 58 | self.registry('stock.inventory').action_open(self.cr, self.uid, [inventory_id]) | ||
176 | 59 | missing_location = self.registry('stock.inventory').get_missing_locations(self.cr, self.uid, [inventory_id]) | ||
177 | 60 | self.assertEqual(len(missing_location), 1, "1 missing location should be fine, because the inventory is empty") | ||
178 | 61 | self.registry('stock.inventory.line').create(self.cr, self.uid, {'product_id': self.ref('product.product_product_7'), | ||
179 | 62 | 'product_uom': self.ref('product.product_uom_unit'), | ||
180 | 63 | 'company_id': self.ref('base.main_company'), | ||
181 | 64 | 'inventory_id': inventory_id, | ||
182 | 65 | 'product_qty': 18.0, | ||
183 | 66 | 'location_id': self.ref('stock.stock_location_14')}) | ||
184 | 67 | missing_location = self.registry('stock.inventory').get_missing_locations(self.cr, self.uid, [inventory_id]) | ||
185 | 68 | self.assertEqual(len(missing_location), 0, "No missing location should be find, because the inventory is filled") | ||
186 | 69 | wizard_id = self.registry('stock.inventory.uninventoried.locations').create(self.cr, self.uid, {}, context={'active_ids': [inventory_id]}) | ||
187 | 70 | wizard = self.registry('stock.inventory.uninventoried.locations').browse(self.cr, self.uid, wizard_id, context={'active_ids': [inventory_id]}) | ||
188 | 71 | self.assertEqual(len(wizard.location_ids), 0, "The wizard should not contain any lines but contains %s." % wizard.location_ids) | ||
189 | 72 | self.registry('stock.inventory.uninventoried.locations').confirm_uninventoried_locations(self.cr, self.uid, wizard_id, context={'active_ids': [inventory_id]}) | ||
190 | 73 | # confirm parent inventory | ||
191 | 74 | missing_location = self.registry('stock.inventory').get_missing_locations(self.cr, self.uid, [parent_inventory_id]) | ||
192 | 75 | self.assertEqual(len(missing_location), 1, "Only 1 missing location should be find, because there is some location in child inventory") | ||
193 | 76 | |||
194 | 77 | def test_fill_inventory(self): | ||
195 | 78 | """ | ||
196 | 79 | Test that when fill a parent inventory, the child location are not in the result | ||
197 | 80 | """ | ||
198 | 81 | parent_inventory_id = self.ref('stock_inventory_hierarchical_location.parent_inventory_location') | ||
199 | 82 | self.registry('stock.inventory').action_open(self.cr, self.uid, [parent_inventory_id]) | ||
200 | 83 | # confirm shelf 1 inventory | ||
201 | 84 | inventory_id = self.ref('stock_inventory_hierarchical_location.child_1_id') | ||
202 | 85 | self.registry('stock.inventory').action_open(self.cr, self.uid, [inventory_id]) | ||
203 | 86 | wizard_id = self.registry('stock.fill.inventory').create(self.cr, self.uid, {'location_id': self.ref('stock.stock_location_components'), | ||
204 | 87 | 'recursive': True, | ||
205 | 88 | 'exhaustive': True, | ||
206 | 89 | 'set_stock_zero': True}, context={'active_ids': [inventory_id]}) | ||
207 | 90 | self.registry('stock.fill.inventory').fill_inventory(self.cr, self.uid, [wizard_id], context={'active_ids': [inventory_id]}) | ||
208 | 91 | inventory_line_ids = self.registry('stock.inventory.line').search(self.cr, self.uid, [('inventory_id', '=', inventory_id)]) | ||
209 | 92 | self.assertEqual(len(inventory_line_ids), 12, "12 inventory line is fount after filling inventory") | ||
210 | 93 | # confirm shelf 2 inventory | ||
211 | 94 | inventory_id = self.ref('stock_inventory_hierarchical_location.child_2_id') | ||
212 | 95 | self.registry('stock.inventory').action_open(self.cr, self.uid, [inventory_id]) | ||
213 | 96 | wizard_id = self.registry('stock.fill.inventory').create(self.cr, self.uid, {'location_id': self.ref('stock.stock_location_14'), | ||
214 | 97 | 'recursive': True, | ||
215 | 98 | 'exhaustive': True, | ||
216 | 99 | 'set_stock_zero': True}, context={'active_ids': [inventory_id]}) | ||
217 | 100 | self.registry('stock.fill.inventory').fill_inventory(self.cr, self.uid, [wizard_id], context={'active_ids': [inventory_id]}) | ||
218 | 101 | inventory_line_ids = self.registry('stock.inventory.line').search(self.cr, self.uid, [('inventory_id', '=', inventory_id)]) | ||
219 | 102 | self.assertEqual(len(inventory_line_ids), 4, "1 inventory line is fount after filling inventory") | ||
220 | 103 | # confirm parent inventory | ||
221 | 104 | wizard_id = self.registry('stock.fill.inventory').create(self.cr, self.uid, {'location_id': self.ref('stock.stock_location_stock'), | ||
222 | 105 | 'recursive': True, | ||
223 | 106 | 'exhaustive': True, | ||
224 | 107 | 'set_stock_zero': True}, context={'active_ids': [parent_inventory_id]}) | ||
225 | 108 | try: | ||
226 | 109 | self.registry('stock.fill.inventory').fill_inventory(self.cr, self.uid, [wizard_id], context={'active_ids': [parent_inventory_id]}) | ||
227 | 110 | except Exception: | ||
228 | 111 | exception_happened = True | ||
229 | 112 | pass | ||
230 | 113 | self.assertTrue(exception_happened) | ||
231 | 114 | inventory_line_ids = self.registry('stock.inventory.line').search(self.cr, self.uid, [('inventory_id', '=', parent_inventory_id)]) | ||
232 | 115 | self.assertEqual(len(inventory_line_ids), 0, "No inventory line is fount after filling inventory") | ||
233 | 116 | |||
234 | 117 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||
235 | 0 | 118 | ||
236 | === modified file 'stock_inventory_hierarchical_location/wizard/__init__.py' | |||
237 | --- stock_inventory_hierarchical_location/wizard/__init__.py 2014-04-02 10:04:21 +0000 | |||
238 | +++ stock_inventory_hierarchical_location/wizard/__init__.py 2014-06-12 15:33:45 +0000 | |||
239 | @@ -19,3 +19,4 @@ | |||
240 | 19 | ############################################################################## | 19 | ############################################################################## |
241 | 20 | 20 | ||
242 | 21 | import stock_confirm_uninventoried_location | 21 | import stock_confirm_uninventoried_location |
243 | 22 | from . import stock_fill_location_inventory | ||
244 | 22 | 23 | ||
245 | === added file 'stock_inventory_hierarchical_location/wizard/stock_fill_location_inventory.py' | |||
246 | --- stock_inventory_hierarchical_location/wizard/stock_fill_location_inventory.py 1970-01-01 00:00:00 +0000 | |||
247 | +++ stock_inventory_hierarchical_location/wizard/stock_fill_location_inventory.py 2014-06-12 15:33:45 +0000 | |||
248 | @@ -0,0 +1,76 @@ | |||
249 | 1 | # -*- coding: utf-8 -*- | ||
250 | 2 | # | ||
251 | 3 | # | ||
252 | 4 | # Authors: Laetitia Gangloff | ||
253 | 5 | # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) | ||
254 | 6 | # All Rights Reserved | ||
255 | 7 | # | ||
256 | 8 | # WARNING: This program as such is intended to be used by professional | ||
257 | 9 | # programmers who take the whole responsibility of assessing all potential | ||
258 | 10 | # consequences resulting from its eventual inadequacies and bugs. | ||
259 | 11 | # End users who are looking for a ready-to-use solution with commercial | ||
260 | 12 | # guarantees and support are strongly advised to contact a Free Software | ||
261 | 13 | # Service Company. | ||
262 | 14 | # | ||
263 | 15 | # This program is free software: you can redistribute it and/or modify | ||
264 | 16 | # it under the terms of the GNU Affero General Public License as | ||
265 | 17 | # published by the Free Software Foundation, either version 3 of the | ||
266 | 18 | # License, or (at your option) any later version. | ||
267 | 19 | # | ||
268 | 20 | # This program is distributed in the hope that it will be useful, | ||
269 | 21 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
270 | 22 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
271 | 23 | # GNU Affero General Public License for more details. | ||
272 | 24 | # | ||
273 | 25 | # You should have received a copy of the GNU Affero General Public License | ||
274 | 26 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
275 | 27 | # | ||
276 | 28 | # | ||
277 | 29 | |||
278 | 30 | from openerp.osv import orm | ||
279 | 31 | |||
280 | 32 | |||
281 | 33 | class FillInventoryWizard(orm.TransientModel): | ||
282 | 34 | """If inventory as sub inventories, do not fill with sub inventories location""" | ||
283 | 35 | _inherit = 'stock.fill.inventory' | ||
284 | 36 | |||
285 | 37 | def fill_inventory(self, cr, uid, ids, context=None): | ||
286 | 38 | """ To Import stock inventory according to products available in the location and not already in a sub inventory | ||
287 | 39 | |||
288 | 40 | We split fill_inventory on many fill_inventory (one for each location) | ||
289 | 41 | @param self: The object pointer. | ||
290 | 42 | @param cr: A database cursor | ||
291 | 43 | @param uid: ID of the user currently logged in | ||
292 | 44 | @param ids: the ID or list of IDs if we want more than one | ||
293 | 45 | @param context: A standard dictionary | ||
294 | 46 | @return: | ||
295 | 47 | """ | ||
296 | 48 | if context is None: | ||
297 | 49 | context = {} | ||
298 | 50 | |||
299 | 51 | if ids and len(ids): | ||
300 | 52 | ids = ids[0] | ||
301 | 53 | else: | ||
302 | 54 | return {'type': 'ir.actions.act_window_close'} | ||
303 | 55 | fill_inventory = self.browse(cr, uid, ids, context=context) | ||
304 | 56 | if fill_inventory.recursive and fill_inventory.exhaustive: | ||
305 | 57 | exclude_location_ids = [] | ||
306 | 58 | for i in self.pool['stock.inventory'].browse(cr, uid, context['active_ids']): | ||
307 | 59 | for sub_inventory in i.inventory_ids: | ||
308 | 60 | # exclude these location | ||
309 | 61 | exclude_location_ids.append(sub_inventory.location_id.id) | ||
310 | 62 | location_ids = self.pool['stock.location'].search(cr, uid, | ||
311 | 63 | [('location_id', 'child_of', [fill_inventory.location_id.id]), | ||
312 | 64 | '!', ('location_id', 'child_of', exclude_location_ids)], | ||
313 | 65 | order="id", | ||
314 | 66 | context=context) | ||
315 | 67 | for location_id in location_ids: | ||
316 | 68 | super(FillInventoryWizard, self).fill_inventory(cr, uid, | ||
317 | 69 | [self.copy(cr, uid, ids, {'location_id': location_id, | ||
318 | 70 | 'recursive': False, }, context=context)], | ||
319 | 71 | context=context) | ||
320 | 72 | return {'type': 'ir.actions.act_window_close'} | ||
321 | 73 | else: | ||
322 | 74 | return super(FillInventoryWizard, self).fill_inventory(cr, uid, [ids], context=context) | ||
323 | 75 | |||
324 | 76 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||
325 | 0 | 77 | ||
326 | === modified file 'stock_inventory_location/stock_inventory_location.py' | |||
327 | --- stock_inventory_location/stock_inventory_location.py 2014-06-11 15:01:17 +0000 | |||
328 | +++ stock_inventory_location/stock_inventory_location.py 2014-06-12 15:33:45 +0000 | |||
329 | @@ -195,9 +195,11 @@ | |||
330 | 195 | ('location_id', 'child_of', inv_location_ids), | 195 | ('location_id', 'child_of', inv_location_ids), |
331 | 196 | ('usage', '=', 'internal')], context=context)) | 196 | ('usage', '=', 'internal')], context=context)) |
332 | 197 | # Find the locations already recorded in inventory lines | 197 | # Find the locations already recorded in inventory lines |
336 | 198 | line_locations_ids = set([l.location_id.id | 198 | line_locations_ids = set() |
337 | 199 | for l in i.inventory_line_id | 199 | for i in inventories: |
338 | 200 | for i in inventories]) | 200 | for l in i.inventory_line_id: |
339 | 201 | line_locations_ids.add(l.location_id.id) | ||
340 | 202 | |||
341 | 201 | return list(inv_location_ids - line_locations_ids) | 203 | return list(inv_location_ids - line_locations_ids) |
342 | 202 | 204 | ||
343 | 203 | def confirm_missing_locations(self, cr, uid, ids, context=None): | 205 | def confirm_missing_locations(self, cr, uid, ids, context=None): |
Thanks for your help.
I've just merged our own fixes of the day, will you please merge them to avoid conflicts ?
I think I understand what you're trying to do in fill_inventory and it's not exactly how we had it in v6 - which is broken right now in v7, and would require a patch on the code addons.
Your patch completely excludes the locations of sub-inventories, whereas we used to only exclude the generated inventory lines. That would allow us to "catch" the lines that could have been missing from sub-inventories, but since they're exhaustive anyway there should not be any.
So I guess your approach is correct.
I'll let Loïc decide, he's working on the problem too.