Merge lp:~fabien-morin/unifield-server/fm-us-1167 into lp:~mallorymarcot/unifield-server/us-1167
- fm-us-1167
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mallory MARCOT | Pending | ||
Review via email: mp+314427@code.launchpad.net |
Commit message
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 |