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
1=== modified file 'bin/addons/msf_tools/report/report_inconsistencies.py'
2--- bin/addons/msf_tools/report/report_inconsistencies.py 2016-12-01 10:09:35 +0000
3+++ bin/addons/msf_tools/report/report_inconsistencies.py 2017-01-12 10:58:50 +0000
4@@ -178,7 +178,7 @@
5 # cached data
6 self.uf_status_cache = {}
7 self.prod_creator_cache = {}
8- self.inconsistent = []
9+ self.inconsistent = {}
10
11
12 def get_inconsistent_lines(self, prod_id=None):
13@@ -189,44 +189,146 @@
14 prod_id: You can get only SMRL with product_id, if you don't give this information you
15 will get all inconsistents SMRL
16 '''
17+ smrl_obj = self.pool.get('stock.mission.report.line')
18+ inconsistent_id_list = []
19 if not self.inconsistent:
20 prod_obj = self.pool.get('product.product')
21- smrl_obj = self.pool.get('stock.mission.report.line')
22+ prod_status_obj = self.pool.get('product.status')
23
24- smrl_ids = smrl_obj.search(self.cr, self.uid, [('full_view', '=', False)], context=self.localcontext)
25+ smrl_ids = smrl_obj.search(self.cr, self.uid, [('full_view', '=', False)], order='NO_ORDER', context=self.localcontext)
26
27 # check stock mission report line for inconsistencies with HQ (our instance):
28- self.inconsistent = []
29- for smrl in smrl_obj.browse(self.cr, self.uid, smrl_ids, context=self.localcontext):
30- for prod in prod_obj.browse(self.cr, self.uid, [smrl.product_id.id], context=self.localcontext):
31+ self.inconsistent = {}
32+ read_smrl_result = smrl_obj.read(self.cr, self.uid, smrl_ids,
33+ ['product_id', 'product_state', 'state_ud',
34+ 'product_active', 'mission_report_id', 'default_code',
35+ 'international_status_code'],
36+ context=self.localcontext)
37+
38+ read_smrl_result_dict = {}
39+ all_product_ids = []
40+ for read_smrl in read_smrl_result:
41+ read_smrl_result_dict[read_smrl['id']] = read_smrl
42+ all_product_ids.append(read_smrl['product_id'][0])
43+ del read_smrl_result
44+
45+ # read all product informations
46+ product_result = prod_obj.read(self.cr, self.uid, all_product_ids,
47+ ['state', 'state_ud', 'active', 'name_template',
48+ 'international_status', 'default_code'],
49+ context=self.localcontext)
50+ product_dict = dict((x['id'], x) for x in product_result)
51+
52+ # get all product_status
53+ prod_status_ids = prod_status_obj.search(self.cr, self.uid, [], context=self.localcontext)
54+ prod_status_result = prod_status_obj.read(self.cr, self.uid, prod_status_ids, ['code'], context=self.localcontext)
55+ prod_status_dict = dict((x['id'], x['code']) for x in prod_status_result)
56+
57+ # get all instance id and build a level dict
58+ instance_obj = self.pool.get('msf.instance')
59+ instance_ids = instance_obj.search(self.cr, self.uid, [])
60+ instance_read_result = instance_obj.read(self.cr, self.uid, instance_ids,
61+ ['level', 'name'], context=self.localcontext)
62+ instance_level_dict = dict((x['id'], x) for x in
63+ instance_read_result)
64+
65+ # get all report id and build a instance dict
66+ smr_obj = self.pool.get('stock.mission.report')
67+ smr_ids = smr_obj.search(self.cr, self.uid, [])
68+ smr_read_result = smr_obj.read(self.cr, self.uid, smr_ids,
69+ ['instance_id'], context=self.localcontext)
70+ smr_instance_dict = dict((x['id'], x) for x in
71+ smr_read_result)
72+
73+ # get all uf_status codes
74+ uf_status_obj = self.pool.get('product.status')
75+ uf_status_code_ids = uf_status_obj.search(self.cr, self.uid, [], context=self.localcontext)
76+ uf_status_code_read_result = uf_status_obj.read(self.cr, self.uid,
77+ uf_status_code_ids, ['code', 'name'], context=self.localcontext)
78+ uf_status_code_dict = dict((x['code'], x) for x in
79+ uf_status_code_read_result)
80+
81+ product_result_dict = {}
82+ state_ud_dict = {}
83+ for product in product_result:
84+ inconsistent_id_list = []
85+ # get the lines matching this product
86+ smrl_ids = smrl_obj.search(self.cr, self.uid,
87+ [('full_view', '=', False),
88+ ('product_id', '=', product['id'])],
89+ order='NO_ORDER', context=self.localcontext)
90+
91+ # get the inconsistent related lines
92+ for smrl_id in smrl_ids:
93+ smrl = read_smrl_result_dict[smrl_id]
94+ product = product_dict[smrl['product_id'][0]]
95 # in product_product state is False when empty
96 # in smrl product_state is '' when empty:
97- if not prod.state and not smrl.product_state:
98- pass
99- elif not prod.state and smrl.product_state:
100- self.inconsistent.append(smrl)
101- continue
102- elif prod.state and not smrl.product_state:
103- self.inconsistent.append(smrl)
104- continue
105- elif prod.state.code != smrl.product_state:
106- self.inconsistent.append(smrl)
107- continue
108-
109- if not prod.state_ud and not smrl.state_ud:
110- pass
111- elif prod.state_ud != smrl.state_ud:
112- self.inconsistent.append(smrl)
113- continue
114-
115- if prod.active != smrl.product_active: # if null in DB smrl.product_active = False ....
116- self.inconsistent.append(smrl)
117- continue
118-
119- self.inconsistent.sort(key=lambda smrl: smrl.mission_report_id.instance_id.level)
120+ if not product['state'] and not smrl['product_state']:
121+ pass
122+ elif not product['state'] and smrl['product_state']:
123+ inconsistent_id_list.append(smrl['id'])
124+ continue
125+ elif product['state'] and not smrl['product_state']:
126+ inconsistent_id_list.append(smrl['id'])
127+ continue
128+ elif product['state'] and product['state'] in prod_status_dict:
129+ state_code = prod_status_dict[product['state'][0]]
130+ if state_code != smrl['product_state']:
131+ inconsistent_id_list.append(smrl['id'])
132+ continue
133+
134+ if not product['state_ud'] and not smrl['state_ud']:
135+ pass
136+ elif product['state_ud'] != smrl['state_ud']:
137+ inconsistent_id_list.append(smrl['id'])
138+ continue
139+
140+ if product['active'] != smrl['product_active']: # if null in DB smrl.product_active = False ....
141+ inconsistent_id_list.append(smrl['id'])
142+ continue
143+
144+ if inconsistent_id_list:
145+ product_result_dict[product['id']] = {}
146+ current_prod = product_result_dict[product['id']]
147+ current_prod['smrl_list'] = []
148+ prod_state_ud = ''
149+ if product['state_ud']:
150+ if product['state_ud'] not in state_ud_dict:
151+ product_browse_obj = prod_obj.browse(self.cr, self.uid, product['id'], context=self.localcontext)
152+ state_ud_name = self.pool.get('ir.model.fields').get_browse_selection(self.cr, self.uid, product_browse_obj, 'state_ud', self.localcontext)
153+ state_ud_dict[product['state_ud']] = state_ud_name
154+ prod_state_ud = state_ud_dict[product['state_ud']]
155+ current_prod.update({
156+ 'prod_default_code': product['default_code'],
157+ 'prod_name_template': product['name_template'],
158+ 'prod_international_status': product['international_status'] and product['international_status'][1] or '',
159+ 'prod_state': product['state'] and product['state'][1] or '',
160+ 'prod_state_ud': prod_state_ud,
161+ 'prod_active': product['active'],
162+ })
163+
164+ # build the result list dict
165+ for smrl_id in inconsistent_id_list:
166+ smrl = read_smrl_result_dict[smrl_id]
167+ instance_id = smr_instance_dict[smrl['mission_report_id'][0]]['instance_id'][0]
168+
169+ smrl_dict = {
170+ 'instance_name': instance_level_dict[instance_id]['name'],
171+ 'smrl_default_code': smrl['default_code'],
172+ 'smrl_name_template': product['name_template'],
173+ 'internationnal_status_code_name': smrl['international_status_code'] and smrl['international_status_code'][1] or '',
174+ 'uf_status_code': smrl['product_state'] and uf_status_code_dict[smrl['product_state']]['name'] or '',
175+ 'ud_status_code': self.get_ud_status(smrl['state_ud']),
176+ 'active': smrl['product_active'],
177+ 'instance_level': instance_level_dict[instance_id]['level'],
178+ }
179+ product_result_dict[product['id']]['smrl_list'].append(smrl_dict)
180+ product_result_dict[product['id']]['smrl_list'].sort(key=lambda smrl: smrl['instance_level'])
181+ self.inconsistent[product['id']] = product_result_dict[product['id']]
182
183 if prod_id:
184- return [smrl for smrl in self.inconsistent if smrl.product_id.id == prod_id]
185+ return self.inconsistent[prod_id]
186 else:
187 return self.inconsistent
188
189@@ -238,14 +340,17 @@
190 if not self.inconsistent:
191 self.inconsistent = self.get_inconsistent_lines()
192
193- prod_ids = set()
194- for smrl in self.inconsistent:
195- prod_ids.add(smrl.product_id.id)
196-
197- prod_list = self.pool.get('product.product').browse(self.cr, self.uid, list(prod_ids), context=self.localcontext)
198- prod_list.sort(key=lambda prod: prod.default_code)
199-
200- return prod_list
201+ prod_ids = self.inconsistent.keys()
202+
203+ # order product id by default code
204+ prod_obj = self.pool.get('product.product')
205+ prod_result = prod_obj.read(self.cr, self.uid, prod_ids, ['default_code'], self.localcontext)
206+ prod_result.sort(key=lambda prod: prod['default_code'])
207+ ordered_ids = [x['id'] for x in prod_result]
208+
209+ # order self.inconsistent according with this ids
210+ final_result = [self.inconsistent[x] for x in ordered_ids]
211+ return final_result
212
213
214 def get_uf_status(self, code):
215
216=== modified file 'bin/addons/msf_tools/report/report_inconsistencies_xls.mako'
217--- bin/addons/msf_tools/report/report_inconsistencies_xls.mako 2016-12-01 10:09:35 +0000
218+++ bin/addons/msf_tools/report/report_inconsistencies_xls.mako 2017-01-12 10:58:50 +0000
219@@ -85,26 +85,26 @@
220 <Cell ss:StyleID="tab_header_orange"><Data ss:Type="String">Active/Inactive</Data></Cell>
221 </Row>
222 % for prod in get_products_with_inconsistencies():
223- # HQ data:
224- <Row ss:AutoFitHeight="1">
225- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('HQ')|x}</Data></Cell>
226- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.default_code)|x}</Data></Cell>
227- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.name_template)|x}</Data></Cell>
228- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.international_status and prod.international_status.name or '')|x}</Data></Cell>
229- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.state and prod.state.name or '')|x}</Data></Cell>
230- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod.state_ud and getSel(prod, 'state_ud') or '')|x}</Data></Cell>
231- <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('Active' if prod.active else 'Inactive')|x}</Data></Cell>
232- </Row>
233- % for smrl in get_inconsistent_lines(prod.id):
234+ # HQ data:
235 <Row ss:AutoFitHeight="1">
236- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.mission_report_id.instance_id.name)|x}</Data></Cell>
237- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.default_code)|x}</Data></Cell>
238- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl.product_id.name_template)|x}</Data></Cell>
239- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_product_creator_name_from_code(smrl.international_status_code) or '')|x}</Data></Cell>
240- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_uf_status(smrl.product_state))|x}</Data></Cell>
241- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(get_ud_status(smrl.state_ud) or '')|x}</Data></Cell>
242- <Cell ss:StyleID="tab_content"><Data ss:Type="String">${('Active' if smrl.product_active else 'Inactive')|x}</Data></Cell>
243+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('HQ')|x}</Data></Cell>
244+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_default_code'])|x}</Data></Cell>
245+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_name_template'])|x}</Data></Cell>
246+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_international_status'] or '')|x}</Data></Cell>
247+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_state'] or '')|x}</Data></Cell>
248+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${(prod['prod_state_ud'] or '')|x}</Data></Cell>
249+ <Cell ss:StyleID="tab_header_gray"><Data ss:Type="String">${('Active' if prod['prod_active'] else 'Inactive')|x}</Data></Cell>
250 </Row>
251+ % for smrl in prod['smrl_list']:
252+ <Row ss:AutoFitHeight="1">
253+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['instance_name'])|x}</Data></Cell>
254+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['smrl_default_code'])|x}</Data></Cell>
255+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['smrl_name_template'])|x}</Data></Cell>
256+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['internationnal_status_code_name'] or '')|x}</Data></Cell>
257+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['uf_status_code'])|x}</Data></Cell>
258+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${(smrl['ud_status_code'] or '')|x}</Data></Cell>
259+ <Cell ss:StyleID="tab_content"><Data ss:Type="String">${('Active' if smrl['active'] else 'Inactive')|x}</Data></Cell>
260+ </Row>
261 % endfor
262 % endfor
263 % endif

Subscribers

People subscribed via source and target branches

to all changes: