Merge lp:~unifield-team/unifield-server/us-2367 into lp:unifield-server
- us-2367
- Merge into trunk
Proposed by
jftempo
Status: | Merged |
---|---|
Merged at revision: | 4382 |
Proposed branch: | lp:~unifield-team/unifield-server/us-2367 |
Merge into: | lp:unifield-server |
Diff against target: |
244 lines (+77/-6) (has conflicts) 7 files modified
bin/addons/msf_cross_docking/cross_docking_view.xml (+1/-1) bin/addons/msf_doc_import/wizard/wiz_common_import.py (+5/-1) bin/addons/msf_printed_documents/report/report_reception.py (+4/-0) bin/addons/msf_profile/i18n/fr_MF.po (+13/-0) bin/addons/stock/stock.py (+4/-0) bin/addons/stock_override/stock.py (+44/-1) bin/addons/stock_override/stock_view.xml (+6/-3) Text conflict in bin/addons/msf_printed_documents/report/report_reception.py Text conflict in bin/addons/msf_profile/i18n/fr_MF.po |
To merge this branch: | bzr merge lp:~unifield-team/unifield-server/us-2367 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
UniField Reviewer Team | Pending | ||
Review via email: mp+320810@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Jeff Allen (jr.allen) : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bin/addons/msf_cross_docking/cross_docking_view.xml' | |||
2 | --- bin/addons/msf_cross_docking/cross_docking_view.xml 2016-11-04 12:57:37 +0000 | |||
3 | +++ bin/addons/msf_cross_docking/cross_docking_view.xml 2017-05-24 07:13:20 +0000 | |||
4 | @@ -56,7 +56,7 @@ | |||
5 | 56 | <field name="arch" type="xml"> | 56 | <field name="arch" type="xml"> |
6 | 57 | <data> | 57 | <data> |
7 | 58 | <xpath expr="/form/notebook/page[@string='General Information']/field[@name='move_lines']" position="attributes" > | 58 | <xpath expr="/form/notebook/page[@string='General Information']/field[@name='move_lines']" position="attributes" > |
9 | 59 | <attribute name="default_get">{'purchase_id': purchase_id, 'reason_type_id': reason_type_id, 'warehouse_id': warehouse_id, 'address_in_id': address_id, 'date_expected': min_date} </attribute> | 59 | <attribute name="default_get">{'purchase_id': purchase_id, 'reason_type_id': reason_type_id, 'warehouse_id': warehouse_id, 'address_in_id': address_id, 'date_expected': min_date, 'ext_cu': ext_cu} </attribute> |
10 | 60 | </xpath> | 60 | </xpath> |
11 | 61 | </data> | 61 | </data> |
12 | 62 | </field> | 62 | </field> |
13 | 63 | 63 | ||
14 | === modified file 'bin/addons/msf_doc_import/wizard/wiz_common_import.py' | |||
15 | --- bin/addons/msf_doc_import/wizard/wiz_common_import.py 2017-04-12 08:42:16 +0000 | |||
16 | +++ bin/addons/msf_doc_import/wizard/wiz_common_import.py 2017-05-24 07:13:20 +0000 | |||
17 | @@ -697,6 +697,8 @@ | |||
18 | 697 | 697 | ||
19 | 698 | if picking.partner_id and picking.type == 'in': | 698 | if picking.partner_id and picking.type == 'in': |
20 | 699 | location_id = picking.partner_id.property_stock_supplier.id | 699 | location_id = picking.partner_id.property_stock_supplier.id |
21 | 700 | elif picking.ext_cu and picking.type == 'in': | ||
22 | 701 | location_id = picking.ext_cu.id | ||
23 | 700 | elif picking.type == 'in': | 702 | elif picking.type == 'in': |
24 | 701 | location_id = get_ref(cr, uid, 'stock', 'stock_location_suppliers')[1] | 703 | location_id = get_ref(cr, uid, 'stock', 'stock_location_suppliers')[1] |
25 | 702 | else: | 704 | else: |
26 | @@ -721,7 +723,9 @@ | |||
27 | 721 | 'reason_type_id': picking.reason_type_id.id, | 723 | 'reason_type_id': picking.reason_type_id.id, |
28 | 722 | 'location_id': location_id, | 724 | 'location_id': location_id, |
29 | 723 | 'location_dest_id': location_dest_id, | 725 | 'location_dest_id': location_dest_id, |
31 | 724 | 'name': p_data['name'],} | 726 | 'name': p_data['name'], |
32 | 727 | 'is_ext_cu': True if picking.ext_cu else False, | ||
33 | 728 | } | ||
34 | 725 | 729 | ||
35 | 726 | values.update(self.onchange_product_id(cr, uid, False, p_data['id'], location_id, location_dest_id, picking.address_id and picking.address_id.id or False, picking.type, False).get('value', {})) | 730 | values.update(self.onchange_product_id(cr, uid, False, p_data['id'], location_id, location_dest_id, picking.address_id and picking.address_id.id or False, picking.type, False).get('value', {})) |
36 | 727 | 731 | ||
37 | 728 | 732 | ||
38 | === modified file 'bin/addons/msf_printed_documents/report/report_reception.py' | |||
39 | --- bin/addons/msf_printed_documents/report/report_reception.py 2017-04-19 12:52:45 +0000 | |||
40 | +++ bin/addons/msf_printed_documents/report/report_reception.py 2017-05-24 07:13:20 +0000 | |||
41 | @@ -163,12 +163,16 @@ | |||
42 | 163 | return False | 163 | return False |
43 | 164 | 164 | ||
44 | 165 | def getPartnerName(self,o): | 165 | def getPartnerName(self,o): |
45 | 166 | <<<<<<< TREE | ||
46 | 166 | if o.purchase_id: | 167 | if o.purchase_id: |
47 | 167 | return o.purchase_id and o.purchase_id.partner_id and o.purchase_id.partner_id.name or False | 168 | return o.purchase_id and o.purchase_id.partner_id and o.purchase_id.partner_id.name or False |
48 | 168 | elif o.partner_id: | 169 | elif o.partner_id: |
49 | 169 | return o.partner_id.name | 170 | return o.partner_id.name |
50 | 170 | else: | 171 | else: |
51 | 171 | return False | 172 | return False |
52 | 173 | ======= | ||
53 | 174 | return o.purchase_id and o.purchase_id.partner_id and o.purchase_id.partner_id.name or (o.ext_cu and o.ext_cu.name) | ||
54 | 175 | >>>>>>> MERGE-SOURCE | ||
55 | 172 | 176 | ||
56 | 173 | def getPartnerAddress(self,o): | 177 | def getPartnerAddress(self,o): |
57 | 174 | if o.purchase_id: | 178 | if o.purchase_id: |
58 | 175 | 179 | ||
59 | === modified file 'bin/addons/msf_profile/i18n/fr_MF.po' | |||
60 | --- bin/addons/msf_profile/i18n/fr_MF.po 2017-05-22 16:04:34 +0000 | |||
61 | +++ bin/addons/msf_profile/i18n/fr_MF.po 2017-05-24 07:13:20 +0000 | |||
62 | @@ -98181,6 +98181,7 @@ | |||
63 | 98181 | msgid "Article must be used only in a properly designed programme, need a more detailed description." | 98181 | msgid "Article must be used only in a properly designed programme, need a more detailed description." |
64 | 98182 | msgstr "L'article doit être uniquement utilisé dans un programme correctement construit, à besoin d'une description plus détaillée." | 98182 | msgstr "L'article doit être uniquement utilisé dans un programme correctement construit, à besoin d'une description plus détaillée." |
65 | 98183 | 98183 | ||
66 | 98184 | <<<<<<< TREE | ||
67 | 98184 | #. module: sync_client | 98185 | #. module: sync_client |
68 | 98185 | #: view:sync.client.update_received:0 | 98186 | #: view:sync.client.update_received:0 |
69 | 98186 | msgid "Updates Received" | 98187 | msgid "Updates Received" |
70 | @@ -98556,3 +98557,15 @@ | |||
71 | 98556 | #, python-format | 98557 | #, python-format |
72 | 98557 | msgid "%s_template.xls" | 98558 | msgid "%s_template.xls" |
73 | 98558 | msgstr "modèle_%s.xls" | 98559 | msgstr "modèle_%s.xls" |
74 | 98560 | ======= | ||
75 | 98561 | #. module: stock_override | ||
76 | 98562 | #: code:addons/stock_override/stock.py:386 | ||
77 | 98563 | #, python-format | ||
78 | 98564 | msgid "You are changing an External Consumption Unit, please check that source location of your stock moves are still consistent" | ||
79 | 98565 | msgstr "Vous avez changé d'unité de consommation externe, merci de vérifier que vos mouvements de stock sont toujours cohérents" | ||
80 | 98566 | |||
81 | 98567 | #. module: stock_override | ||
82 | 98568 | #: field:stock.location,filter_partner_id2:0 | ||
83 | 98569 | msgid "Filter location by partner" | ||
84 | 98570 | msgstr "Filtrer l'emplacement de stock par partenaire" | ||
85 | 98571 | >>>>>>> MERGE-SOURCE | ||
86 | 98559 | 98572 | ||
87 | === modified file 'bin/addons/stock/stock.py' | |||
88 | --- bin/addons/stock/stock.py 2017-05-22 16:04:34 +0000 | |||
89 | +++ bin/addons/stock/stock.py 2017-05-24 07:13:20 +0000 | |||
90 | @@ -1849,6 +1849,10 @@ | |||
91 | 1849 | """ | 1849 | """ |
92 | 1850 | if context is None: | 1850 | if context is None: |
93 | 1851 | context = {} | 1851 | context = {} |
94 | 1852 | |||
95 | 1853 | if context.get('ext_cu', False): | ||
96 | 1854 | return context['ext_cu'] | ||
97 | 1855 | |||
98 | 1852 | if context.get('move_line', []): | 1856 | if context.get('move_line', []): |
99 | 1853 | try: | 1857 | try: |
100 | 1854 | return context['move_line'][0][2]['location_id'] | 1858 | return context['move_line'][0][2]['location_id'] |
101 | 1855 | 1859 | ||
102 | === modified file 'bin/addons/stock_override/stock.py' | |||
103 | --- bin/addons/stock_override/stock.py 2016-11-09 10:00:04 +0000 | |||
104 | +++ bin/addons/stock_override/stock.py 2017-05-24 07:13:20 +0000 | |||
105 | @@ -320,6 +320,7 @@ | |||
106 | 320 | 'from_yml_test': fields.boolean('Only used to pass addons unit test', readonly=True, help='Never set this field to true !'), | 320 | 'from_yml_test': fields.boolean('Only used to pass addons unit test', readonly=True, help='Never set this field to true !'), |
107 | 321 | 'address_id': fields.many2one('res.partner.address', 'Delivery address', help="Address of partner", readonly=False, states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, domain="[('partner_id', '=', partner_id)]"), | 321 | 'address_id': fields.many2one('res.partner.address', 'Delivery address', help="Address of partner", readonly=False, states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, domain="[('partner_id', '=', partner_id)]"), |
108 | 322 | 'partner_id2': fields.many2one('res.partner', 'Partner', required=False), | 322 | 'partner_id2': fields.many2one('res.partner', 'Partner', required=False), |
109 | 323 | 'ext_cu': fields.many2one('stock.location', string='Ext. C.U.'), | ||
110 | 323 | 'partner_type': fields.related( | 324 | 'partner_type': fields.related( |
111 | 324 | 'partner_id', | 325 | 'partner_id', |
112 | 325 | 'partner_type', | 326 | 'partner_type', |
113 | @@ -376,6 +377,18 @@ | |||
114 | 376 | 'company_id2': lambda s,c,u,ids,ctx=None: s.pool.get('res.users').browse(c,u,u).company_id.partner_id.id, | 377 | 'company_id2': lambda s,c,u,ids,ctx=None: s.pool.get('res.users').browse(c,u,u).company_id.partner_id.id, |
115 | 377 | } | 378 | } |
116 | 378 | 379 | ||
117 | 380 | |||
118 | 381 | def on_change_ext_cu(self, cr, uid, ids, ext_cu, context=None): | ||
119 | 382 | if self.pool.get('stock.move').search_exist(cr, uid, [('picking_id', 'in', ids)], context=context): | ||
120 | 383 | return { | ||
121 | 384 | 'warning': { | ||
122 | 385 | 'title': _('Warning'), | ||
123 | 386 | 'message': _('You are changing an External Consumption Unit, please check that source location of your stock moves are still consistent'), | ||
124 | 387 | } | ||
125 | 388 | } | ||
126 | 389 | return {} | ||
127 | 390 | |||
128 | 391 | |||
129 | 379 | def copy_data(self, cr, uid, id, default=None, context=None): | 392 | def copy_data(self, cr, uid, id, default=None, context=None): |
130 | 380 | if default is None: | 393 | if default is None: |
131 | 381 | default = {} | 394 | default = {} |
132 | @@ -1335,6 +1348,14 @@ | |||
133 | 1335 | 1348 | ||
134 | 1336 | return False | 1349 | return False |
135 | 1337 | 1350 | ||
136 | 1351 | def _default_is_ext_cu(self, cr, uid, context=None): | ||
137 | 1352 | if not context: | ||
138 | 1353 | context = {} | ||
139 | 1354 | if context.get('ext_cu', False): | ||
140 | 1355 | return True | ||
141 | 1356 | return False | ||
142 | 1357 | |||
143 | 1358 | |||
144 | 1338 | def _get_inactive_product(self, cr, uid, ids, field_name, args, context=None): | 1359 | def _get_inactive_product(self, cr, uid, ids, field_name, args, context=None): |
145 | 1339 | ''' | 1360 | ''' |
146 | 1340 | Fill the error message if the product of the line is inactive | 1361 | Fill the error message if the product of the line is inactive |
147 | @@ -1418,6 +1439,7 @@ | |||
148 | 1418 | 'from_dpo': fields.function(_get_from_dpo, fnct_search=_search_from_dpo, type='boolean', method=True, store=False, string='From DPO ?'), | 1439 | 'from_dpo': fields.function(_get_from_dpo, fnct_search=_search_from_dpo, type='boolean', method=True, store=False, string='From DPO ?'), |
149 | 1419 | 'sync_dpo': fields.boolean(string='Sync. DPO'), | 1440 | 'sync_dpo': fields.boolean(string='Sync. DPO'), |
150 | 1420 | 'from_wkf_line': fields.related('picking_id', 'from_wkf', type='boolean', string='Internal use: from wkf'), | 1441 | 'from_wkf_line': fields.related('picking_id', 'from_wkf', type='boolean', string='Internal use: from wkf'), |
151 | 1442 | 'is_ext_cu': fields.boolean(string='Ext. CU'), | ||
152 | 1421 | 'fake_state': fields.related('state', type='char', store=False, string="Internal use"), | 1443 | 'fake_state': fields.related('state', type='char', store=False, string="Internal use"), |
153 | 1422 | 'processed_stock_move': fields.boolean(string='Processed Stock Move'), | 1444 | 'processed_stock_move': fields.boolean(string='Processed Stock Move'), |
154 | 1423 | 'inactive_product': fields.function(_get_inactive_product, method=True, type='boolean', string='Product is inactive', store=False, multi='inactive'), | 1445 | 'inactive_product': fields.function(_get_inactive_product, method=True, type='boolean', string='Product is inactive', store=False, multi='inactive'), |
155 | @@ -1442,6 +1464,7 @@ | |||
156 | 1442 | 'inactive_product': False, | 1464 | 'inactive_product': False, |
157 | 1443 | 'inactive_error': lambda *a: '', | 1465 | 'inactive_error': lambda *a: '', |
158 | 1444 | 'has_to_be_resourced': False, | 1466 | 'has_to_be_resourced': False, |
159 | 1467 | 'is_ext_cu': _default_is_ext_cu, | ||
160 | 1445 | } | 1468 | } |
161 | 1446 | 1469 | ||
162 | 1447 | @check_rw_warning | 1470 | @check_rw_warning |
163 | @@ -2065,7 +2088,7 @@ | |||
164 | 2065 | kwargs['move'] is the current move | 2088 | kwargs['move'] is the current move |
165 | 2066 | ''' | 2089 | ''' |
166 | 2067 | move = kwargs['move'] | 2090 | move = kwargs['move'] |
168 | 2068 | return move.location_id.usage == 'supplier' | 2091 | return move.location_id.usage == 'supplier' or (move.location_id.usage == 'customer' and move.location_id.location_category == 'consumption_unit') |
169 | 2069 | 2092 | ||
170 | 2070 | def _hook_cancel_assign_batch(self, cr, uid, ids, context=None): | 2093 | def _hook_cancel_assign_batch(self, cr, uid, ids, context=None): |
171 | 2071 | ''' | 2094 | ''' |
172 | @@ -2575,6 +2598,25 @@ | |||
173 | 2575 | return [('id', 'in', ids)] | 2598 | return [('id', 'in', ids)] |
174 | 2576 | return [] | 2599 | return [] |
175 | 2577 | 2600 | ||
176 | 2601 | def _search_filter_partner_ext_cu(self, cr, uid, ids, fields, arg, context=None): | ||
177 | 2602 | if not arg or not arg[0][2] or not isinstance(arg[0][2], list) or not len(arg[0][2]) == 2: | ||
178 | 2603 | return [] | ||
179 | 2604 | if context is None: | ||
180 | 2605 | context = {} | ||
181 | 2606 | |||
182 | 2607 | partner_id2 = arg[0][2][0] | ||
183 | 2608 | ext_cu = arg[0][2][1] | ||
184 | 2609 | |||
185 | 2610 | domain = [] | ||
186 | 2611 | if not partner_id2 and not ext_cu: | ||
187 | 2612 | domain = [] | ||
188 | 2613 | elif partner_id2: | ||
189 | 2614 | domain = [('usage', '=', 'supplier')] | ||
190 | 2615 | else: # ext_cu | ||
191 | 2616 | domain = [('usage', '=', 'customer'), ('location_category', '=', 'consumption_unit')] | ||
192 | 2617 | |||
193 | 2618 | return domain | ||
194 | 2619 | |||
195 | 2578 | 2620 | ||
196 | 2579 | _columns = { | 2621 | _columns = { |
197 | 2580 | 'chained_location_type': fields.selection([('none', 'None'), ('customer', 'Customer'), ('fixed', 'Fixed Location'), ('nomenclature', 'Nomenclature')], | 2622 | 'chained_location_type': fields.selection([('none', 'None'), ('customer', 'Customer'), ('fixed', 'Fixed Location'), ('nomenclature', 'Nomenclature')], |
198 | @@ -2586,6 +2628,7 @@ | |||
199 | 2586 | "\n* Fixed Location: The chained location is taken from the next field: Chained Location if Fixed." \ | 2628 | "\n* Fixed Location: The chained location is taken from the next field: Chained Location if Fixed." \ |
200 | 2587 | "\n* Nomenclature: The chained location is taken from the options field: Chained Location is according to the nomenclature level of product."\ | 2629 | "\n* Nomenclature: The chained location is taken from the options field: Chained Location is according to the nomenclature level of product."\ |
201 | 2588 | ), | 2630 | ), |
202 | 2631 | 'filter_partner_ext_cu': fields.function(_fake_get, method=True, type='boolean', string='Filter location by partner', fnct_search=_search_filter_partner_ext_cu), | ||
203 | 2589 | 'chained_options_ids': fields.one2many('stock.location.chained.options', 'location_id', string='Chained options'), | 2632 | 'chained_options_ids': fields.one2many('stock.location.chained.options', 'location_id', string='Chained options'), |
204 | 2590 | 'optional_loc': fields.boolean(string='Is an optional location ?'), | 2633 | 'optional_loc': fields.boolean(string='Is an optional location ?'), |
205 | 2591 | 'stock_real': fields.function(_product_value, method=True, type='float', string='Real Stock', multi="stock"), | 2634 | 'stock_real': fields.function(_product_value, method=True, type='float', string='Real Stock', multi="stock"), |
206 | 2592 | 2635 | ||
207 | === modified file 'bin/addons/stock_override/stock_view.xml' | |||
208 | --- bin/addons/stock_override/stock_view.xml 2017-05-10 12:47:14 +0000 | |||
209 | +++ bin/addons/stock_override/stock_view.xml 2017-05-24 07:13:20 +0000 | |||
210 | @@ -561,11 +561,13 @@ | |||
211 | 561 | </script> | 561 | </script> |
212 | 562 | </html> | 562 | </html> |
213 | 563 | </group> | 563 | </group> |
214 | 564 | <field name="sale_id" invisible="1" /> | ||
215 | 564 | <group colspan="4" col="6"> | 565 | <group colspan="4" col="6"> |
216 | 565 | <group colspan="4" col="4"> | 566 | <group colspan="4" col="4"> |
217 | 566 | <field name="name" readonly="1"/> | 567 | <field name="name" readonly="1"/> |
218 | 567 | <field name="origin" attrs="{'readonly': [('state', 'not in', ['draft', 'auto', 'assigned', 'confirmed'])]}"/> | 568 | <field name="origin" attrs="{'readonly': [('state', 'not in', ['draft', 'auto', 'assigned', 'confirmed'])]}"/> |
220 | 568 | <field name="partner_id2" on_change="on_change_partner(partner_id2, address_id)" required="0" attrs="{'readonly': [('state', 'not in', ['draft', 'waiting', 'confirmed', 'assigned'])]}"/> | 569 | <field name="partner_id2" on_change="on_change_partner(partner_id2, address_id)" required="0" attrs="{'readonly': ['|', ('state', 'not in', ['draft', 'waiting', 'confirmed', 'assigned']), ('ext_cu', '!=', False)]}"/> |
221 | 570 | <field name="ext_cu" on_change="on_change_ext_cu(ext_cu)" attrs="{'readonly': ['|', '|', ('partner_id2', '!=', False), ('sale_id', '!=', False), ('purchase_id', '!=', False)]}" domain="[('location_category', '=', 'consumption_unit')]" /> | ||
222 | 569 | <field name="address_id" invisible="1" /> | 571 | <field name="address_id" invisible="1" /> |
223 | 570 | <field name="backorder_id" readonly="1"/> | 572 | <field name="backorder_id" readonly="1"/> |
224 | 571 | <field name="reason_type_id" widget="selection" | 573 | <field name="reason_type_id" widget="selection" |
225 | @@ -637,6 +639,7 @@ | |||
226 | 637 | <group colspan="2" col="4"> | 639 | <group colspan="2" col="4"> |
227 | 638 | <separator colspan="4" string="Move Information"/> | 640 | <separator colspan="4" string="Move Information"/> |
228 | 639 | <field name="from_wkf_line" invisible="1" /> | 641 | <field name="from_wkf_line" invisible="1" /> |
229 | 642 | <field name="is_ext_cu" invisible="1" /> | ||
230 | 640 | <field name="name" invisible="1" colspan="4"/> | 643 | <field name="name" invisible="1" colspan="4"/> |
231 | 641 | <field name="product_id" | 644 | <field name="product_id" |
232 | 642 | context="{'location': location_id, 'prodlot_id': prodlot_id, 'compute_child': True, 'available_for_restriction': 'picking', 'search_default_not_restricted': 1}" | 645 | context="{'location': location_id, 'prodlot_id': prodlot_id, 'compute_child': True, 'available_for_restriction': 'picking', 'search_default_not_restricted': 1}" |
233 | @@ -666,9 +669,9 @@ | |||
234 | 666 | <group colspan="2" col="2"> | 669 | <group colspan="2" col="2"> |
235 | 667 | <separator string="Locations" colspan="2"/> | 670 | <separator string="Locations" colspan="2"/> |
236 | 668 | <field name="location_id" | 671 | <field name="location_id" |
238 | 669 | domain="[('usage', '!=', 'view'), ('usage', '=', 'supplier'), ('id', '!=', location_dest_id)]" | 672 | domain="[('filter_partner_ext_cu', 'in', [parent.partner_id2, parent.ext_cu]), ('usage', '!=', 'view'), ('id', '!=', location_dest_id), '|', '&', ('usage', '=', 'customer'), ('location_category', '=', 'consumption_unit'), ('usage', '=', 'supplier')]" |
239 | 670 | context="{'specific_rules_tree_view': True, 'prodlot_id': prodlot_id, 'product_id': product_id, 'compute_child': False}" | 673 | context="{'specific_rules_tree_view': True, 'prodlot_id': prodlot_id, 'product_id': product_id, 'compute_child': False}" |
241 | 671 | attrs="{'readonly': [('from_wkf_line', '=', True)]}" | 674 | attrs="{'readonly': ['|', ('from_wkf_line', '=', True), ('is_ext_cu', '=', True)]}" |
242 | 672 | /> | 675 | /> |
243 | 673 | <field name="product_type" invisible="1"/> | 676 | <field name="product_type" invisible="1"/> |
244 | 674 | <field name="location_dest_id" | 677 | <field name="location_dest_id" |