Merge lp:~fabien-morin/unifield-server/fm-us-1167 into lp:~mallorymarcot/unifield-server/us-1167

Proposed by Fabien MORIN
Status: Needs review
Proposed branch: lp:~fabien-morin/unifield-server/fm-us-1167
Merge into: lp:~mallorymarcot/unifield-server/us-1167
Diff against target: 263 lines (+161/-56)
2 files modified
bin/addons/msf_tools/report/report_inconsistencies.py (+143/-38)
bin/addons/msf_tools/report/report_inconsistencies_xls.mako (+18/-18)
To merge this branch: bzr merge lp:~fabien-morin/unifield-server/fm-us-1167
Reviewer Review Type Date Requested Status
Mallory MARCOT Pending
Review via email: mp+314427@code.launchpad.net

Description of the change

I have improved the perf of your branch, once you test it, please merge it with your.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bin/addons/msf_tools/report/report_inconsistencies.py'
--- bin/addons/msf_tools/report/report_inconsistencies.py 2016-12-01 10:09:35 +0000
+++ bin/addons/msf_tools/report/report_inconsistencies.py 2017-01-12 10:58:50 +0000
@@ -178,7 +178,7 @@
178 # cached data178 # cached data
179 self.uf_status_cache = {}179 self.uf_status_cache = {}
180 self.prod_creator_cache = {}180 self.prod_creator_cache = {}
181 self.inconsistent = []181 self.inconsistent = {}
182182
183183
184 def get_inconsistent_lines(self, prod_id=None):184 def get_inconsistent_lines(self, prod_id=None):
@@ -189,44 +189,146 @@
189 prod_id: You can get only SMRL with product_id, if you don't give this information you189 prod_id: You can get only SMRL with product_id, if you don't give this information you
190 will get all inconsistents SMRL 190 will get all inconsistents SMRL
191 '''191 '''
192 smrl_obj = self.pool.get('stock.mission.report.line')
193 inconsistent_id_list = []
192 if not self.inconsistent:194 if not self.inconsistent:
193 prod_obj = self.pool.get('product.product')195 prod_obj = self.pool.get('product.product')
194 smrl_obj = self.pool.get('stock.mission.report.line')196 prod_status_obj = self.pool.get('product.status')
195197
196 smrl_ids = smrl_obj.search(self.cr, self.uid, [('full_view', '=', False)], context=self.localcontext)198 smrl_ids = smrl_obj.search(self.cr, self.uid, [('full_view', '=', False)], order='NO_ORDER', context=self.localcontext)
197199
198 # check stock mission report line for inconsistencies with HQ (our instance):200 # check stock mission report line for inconsistencies with HQ (our instance):
199 self.inconsistent = []201 self.inconsistent = {}
200 for smrl in smrl_obj.browse(self.cr, self.uid, smrl_ids, context=self.localcontext):202 read_smrl_result = smrl_obj.read(self.cr, self.uid, smrl_ids,
201 for prod in prod_obj.browse(self.cr, self.uid, [smrl.product_id.id], context=self.localcontext):203 ['product_id', 'product_state', 'state_ud',
204 'product_active', 'mission_report_id', 'default_code',
205 'international_status_code'],
206 context=self.localcontext)
207
208 read_smrl_result_dict = {}
209 all_product_ids = []
210 for read_smrl in read_smrl_result:
211 read_smrl_result_dict[read_smrl['id']] = read_smrl
212 all_product_ids.append(read_smrl['product_id'][0])
213 del read_smrl_result
214
215 # read all product informations
216 product_result = prod_obj.read(self.cr, self.uid, all_product_ids,
217 ['state', 'state_ud', 'active', 'name_template',
218 'international_status', 'default_code'],
219 context=self.localcontext)
220 product_dict = dict((x['id'], x) for x in product_result)
221
222 # get all product_status
223 prod_status_ids = prod_status_obj.search(self.cr, self.uid, [], context=self.localcontext)
224 prod_status_result = prod_status_obj.read(self.cr, self.uid, prod_status_ids, ['code'], context=self.localcontext)
225 prod_status_dict = dict((x['id'], x['code']) for x in prod_status_result)
226
227 # get all instance id and build a level dict
228 instance_obj = self.pool.get('msf.instance')
229 instance_ids = instance_obj.search(self.cr, self.uid, [])
230 instance_read_result = instance_obj.read(self.cr, self.uid, instance_ids,
231 ['level', 'name'], context=self.localcontext)
232 instance_level_dict = dict((x['id'], x) for x in
233 instance_read_result)
234
235 # get all report id and build a instance dict
236 smr_obj = self.pool.get('stock.mission.report')
237 smr_ids = smr_obj.search(self.cr, self.uid, [])
238 smr_read_result = smr_obj.read(self.cr, self.uid, smr_ids,
239 ['instance_id'], context=self.localcontext)
240 smr_instance_dict = dict((x['id'], x) for x in
241 smr_read_result)
242
243 # get all uf_status codes
244 uf_status_obj = self.pool.get('product.status')
245 uf_status_code_ids = uf_status_obj.search(self.cr, self.uid, [], context=self.localcontext)
246 uf_status_code_read_result = uf_status_obj.read(self.cr, self.uid,
247 uf_status_code_ids, ['code', 'name'], context=self.localcontext)
248 uf_status_code_dict = dict((x['code'], x) for x in
249 uf_status_code_read_result)
250
251 product_result_dict = {}
252 state_ud_dict = {}
253 for product in product_result:
254 inconsistent_id_list = []
255 # get the lines matching this product
256 smrl_ids = smrl_obj.search(self.cr, self.uid,
257 [('full_view', '=', False),
258 ('product_id', '=', product['id'])],
259 order='NO_ORDER', context=self.localcontext)
260
261 # get the inconsistent related lines
262 for smrl_id in smrl_ids:
263 smrl = read_smrl_result_dict[smrl_id]
264 product = product_dict[smrl['product_id'][0]]
202 # in product_product state is False when empty265 # in product_product state is False when empty
203 # in smrl product_state is '' when empty:266 # in smrl product_state is '' when empty:
204 if not prod.state and not smrl.product_state:267 if not product['state'] and not smrl['product_state']:
205 pass268 pass
206 elif not prod.state and smrl.product_state:269 elif not product['state'] and smrl['product_state']:
207 self.inconsistent.append(smrl)270 inconsistent_id_list.append(smrl['id'])
208 continue271 continue
209 elif prod.state and not smrl.product_state:272 elif product['state'] and not smrl['product_state']:
210 self.inconsistent.append(smrl)273 inconsistent_id_list.append(smrl['id'])
211 continue274 continue
212 elif prod.state.code != smrl.product_state:275 elif product['state'] and product['state'] in prod_status_dict:
213 self.inconsistent.append(smrl)276 state_code = prod_status_dict[product['state'][0]]
214 continue277 if state_code != smrl['product_state']:
215278 inconsistent_id_list.append(smrl['id'])
216 if not prod.state_ud and not smrl.state_ud:279 continue
217 pass280
218 elif prod.state_ud != smrl.state_ud:281 if not product['state_ud'] and not smrl['state_ud']:
219 self.inconsistent.append(smrl)282 pass
220 continue283 elif product['state_ud'] != smrl['state_ud']:
221284 inconsistent_id_list.append(smrl['id'])
222 if prod.active != smrl.product_active: # if null in DB smrl.product_active = False ....285 continue
223 self.inconsistent.append(smrl)286
224 continue287 if product['active'] != smrl['product_active']: # if null in DB smrl.product_active = False ....
225288 inconsistent_id_list.append(smrl['id'])
226 self.inconsistent.sort(key=lambda smrl: smrl.mission_report_id.instance_id.level)289 continue
290
291 if inconsistent_id_list:
292 product_result_dict[product['id']] = {}
293 current_prod = product_result_dict[product['id']]
294 current_prod['smrl_list'] = []
295 prod_state_ud = ''
296 if product['state_ud']:
297 if product['state_ud'] not in state_ud_dict:
298 product_browse_obj = prod_obj.browse(self.cr, self.uid, product['id'], context=self.localcontext)
299 state_ud_name = self.pool.get('ir.model.fields').get_browse_selection(self.cr, self.uid, product_browse_obj, 'state_ud', self.localcontext)
300 state_ud_dict[product['state_ud']] = state_ud_name
301 prod_state_ud = state_ud_dict[product['state_ud']]
302 current_prod.update({
303 'prod_default_code': product['default_code'],
304 'prod_name_template': product['name_template'],
305 'prod_international_status': product['international_status'] and product['international_status'][1] or '',
306 'prod_state': product['state'] and product['state'][1] or '',
307 'prod_state_ud': prod_state_ud,
308 'prod_active': product['active'],
309 })
310
311 # build the result list dict
312 for smrl_id in inconsistent_id_list:
313 smrl = read_smrl_result_dict[smrl_id]
314 instance_id = smr_instance_dict[smrl['mission_report_id'][0]]['instance_id'][0]
315
316 smrl_dict = {
317 'instance_name': instance_level_dict[instance_id]['name'],
318 'smrl_default_code': smrl['default_code'],
319 'smrl_name_template': product['name_template'],
320 'internationnal_status_code_name': smrl['international_status_code'] and smrl['international_status_code'][1] or '',
321 'uf_status_code': smrl['product_state'] and uf_status_code_dict[smrl['product_state']]['name'] or '',
322 'ud_status_code': self.get_ud_status(smrl['state_ud']),
323 'active': smrl['product_active'],
324 'instance_level': instance_level_dict[instance_id]['level'],
325 }
326 product_result_dict[product['id']]['smrl_list'].append(smrl_dict)
327 product_result_dict[product['id']]['smrl_list'].sort(key=lambda smrl: smrl['instance_level'])
328 self.inconsistent[product['id']] = product_result_dict[product['id']]
227329
228 if prod_id:330 if prod_id:
229 return [smrl for smrl in self.inconsistent if smrl.product_id.id == prod_id]331 return self.inconsistent[prod_id]
230 else:332 else:
231 return self.inconsistent333 return self.inconsistent
232334
@@ -238,14 +340,17 @@
238 if not self.inconsistent:340 if not self.inconsistent:
239 self.inconsistent = self.get_inconsistent_lines()341 self.inconsistent = self.get_inconsistent_lines()
240342
241 prod_ids = set()343 prod_ids = self.inconsistent.keys()
242 for smrl in self.inconsistent:344
243 prod_ids.add(smrl.product_id.id)345 # order product id by default code
244346 prod_obj = self.pool.get('product.product')
245 prod_list = self.pool.get('product.product').browse(self.cr, self.uid, list(prod_ids), context=self.localcontext)347 prod_result = prod_obj.read(self.cr, self.uid, prod_ids, ['default_code'], self.localcontext)
246 prod_list.sort(key=lambda prod: prod.default_code)348 prod_result.sort(key=lambda prod: prod['default_code'])
247349 ordered_ids = [x['id'] for x in prod_result]
248 return prod_list350
351 # order self.inconsistent according with this ids
352 final_result = [self.inconsistent[x] for x in ordered_ids]
353 return final_result
249354
250355
251 def get_uf_status(self, code):356 def get_uf_status(self, code):
252357
=== modified file 'bin/addons/msf_tools/report/report_inconsistencies_xls.mako'
--- bin/addons/msf_tools/report/report_inconsistencies_xls.mako 2016-12-01 10:09:35 +0000
+++ bin/addons/msf_tools/report/report_inconsistencies_xls.mako 2017-01-12 10:58:50 +0000
@@ -85,26 +85,26 @@
85 <Cell ss:StyleID="tab_header_orange"><Data ss:Type="String">Active/Inactive</Data></Cell>85 <Cell ss:StyleID="tab_header_orange"><Data ss:Type="String">Active/Inactive</Data></Cell>
86 </Row>86 </Row>
87 % for prod in get_products_with_inconsistencies():87 % for prod in get_products_with_inconsistencies():
88 # HQ data:88 # HQ data:
89 <Row ss:AutoFitHeight="1">
90 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('HQ')|x}</Data></Cell>
91 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.default_code)|x}</Data></Cell>
92 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.name_template)|x}</Data></Cell>
93 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.international_status and prod.international_status.name or '')|x}</Data></Cell>
94 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.state and prod.state.name or '')|x}</Data></Cell>
95 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.state_ud and getSel(prod, 'state_ud') or '')|x}</Data></Cell>
96 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('Active' if prod.active else 'Inactive')|x}</Data></Cell>
97 </Row>
98 % for smrl in get_inconsistent_lines(prod.id):
99 <Row ss:AutoFitHeight="1">89 <Row ss:AutoFitHeight="1">
100 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.mission_report_id.instance_id.name)|x}</Data></Cell>90 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('HQ')|x}</Data></Cell>
101 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.default_code)|x}</Data></Cell>91 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_default_code'])|x}</Data></Cell>
102 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.product_id.name_template)|x}</Data></Cell>92 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_name_template'])|x}</Data></Cell>
103 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_product_creator_name_from_code(smrl.international_status_code) or '')|x}</Data></Cell>93 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_international_status'] or '')|x}</Data></Cell>
104 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_uf_status(smrl.product_state))|x}</Data></Cell>94 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_state'] or '')|x}</Data></Cell>
105 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_ud_status(smrl.state_ud) or '')|x}</Data></Cell>95 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_state_ud'] or '')|x}</Data></Cell>
106 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${('Active' if smrl.product_active else 'Inactive')|x}</Data></Cell>96 <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('Active' if prod['prod_active'] else 'Inactive')|x}</Data></Cell>
107 </Row>97 </Row>
98 % for smrl in prod['smrl_list']:
99 <Row ss:AutoFitHeight="1">
100 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['instance_name'])|x}</Data></Cell>
101 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['smrl_default_code'])|x}</Data></Cell>
102 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['smrl_name_template'])|x}</Data></Cell>
103 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['internationnal_status_code_name'] or '')|x}</Data></Cell>
104 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['uf_status_code'])|x}</Data></Cell>
105 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['ud_status_code'] or '')|x}</Data></Cell>
106 <Cell ss:StyleID="tab_content"><Data ss:Type="String">${('Active' if smrl['active'] else 'Inactive')|x}</Data></Cell>
107 </Row>
108 % endfor108 % endfor
109 % endfor109 % endfor
110 % endif110 % endif

Subscribers

People subscribed via source and target branches

to all changes: