Merge lp:~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator into lp:openerp-isp

Proposed by Mathieu Benoit
Status: Needs review
Proposed branch: lp:~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator
Merge into: lp:openerp-isp
Diff against target: 1231 lines (+592/-383)
6 files modified
contract_isp_package_configurator/__openerp__.py (+3/-1)
contract_isp_package_configurator/company.py (+2/-1)
contract_isp_package_configurator/contract_isp_package_configurator_view.xml (+10/-11)
contract_isp_package_configurator/i18n/contract_isp_package_configurator.pot (+263/-0)
contract_isp_package_configurator/wizard/package_configurator.py (+188/-244)
contract_isp_package_configurator/wizard/package_configurator.xml (+126/-126)
To merge this branch: bzr merge lp:~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator
Reviewer Review Type Date Requested Status
Joao Alfredo Gama Batista Pending
Review via email: mp+214056@code.launchpad.net

Description of the change

Clean code contract_isp_package_configurator
- pep8
- Remove dupplication code
- Add .pot

To post a comment you must log in.
27. By Mathieu Benoit

[FIX] wizard package_configurator: inverse state product and dependency, for logical workflow.

28. By Mathieu Benoit

[IMP] format package_configurator.xml

Unmerged revisions

28. By Mathieu Benoit

[IMP] format package_configurator.xml

27. By Mathieu Benoit

[FIX] wizard package_configurator: inverse state product and dependency, for logical workflow.

26. By Mathieu Benoit

[FIX] contract_isp_package_configurator: fix last clean - missing variable

25. By Mathieu Benoit

[IMP] contract_isp_package_configurator: add .pot and clean code.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'contract_isp_package_configurator/__openerp__.py'
--- contract_isp_package_configurator/__openerp__.py 2013-09-16 17:59:01 +0000
+++ contract_isp_package_configurator/__openerp__.py 2014-04-07 19:36:16 +0000
@@ -28,7 +28,9 @@
28Contract ISP Package Configurator28Contract ISP Package Configurator
29=================================29=================================
3030
31This module provides a wizard to help create service packages based on product inter-dependencies. It uses the dependency tree provided by the product_dependencies module.""",31This module provides a wizard to help create service packages based on product\
32 inter-dependencies. It uses the dependency tree provided by the\
33 product_dependencies module.""",
32 'author': 'Savoirfaire-Linux Inc',34 'author': 'Savoirfaire-Linux Inc',
33 'website': 'www.savoirfairelinux.com',35 'website': 'www.savoirfairelinux.com',
34 'license': 'AGPL-3',36 'license': 'AGPL-3',
3537
=== modified file 'contract_isp_package_configurator/company.py'
--- contract_isp_package_configurator/company.py 2013-09-16 17:59:01 +0000
+++ contract_isp_package_configurator/company.py 2014-04-07 19:36:16 +0000
@@ -30,5 +30,6 @@
30 'product.category',30 'product.category',
31 'Default Product Category',31 'Default Product Category',
32 required=True,32 required=True,
33 help='''Set the default starting point for the package configuration wizard'''),33 help='''Set the default starting point for the package \
34 configuration wizard'''),
34 }35 }
3536
=== modified file 'contract_isp_package_configurator/contract_isp_package_configurator_view.xml'
--- contract_isp_package_configurator/contract_isp_package_configurator_view.xml 2013-09-16 17:59:01 +0000
+++ contract_isp_package_configurator/contract_isp_package_configurator_view.xml 2014-04-07 19:36:16 +0000
@@ -13,17 +13,16 @@
13 </xpath>13 </xpath>
14 </field>14 </field>
15 </record>15 </record>
16 <record id="view_company_form_package_configurator" model="ir.ui.view">16 <record id="view_company_form_package_configurator" model="ir.ui.view">
17 <field name="name">company.form.package.configurator</field>17 <field name="name">company.form.package.configurator</field>
18 <field name="model">res.company</field>18 <field name="model">res.company</field>
19 <field name="inherit_id" ref="contract_isp.view_company_contract_isp_form"/>19 <field name="inherit_id" ref="contract_isp.view_company_contract_isp_form"/>
20 <field name="arch" type="xml">20 <field name="arch" type="xml">
21 <field name="parent_account_id" position="before">21 <field name="parent_account_id" position="before">
22 <field name="default_product_category" />22 <field name="default_product_category" />
23 </field>23 </field>
24 </field>24 </field>
25 </record>25 </record>
26
27 </data>26 </data>
28</openerp>27</openerp>
2928
3029
=== modified file 'contract_isp_package_configurator/i18n/contract_isp_package_configurator.pot'
--- contract_isp_package_configurator/i18n/contract_isp_package_configurator.pot 2013-09-16 17:59:01 +0000
+++ contract_isp_package_configurator/i18n/contract_isp_package_configurator.pot 2014-04-07 19:36:16 +0000
@@ -0,0 +1,263 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * contract_isp_package_configurator
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2014-04-02 19:06+0000\n"
10"PO-Revision-Date: 2014-04-02 19:06+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: contract_isp_package_configurator
19#: view:contract.service.configurator:0
20#: field:contract.service.configurator,product_category_id:0
21#: field:contract.service.configurator,root_category_id:0
22msgid "Category"
23msgstr ""
24
25#. module: contract_isp_package_configurator
26#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:42
27#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:114
28#: selection:contract.service.configurator.dependency.line,state:0
29#: selection:contract.service.configurator.line,state:0
30#, python-format
31msgid "Information"
32msgstr ""
33
34#. module: contract_isp_package_configurator
35#: field:contract.service.configurator,is_level2:0
36msgid "Is level 2"
37msgstr ""
38
39#. module: contract_isp_package_configurator
40#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:149
41#: selection:contract.service.configurator,state:0
42#, python-format
43msgid "Select product"
44msgstr ""
45
46#. module: contract_isp_package_configurator
47#: field:contract.service.configurator.dependency.line,handle_dependency:0
48#: field:contract.service.configurator.line,handle_dependency:0
49msgid "Handle dependencies"
50msgstr ""
51
52#. module: contract_isp_package_configurator
53#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:44
54#: selection:contract.service.configurator.dependency.line,state:0
55#: selection:contract.service.configurator.line,state:0
56#, python-format
57msgid "No Stock"
58msgstr ""
59
60#. module: contract_isp_package_configurator
61#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator_dependency_line
62msgid "contract.service.configurator.dependency.line"
63msgstr ""
64
65#. module: contract_isp_package_configurator
66#: view:contract.service.configurator:0
67msgid "Next"
68msgstr ""
69
70#. module: contract_isp_package_configurator
71#: help:res.company,default_product_category:0
72msgid "Set the default starting point for the package configuration wizard"
73msgstr ""
74
75#. module: contract_isp_package_configurator
76#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:148
77#: selection:contract.service.configurator,state:0
78#, python-format
79msgid "Start"
80msgstr ""
81
82#. module: contract_isp_package_configurator
83#: view:contract.service.configurator:0
84msgid "Add"
85msgstr ""
86
87#. module: contract_isp_package_configurator
88#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:43
89#: selection:contract.service.configurator.dependency.line,state:0
90#: selection:contract.service.configurator.line,state:0
91#, python-format
92msgid "Select serial number"
93msgstr ""
94
95#. module: contract_isp_package_configurator
96#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:150
97#: selection:contract.service.configurator,state:0
98#, python-format
99msgid "Select components"
100msgstr ""
101
102#. module: contract_isp_package_configurator
103#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:356
104#, python-format
105msgid "Product not found!"
106msgstr ""
107
108#. module: contract_isp_package_configurator
109#: view:contract.service.configurator:0
110#: field:contract.service.configurator.dependency.line,product_id:0
111#: field:contract.service.configurator.line,product_id:0
112msgid "Product"
113msgstr ""
114
115#. module: contract_isp_package_configurator
116#: field:contract.service.configurator,current_product_id:0
117msgid "Add Product"
118msgstr ""
119
120#. module: contract_isp_package_configurator
121#: field:contract.service.configurator.dependency.line,parent_id:0
122#: field:contract.service.configurator.line,parent_id:0
123msgid "Parent"
124msgstr ""
125
126#. module: contract_isp_package_configurator
127#: field:contract.service.configurator.dependency.line,serial:0
128#: view:contract.service.configurator.line:0
129#: field:contract.service.configurator.line,serial:0
130msgid "Serial Number"
131msgstr ""
132
133#. module: contract_isp_package_configurator
134#: field:contract.service.configurator,dependency_ids:0
135msgid "Dependencies"
136msgstr ""
137
138#. module: contract_isp_package_configurator
139#: field:res.company,default_product_category:0
140msgid "Default Product Category"
141msgstr ""
142
143#. module: contract_isp_package_configurator
144#: field:contract.service.configurator,line_ids:0
145msgid "Line"
146msgstr ""
147
148#. module: contract_isp_package_configurator
149#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator_line
150msgid "contract.service.configurator.line"
151msgstr ""
152
153#. module: contract_isp_package_configurator
154#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:414
155#, python-format
156msgid "Product Details"
157msgstr ""
158
159#. module: contract_isp_package_configurator
160#: view:contract.service.configurator.line:0
161msgid "Ok"
162msgstr ""
163
164#. module: contract_isp_package_configurator
165#: field:contract.service.configurator.dependency.line,name:0
166#: field:contract.service.configurator.line,name:0
167msgid "Name"
168msgstr ""
169
170#. module: contract_isp_package_configurator
171#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator
172msgid "contract.service.configurator"
173msgstr ""
174
175#. module: contract_isp_package_configurator
176#: model:ir.model,name:contract_isp_package_configurator.model_res_company
177msgid "Companies"
178msgstr ""
179
180#. module: contract_isp_package_configurator
181#: field:contract.service.configurator,contract_id:0
182msgid "Contract"
183msgstr ""
184
185#. module: contract_isp_package_configurator
186#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:41
187#: selection:contract.service.configurator.dependency.line,state:0
188#: selection:contract.service.configurator.line,state:0
189#, python-format
190msgid "Added"
191msgstr ""
192
193#. module: contract_isp_package_configurator
194#: view:contract.service.configurator:0
195#: view:contract.service.configurator.line:0
196msgid "Products"
197msgstr ""
198
199#. module: contract_isp_package_configurator
200#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:356
201#, python-format
202msgid "Error"
203msgstr ""
204
205#. module: contract_isp_package_configurator
206#: view:account.analytic.account:0
207#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:426
208#: view:contract.service.configurator:0
209#: field:contract.service.configurator.dependency.line,configurator_id:0
210#: view:contract.service.configurator.line:0
211#: field:contract.service.configurator.line,configurator_id:0
212#: model:ir.actions.act_window,name:contract_isp_package_configurator.action_contract_isp_package_configurator
213#, python-format
214msgid "Package Configurator"
215msgstr ""
216
217#. module: contract_isp_package_configurator
218#: field:contract.service.configurator.dependency.line,stock_move_id:0
219#: field:contract.service.configurator.line,stock_move_id:0
220msgid "Stock Move"
221msgstr ""
222
223#. module: contract_isp_package_configurator
224#: field:contract.service.configurator,state:0
225#: field:contract.service.configurator.dependency.line,state:0
226#: field:contract.service.configurator.line,state:0
227msgid "State"
228msgstr ""
229
230#. module: contract_isp_package_configurator
231#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:45
232#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:151
233#: view:contract.service.configurator:0
234#: selection:contract.service.configurator,state:0
235#: selection:contract.service.configurator.dependency.line,state:0
236#: selection:contract.service.configurator.line,state:0
237#, python-format
238msgid "Done"
239msgstr ""
240
241#. module: contract_isp_package_configurator
242#: view:contract.service.configurator:0
243msgid "Click on add to view the available components"
244msgstr ""
245
246#. module: contract_isp_package_configurator
247#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:450
248#: view:contract.service.configurator:0
249#, python-format
250msgid "Cancel"
251msgstr ""
252
253#. module: contract_isp_package_configurator
254#: field:contract.service.configurator.dependency.line,message:0
255#: field:contract.service.configurator.line,message:0
256msgid "Message"
257msgstr ""
258
259#. module: contract_isp_package_configurator
260#: view:contract.service.configurator.line:0
261msgid "We don't have this product in stock at the moment!"
262msgstr ""
263
0264
=== modified file 'contract_isp_package_configurator/wizard/package_configurator.py'
--- contract_isp_package_configurator/wizard/package_configurator.py 2013-10-11 14:30:38 +0000
+++ contract_isp_package_configurator/wizard/package_configurator.py 2014-04-07 19:36:16 +0000
@@ -27,7 +27,6 @@
27class contract_service_configurator_line(orm.TransientModel):27class contract_service_configurator_line(orm.TransientModel):
28 _name = 'contract.service.configurator.line'28 _name = 'contract.service.configurator.line'
2929
30 #def _get_stock_production_lot_available(self, cr, uid, )
31 _columns = {30 _columns = {
32 'name': fields.char('Name'),31 'name': fields.char('Name'),
33 'product_id': fields.many2one('product.product', 'Product'),32 'product_id': fields.many2one('product.product', 'Product'),
@@ -42,7 +41,7 @@
42 'state': fields.selection((('draft', _('Added')),41 'state': fields.selection((('draft', _('Added')),
43 ('message', _('Information')),42 ('message', _('Information')),
44 ('serial', _('Select serial number')),43 ('serial', _('Select serial number')),
45 ('stock', ('No Stock')),44 ('stock', _('No Stock')),
46 ('done', _('Done'))), 'State'),45 ('done', _('Done'))), 'State'),
47 }46 }
4847
@@ -51,37 +50,43 @@
51 }50 }
5251
53 def router(self, cr, uid, ids, data=None, context=None):52 def router(self, cr, uid, ids, data=None, context=None):
53 if isinstance(ids, list):
54 ids = ids[0]
55 pool_stock_move = self.pool.get('stock.move')
56 pool_model_data = self.pool.get('ir.model.data')
57
54 stock_move_id = None58 stock_move_id = None
55 if isinstance(ids, list):
56 ids = ids[0]
57 line = self.browse(cr, uid, ids, context=context)59 line = self.browse(cr, uid, ids, context=context)
58 if line.state == 'message':60 if line.state == 'message':
59 if line.product_id.type == 'product' and \61 if line.product_id.type == 'product' \
60 line.product_id.qty_available > 0.0:62 and line.product_id.qty_available > 0:
61 state = 'serial'63 state = 'serial'
62 else:64 else:
63 state = 'stock'65 state = 'stock'
64 elif line.state in ('serial', 'stock'):66 elif line.state in ('serial', 'stock'):
65 stock_move_obj = self.pool.get('stock.move')67 location_id = \
66 location_id = self.pool.get('ir.model.data').get_object_reference(68 pool_model_data.get_object_reference(cr, uid, 'stock',
67 cr, uid, 'stock', 'stock_location_stock')[1]69 'stock_location_stock')[1]
68 location_dest_id = line.configurator_id.contract_id.partner_id.property_stock_customer.id70 partner = line.configurator_id.contract_id.partner_id
71 product = line.product_id and line.product_id
72 product_uom = product and product.uom_id
73 location_dest_id = partner.property_stock_customer.id
69 move = {74 move = {
70 'name': line.product_id and line.product_id.name or '',75 'name': line.product_id and line.product_id.name or '',
71 'product_id': line.product_id and line.product_id.id,76 'product_id': product and product.id,
72 'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,77 'product_uom': product_uom and product_uom.id or None,
73 'prodlot_id': line.serial and line.serial.id or None,78 'prodlot_id': line.serial and line.serial.id or None,
74 'location_id': location_id,79 'location_id': location_id,
75 'location_dest_id': location_dest_id,80 'location_dest_id': location_dest_id,
76 'partner_id': line.configurator_id.contract_id.partner_id.id,81 'partner_id': partner.id,
77 'type': 'out'82 'type': 'out'
78 }83 }
79 stock_move_id = stock_move_obj.create(84 stock_move_id = pool_stock_move.create(cr, uid, move,
80 cr, uid, move, context=context)85 context=context)
81 stock_move_obj.action_confirm(86 pool_stock_move.action_confirm(cr, uid, [stock_move_id],
82 cr, uid, [stock_move_id], context=context)87 context=context)
83 stock_move_obj.action_done(88 pool_stock_move.action_done(cr, uid, [stock_move_id],
84 cr, uid, [stock_move_id], context=context)89 context=context)
8590
86 state = 'done'91 state = 'done'
8792
@@ -93,37 +98,21 @@
93 if isinstance(ids, int):98 if isinstance(ids, int):
94 ids = [ids]99 ids = [ids]
95100
96 for line in self.browse(cr, uid, ids, context=context):101 cancel_dependancy(self, cr, uid, ids, context, cancel_line=False)
97 if line.product_id.type == 'product' and line.stock_move_id:
98 stock_move_obj = self.pool.get('stock.move')
99 move = {
100 'name': ' '.join([_('Cancel'), line.product_id and line.product_id.name or '']),
101 'product_id': line.product_id and line.product_id.id,
102 'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,
103 'prodlot_id': line.serial and line.serial.id or None,
104 'location_id': line.stock_move_id.location_dest_id.id,
105 'location_dest_id': line.stock_move_id.location_id.id,
106 'partner_id': line.configurator_id.contract_id.partner_id.id,
107 'type': 'in'
108 }
109 stock_move_id = stock_move_obj.create(
110 cr, uid, move, context=context)
111 stock_move_obj.action_confirm(
112 cr, uid, [stock_move_id], context=context)
113 stock_move_obj.action_done(
114 cr, uid, [stock_move_id], context=context)
115102
116 return super(contract_service_configurator_line, self).unlink(103 return super(contract_service_configurator_line, self).unlink(
117 cr, uid, ids, context=context)104 cr, uid, ids, context=context)
118105
119 def onchange_product_id(self, cr, uid, ids, product_id, context):106 def onchange_product_id(self, cr, uid, ids, product_id, context):
120 ret = {}107 ret = {}
121 product_product_obj = self.pool.get('product.product')108 pool_product_product = self.pool.get('product.product')
109 product_product_obj = pool_product_product.browse(cr, uid, product_id,
110 context)
122111
123 if product_product_obj.browse(cr, uid, product_id, context).description:112 if product_product_obj.description:
124 ret['warning'] = {113 ret['warning'] = {
125 'title': _('Information'),114 'title': _('Information'),
126 'message': product_product_obj.browse(cr, uid, product_id, context).description115 'message': product_product_obj.description
127 }116 }
128 return ret117 return ret
129118
@@ -136,46 +125,41 @@
136class contract_service_configurator(orm.TransientModel):125class contract_service_configurator(orm.TransientModel):
137 _name = 'contract.service.configurator'126 _name = 'contract.service.configurator'
138127
139 def _get_default_category(self, cr, uid, context=None):128 def get_default_category(self, cr, uid, context=None):
140 res_company_obj = self.pool.get("res.company")129 res_company_obj = self.pool.get("res.company")
141 company_id = res_company_obj._company_default_get(cr, uid, context)130 company_id = res_company_obj._company_default_get(cr, uid, context)
142 res_company = res_company_obj.browse(cr, uid, company_id,131 res_company = res_company_obj.browse(cr, uid, company_id,
143 context=context)132 context=context)
144 return res_company.default_product_category and \133 cat = res_company.default_product_category
145 res_company.default_product_category.id134 return cat and cat.id
146135
147 def _get_is_level2(self, cr, uid, context=None):136 def get_is_level2(self, cr, uid, context=None):
148 ir_model_data_obj = self.pool.get('ir.model.data')137 ir_model_data_obj = self.pool.get('ir.model.data')
149 res_groups_obj = self.pool.get('res.groups')
150 res_user = self.pool.get('res.users').browse(138 res_user = self.pool.get('res.users').browse(
151 cr, uid, uid, context={})139 cr, uid, uid, context={})
152 group_agent_n2_id = ir_model_data_obj.get_object_reference(140 group_agent_n2_id = ir_model_data_obj.get_object_reference(
153 cr, uid, 'contract_isp', 'group_isp_agent2')[1]141 cr, uid, 'contract_isp', 'group_isp_agent2')[1]
154 group_agent_n2 = res_groups_obj.browse(
155 cr, uid, group_agent_n2_id, context={})
156142
157 groups_id = [i.id for i in res_user.groups_id]143 groups_id = [i.id for i in res_user.groups_id]
158 if group_agent_n2_id not in groups_id:144 return group_agent_n2_id in groups_id
159 return False
160 else:
161 return True
162145
163 _columns = {146 _columns = {
164 'contract_id': fields.many2one('account.analytic.account', 'Contract'),147 'contract_id': fields.many2one('account.analytic.account', 'Contract'),
165 'state': fields.selection((('draft', _('Start')),148 'state': fields.selection((('draft', _('Start')),
149 ('dependency', _('Select components')),
166 ('product', _('Select product')),150 ('product', _('Select product')),
167 ('dependency', _('Select components')),
168 ('done', _('Done'))), 'State'),151 ('done', _('Done'))), 'State'),
169 'line_ids': fields.one2many('contract.service.configurator.line',152 'line_ids': fields.one2many('contract.service.configurator.line',
170 'configurator_id',153 'configurator_id',
171 'Line'),154 'Line'),
172 'current_product_id': fields.many2one('product.product',155 'current_product_id': fields.many2one('product.product',
173 'Add Product'),156 'Add Product'),
174 'dependency_ids': fields.many2many('contract.service.configurator.dependency.line',157 'dependency_ids': fields.many2many(
175 'contract_service_configurator_dependency_rel',158 'contract.service.configurator.dependency.line',
176 'configurator_id',159 'contract_service_configurator_dependency_rel',
177 'dependency_id',160 'configurator_id',
178 'Dependencies'),161 'dependency_id',
162 'Dependencies'),
179 'root_category_id': fields.many2one('product.category', 'Category'),163 'root_category_id': fields.many2one('product.category', 'Category'),
180 'product_category_id': fields.many2one('product.category', 'Category'),164 'product_category_id': fields.many2one('product.category', 'Category'),
181 'is_level2': fields.boolean('Is level 2')165 'is_level2': fields.boolean('Is level 2')
@@ -183,16 +167,18 @@
183167
184 _defaults = {168 _defaults = {
185 'state': 'draft',169 'state': 'draft',
186 'product_category_id': lambda s, cr, uid, ctx: s._get_default_category(cr, uid, ctx),170 'product_category_id':
187 'root_category_id': lambda s, cr, uid, ctx: s._get_default_category(cr, uid, ctx),171 lambda s, cr, uid, ctx: s.get_default_category(cr, uid, ctx),
188 'is_level2': lambda s, cr, uid, ctx: s._get_is_level2(cr, uid, ctx)172 'root_category_id':
173 lambda s, cr, uid, ctx: s.get_default_category(cr, uid, ctx),
174 'is_level2': lambda s, cr, uid, ctx: s.get_is_level2(cr, uid, ctx)
189 }175 }
190176
191 def onchange_product_category_id(self, cr, uid, ids,177 @staticmethod
192 product_category_id, is_level2):178 def onchange_product_category_id(cr, uid, ids, product_category_id,
179 is_level2):
193 domain = [('categ_id', '=', product_category_id)]180 domain = [('categ_id', '=', product_category_id)]
194 ret = {181 ret = {'domain': {'current_product_id': None}}
195 'domain': {'current_product_id': None}}
196182
197 if not is_level2:183 if not is_level2:
198 domain.append(('list_price', '>=', 0))184 domain.append(('list_price', '>=', 0))
@@ -202,9 +188,10 @@
202 return ret188 return ret
203189
204 def do_next(self, cr, uid, ids, context=None):190 def do_next(self, cr, uid, ids, context=None):
205 contract_service_configurator_line_obj = self.pool.get('contract.service.configurator.line')191 contract_service_configurator_line_obj = self.pool.get(
206 contract_service_configurator_dependency_line_obj = self.pool.get('contract.service.configurator.dependency.line')192 'contract.service.configurator.line')
207 product_product_obj = self.pool.get('product.product')193 pool_conf_dep_line = self.pool.get(
194 'contract.service.configurator.dependency.line')
208195
209 wizard = self.browse(cr, uid, ids[0], context=context)196 wizard = self.browse(cr, uid, ids[0], context=context)
210197
@@ -221,117 +208,116 @@
221 'name': line.product_id.name,208 'name': line.product_id.name,
222 'product_id': line.product_id.id,209 'product_id': line.product_id.id,
223 'configurator_id': wizard.id,210 'configurator_id': wizard.id,
224 'handle_dependency': line.product_id.dependency_ids and True or False,211 'handle_dependency': line.product_id.dependency_ids,
225 'message': line.product_id.description,212 'message': line.product_id.description,
226 'state': state213 'state': state
227 }214 }
228 contract_service_configurator_line_obj.create(cr, uid, l, context=context)215 contract_service_configurator_line_obj.create(cr, uid, l,
216 context=context)
229217
230 query = [('configurator_id', '=', wizard.id)]218 query = [('configurator_id', '=', wizard.id)]
231 ids_to_unlink = contract_service_configurator_dependency_line_obj.search(cr,219 ids_to_unlink = pool_conf_dep_line.search(
232 uid,220 cr,
233 query,221 uid,
234 context=context)222 query,
223 context=context)
235 if ids_to_unlink:224 if ids_to_unlink:
236 contract_service_configurator_dependency_line_obj.unlink(cr, uid,225 pool_conf_dep_line.unlink(cr, uid, ids_to_unlink, context)
237 ids_to_unlink,
238 context)
239226
240 loop_deps = False227 loop_deps = False
241 for line in wizard.line_ids:228 for line in wizard.line_ids:
242 if line.handle_dependency:229 if not line.handle_dependency:
243 loop_deps = True230 continue
244 for dep in line.product_id.dependency_ids:231
245 if dep.type == 'product':232 loop_deps = True
246 if not wizard.is_level2 and dep.list_price < 0:233 self._write_dependance(line, wizard, cr, uid, context)
247 continue234 line.write({'handle_dependency': False})
248235 break
249 if line.product_id.description:
250 state = 'message'
251 elif line.product_id.type == 'product':
252 state = 'serial'
253 else:
254 state = 'done'
255
256 wl = {
257 'name': dep.product_id.name,
258 'product_id': dep.product_id.id,
259 'configurator_id': wizard.id,
260 'parent_id': line.id,
261 'message': line.product_id.description,
262 'state': state
263 }
264 new_dep = contract_service_configurator_dependency_line_obj.create(
265 cr, uid, wl, context=context)
266
267 if dep.auto:
268 wizard.write({'dependency_ids': [(4, new_dep)]})
269
270 elif dep.type == 'category':
271 query = [('categ_id', '=', dep.category_id.id)]
272 product_ids = product_product_obj.search(cr, uid,
273 query,
274 context=context)
275 for product in product_product_obj.browse(cr, uid, product_ids, context=context):
276 if not wizard.is_level2 and dep.list_price < 0:
277 continue
278
279 if line.product_id.description:
280 state = 'message'
281 elif line.product_id.type == 'product':
282 state = 'serial'
283 else:
284 state = 'done'
285
286 wl = {
287 'name': product.name,
288 'product_id': product.id,
289 'configurator_id': wizard.id,
290 'parent_id': line.id,
291 'message': product.description,
292 'state': state
293 }
294 contract_service_configurator_dependency_line_obj.create(cr, uid, wl,
295 context=context)
296 line.write({'handle_dependency': False})
297 break
298236
299 if loop_deps:237 if loop_deps:
300 record = {238 record = {
301 'state': 'dependency',239 'state': 'dependency',
302 }240 }
303 wizard.write(record)
304 return self.router(cr, uid, ids, {}, context=context)
305
306 else:241 else:
307 record = {242 record = {
308 'state': 'product',243 'state': 'product',
309 'current_product_id': None,244 'current_product_id': None,
310 'dependency_ids': [(5)],245 'dependency_ids': [5],
311 }246 }
312 wizard.write(record)247 wizard.write(record)
313248 return self.router(cr, uid, ids, {}, context=context)
314 query = [('configurator_id', '=', wizard.id)]249
315 ids_to_unlink = contract_service_configurator_dependency_line_obj.search(cr,250 def _write_dependance(self, line, wizard, cr, uid, context):
316 uid,251 pool_conf_dep_line = self.pool.get(
317 query,252 'contract.service.configurator.dependency.line')
318 context=context)253 product_product_obj = self.pool.get('product.product')
319 return self.router(cr, uid, ids, {}, context=context)254
255 contains_dep = False
256 for dep in line.product_id.dependency_ids:
257 if dep.type == 'product':
258 if not wizard.is_level2 and dep.list_price < 0:
259 continue
260
261 if line.product_id.description:
262 state = 'message'
263 elif line.product_id.type == 'product':
264 state = 'serial'
265 else:
266 state = 'done'
267 contains_dep = True
268 wl = {
269 'name': dep.product_id.name,
270 'product_id': dep.product_id.id,
271 'configurator_id': wizard.id,
272 'parent_id': line.id,
273 'message': line.product_id.description,
274 'state': state
275 }
276 new_dep = pool_conf_dep_line.create(cr, uid, wl,
277 context=context)
278
279 if dep.auto:
280 wizard.write({'dependency_ids': [(4, new_dep)]})
281
282 elif dep.type == 'category':
283 query = [('categ_id', '=', dep.category_id.id)]
284 product_ids = product_product_obj.search(cr, uid,
285 query,
286 context=context)
287 for product in product_product_obj.browse(cr, uid,
288 product_ids,
289 context=context):
290 if not wizard.is_level2 and dep.list_price < 0:
291 continue
292
293 if line.product_id.description:
294 state = 'message'
295 elif line.product_id.type == 'product':
296 state = 'serial'
297 else:
298 state = 'done'
299 contains_dep = True
300 wl = {
301 'name': product.name,
302 'product_id': product.id,
303 'configurator_id': wizard.id,
304 'parent_id': line.id,
305 'message': product.description,
306 'state': state
307 }
308 pool_conf_dep_line.create(
309 cr, uid, wl,
310 context=context)
311 return contains_dep
320312
321 def do_add_current_product_id(self, cr, uid, ids, context=None):313 def do_add_current_product_id(self, cr, uid, ids, context=None):
322 if context is None:314 if context is None:
323 context = {}315 context = {}
324 deps = 0
325 wizard = self.browse(cr, uid, ids[0], context=context)316 wizard = self.browse(cr, uid, ids[0], context=context)
326 contract_service_configurator_line_obj = self.pool.get(317 pool_cs_conf_line = self.pool.get('contract.service.configurator.line')
327 'contract.service.configurator.line')
328 contract_service_configurator_dependency_line_obj = self.pool.get(
329 'contract.service.configurator.dependency.line')
330 product_product_obj = self.pool.get('product.product')
331 contract_service_serial_obj = self.pool.get('contract.service.serial')
332318
333 if wizard.current_product_id:319 if wizard.current_product_id:
334 #if group_agent_n2_id not in res_user.groups_id and \320 # if group_agent_n2_id not in res_user.groups_id and \
335 # wizard.current_product_id.type == 'product' and \321 # wizard.current_product_id.type == 'product' and \
336 # wizard.current_product_id.qty_available <= 0:322 # wizard.current_product_id.qty_available <= 0:
337 # raise orm.except_orm(_('Error!'), _('Product not available!'))323 # raise orm.except_orm(_('Error!'), _('Product not available!'))
@@ -350,72 +336,19 @@
350 'message': wizard.current_product_id.description,336 'message': wizard.current_product_id.description,
351 'state': state337 'state': state
352 }338 }
353 new_line = contract_service_configurator_line_obj.create(339 new_line = pool_cs_conf_line.create(cr, uid, record,
354 cr, uid, record, context=context)340 context=context)
355341
356 for dep in contract_service_configurator_line_obj.browse(342 product_obj = pool_cs_conf_line.browse(cr, uid, new_line,
357 cr, uid, new_line,343 context=context)
358 context=context).product_id.dependency_ids:344 contains_dep = self._write_dependance(product_obj, wizard, cr, uid,
359345 context)
360 if dep.type == 'product':
361 if not wizard.is_level2 and dep.product_id.list_price < 0:
362 continue
363
364 if dep.product_id.description:
365 state = 'message'
366 elif dep.product_id.type == 'product':
367 state = 'serial'
368 else:
369 state = 'done'
370
371 deps += 1
372 wl = {
373 'name': dep.product_id.name,
374 'product_id': dep.product_id.id,
375 'configurator_id': wizard.id,
376 'parent_id': new_line,
377 'message': dep.product_id.description,
378 'state': state
379 }
380 new_dep = contract_service_configurator_dependency_line_obj.create(cr, uid, wl,
381 context=context)
382
383 if dep.auto:
384 wizard.write({'dependency_ids': [(4, new_dep)]})
385
386 elif dep.type == 'category':
387 query = [('categ_id', '=', dep.category_id.id)]
388 product_ids = product_product_obj.search(cr, uid, query,
389 context=context)
390 for product in product_product_obj.browse(cr, uid,
391 product_ids,
392 context=context):
393 if not wizard.is_level2 and dep.product_id.list_price < 0:
394 continue
395
396 if product.description:
397 state = 'message'
398 elif product.type == 'product':
399 state = 'serial'
400 else:
401 state = 'done'
402
403 deps += 1
404 record = {
405 'name': product.name,
406 'product_id': product.id,
407 'configurator_id': wizard.id,
408 'parent_id': new_line,
409 'message': product.description,
410 'state': state
411 }
412 contract_service_configurator_dependency_line_obj.create(
413 cr, uid, record, context=context)
414346
415 record = {347 record = {
416 'current_product_id': None,348 'current_product_id': None,
417 'product_category_id': self._get_default_category(cr, uid, context),349 'product_category_id': self.get_default_category(cr, uid,
418 'state': deps and 'dependency' or 'product'350 context),
351 'state': contains_dep and 'dependency' or 'product'
419 }352 }
420353
421 wizard.write(record)354 wizard.write(record)
@@ -424,11 +357,7 @@
424 raise orm.except_orm(_('Error'), _('Product not found!'))357 raise orm.except_orm(_('Error'), _('Product not found!'))
425358
426 def do_done(self, cr, uid, ids, context=None):359 def do_done(self, cr, uid, ids, context=None):
427 account_analytic_account_obj = self.pool.get('account.analytic.account')360 pool_contract_service = self.pool.get('contract.service')
428 contract_service_obj = self.pool.get('contract.service')
429 stock_move_obj = self.pool.get('stock.move')
430 contract_service_serial_obj = self.pool.get('contract.service.serial')
431 ret = self.write(cr, uid, ids, {'state': 'done'}, context=context)
432 wizard = self.browse(cr, uid, ids[0], context=context)361 wizard = self.browse(cr, uid, ids[0], context=context)
433 for line in wizard.line_ids:362 for line in wizard.line_ids:
434 l = {363 l = {
@@ -439,7 +368,7 @@
439 'analytic_line_type': line.product_id.analytic_line_type,368 'analytic_line_type': line.product_id.analytic_line_type,
440 'require_activation': line.product_id.require_activation369 'require_activation': line.product_id.require_activation
441 }370 }
442 contract_service_obj.create(cr, uid, l, context=context)371 pool_contract_service.create(cr, uid, l, context=context)
443372
444 if line.product_id.type == 'product' and line.stock_move_id:373 if line.product_id.type == 'product' and line.stock_move_id:
445 line.write({'stock_move_id': None})374 line.write({'stock_move_id': None})
@@ -458,44 +387,26 @@
458 if isinstance(ids, int):387 if isinstance(ids, int):
459 ids = [ids]388 ids = [ids]
460389
461 for line in self.browse(cr, uid, ids[0], context=context).line_ids:390 cancel_dependancy(self, cr, uid, ids, context, cancel_line=True)
462 if line.product_id.type == 'product' and line.stock_move_id:
463 stock_move_obj = self.pool.get('stock.move')
464 move = {
465 'name': ' '.join([_('Cancel'), line.product_id and line.product_id.name or '']),
466 'product_id': line.product_id and line.product_id.id,
467 'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,
468 'prodlot_id': line.serial and line.serial.id or None,
469 'location_id': line.stock_move_id.location_dest_id.id,
470 'location_dest_id': line.stock_move_id.location_id.id,
471 'partner_id': line.configurator_id.contract_id.partner_id.id,
472 'type': 'in'
473 }
474 stock_move_id = stock_move_obj.create(
475 cr, uid, move, context=context)
476 stock_move_obj.action_confirm(
477 cr, uid, [stock_move_id], context=context)
478 stock_move_obj.action_done(
479 cr, uid, [stock_move_id], context=context)
480391
481 return True392 return True
482393
483 def router(self, cr, uid, ids, data=None, context=None):394 def router(self, cr, uid, ids, data=None, context=None):
395 pool_stock_prod_lot = self.pool.get('stock.production.lot')
484 if isinstance(ids, list):396 if isinstance(ids, list):
485 ids = ids[0]397 ids = ids[0]
486 wizard = self.browse(cr, uid, ids, context=context)398 wizard = self.browse(cr, uid, ids, context=context)
487 for line in wizard.line_ids:399 for line in wizard.line_ids:
488 if line.state in ('message', 'serial', 'stock'):400 if line.state in ('message', 'serial', 'stock'):
489 if line.state == 'serial':401 if line.state == 'serial':
490 stock_production_lot_obj = self.pool.get('stock.production.lot')
491 product_product_obj = self.pool.get('product.product')
492402
493 query = [403 query = [
494 ('product_id', '=', line.product_id.id),404 ('product_id', '=', line.product_id.id),
495 ('stock_available', '>', 0)405 ('stock_available', '>', 0)
496 ]406 ]
497407
498 serial_ids = stock_production_lot_obj.search(cr, uid, query, context=context)408 serial_ids = pool_stock_prod_lot.search(cr, uid, query,
409 context=context)
499410
500 if not serial_ids:411 if not serial_ids:
501 line.write({'state': 'stock'})412 line.write({'state': 'stock'})
@@ -523,3 +434,36 @@
523 'nodestroy': True,434 'nodestroy': True,
524 'context': context435 'context': context
525 }436 }
437
438
439def cancel_dependancy(obj_orm, cr, uid, ids, context, cancel_line=True):
440 pool_stock_move = obj_orm.pool.get('stock.move')
441 if cancel_line:
442 lines = obj_orm.browse(cr, uid, ids[0], context=context).line_ids
443 else:
444 lines = obj_orm.browse(cr, uid, ids, context=context)
445
446 for line in lines:
447 if line.product_id.type == 'product' and line.stock_move_id:
448 product = line.product_id and line.product_id
449 product_name = product.name or ''
450 product_uom = product.uom_id and line.product_id.uom_id
451 name = "%s %s" % (_('Cancel'), product_name)
452
453 partner = line.configurator_id.contract_id.partner_id.id
454 move = {
455 'name': name,
456 'product_id': product.id,
457 'product_uom': product_uom,
458 'prodlot_id': line.serial and line.serial.id or None,
459 'location_id': line.stock_move_id.location_dest_id.id,
460 'location_dest_id': line.stock_move_id.location_id.id,
461 'partner_id': partner,
462 'type': 'in'
463 }
464 stock_move_id = pool_stock_move.create(cr, uid, move,
465 context=context)
466 pool_stock_move.action_confirm(cr, uid, [stock_move_id],
467 context=context)
468 pool_stock_move.action_done(cr, uid, [stock_move_id],
469 context=context)
526\ No newline at end of file470\ No newline at end of file
527471
=== modified file 'contract_isp_package_configurator/wizard/package_configurator.xml'
--- contract_isp_package_configurator/wizard/package_configurator.xml 2013-10-10 19:22:10 +0000
+++ contract_isp_package_configurator/wizard/package_configurator.xml 2014-04-07 19:36:16 +0000
@@ -4,145 +4,145 @@
4 <record id="view_contract_service_configurator_line_tree" model="ir.ui.view">4 <record id="view_contract_service_configurator_line_tree" model="ir.ui.view">
5 <field name="name">Package Configurator Line</field>5 <field name="name">Package Configurator Line</field>
6 <field name="model">contract.service.configurator.line</field>6 <field name="model">contract.service.configurator.line</field>
7 <field name="type">tree</field>7 <field name="type">tree</field>
8 <field name="arch" type="xml">8 <field name="arch" type="xml">
9 <tree string="Package Configurator" version="7.0">9 <tree string="Package Configurator" version="7.0">
10 <field name="product_id" />10 <field name="product_id" />
11 </tree>11 </tree>
12 </field>12 </field>
13 </record>13 </record>
1414
15 <record id="view_contract_service_configurator" model="ir.ui.view">15 <record id="view_contract_service_configurator" model="ir.ui.view">
16 <field name="name">Package Configurator</field>16 <field name="name">Package Configurator</field>
17 <field name="model">contract.service.configurator</field>17 <field name="model">contract.service.configurator</field>
18 <field name="arch" type="xml">18 <field name="arch" type="xml">
19 <form string="Package Configurator" version="7.0">19 <form string="Package Configurator" version="7.0">
20 <header>20 <header>
21 <field name="state" class="oe_right" widget="statusbar" />21 <field name="state" class="oe_right" widget="statusbar" />
22 </header>22 </header>
23 <field name="root_category_id" invisible="1" />23 <field name="root_category_id" invisible="1" />
24 <field name="is_level2" invisible="1" />24 <field name="is_level2" invisible="1" />
25 <field name="contract_id" invisible="1" />25 <field name="contract_id" invisible="1" />
26 <group string="Category" attrs="{'invisible': [('state', '=', 'dependency')]}">26 <group string="Category" attrs="{'invisible': [('state', '=', 'dependency')]}">
27 <field27 <field
28 nolabel="1"28 nolabel="1"
29 name="product_category_id"29 name="product_category_id"
30 options="{'no_open': True}"30 options="{'no_open': True}"
31 domain="[('type', '=', 'normal'), ('id', 'child_of', [root_category_id])]"31 domain="[('type', '=', 'normal'), ('id', 'child_of', [root_category_id])]"
32 on_change="onchange_product_category_id(product_category_id, is_level2)" />32 on_change="onchange_product_category_id(product_category_id, is_level2)" />
33 </group>33 </group>
34 <group string="Products" attrs="{'invisible': [('state', '=', 'dependency')]}">34 <group string="Products" attrs="{'invisible': [('state', '=', 'dependency')]}">
35 <group colspan="4">35 <group colspan="4">
36 <div width="100%%">36 <div width="100%%">
37 <field 37 <field
38 name="current_product_id"38 name="current_product_id"
39 width="70%%"39 width="70%%"
40 class="oe_inline"40 class="oe_inline"
41 options="{'no_open': True}"41 options="{'no_open': True}"
42 domain = "[('categ_id', '=', product_category_id)]"42 domain = "[('categ_id', '=', product_category_id)]"
43 placeholder="Product" />43 placeholder="Product" />
44 <button 44 <button
45 name="do_add_current_product_id"45 name="do_add_current_product_id"
46 string="Add"46 string="Add"
47 type="object"47 type="object"
48 states="draft,product"48 states="draft,product"
49 width="15%%"49 width="15%%"
50 class="oe_inline oe_highlight" />50 class="oe_inline oe_highlight" />
51 </div>51 </div>
52 </group>52 </group>
53 <group>53 <group>
54 <field name="line_ids" nolabel="1" mode="tree">54 <field name="line_ids" nolabel="1" mode="tree">
55 <tree create="0">55 <tree create="0">
56 <field name="product_id" />56 <field name="product_id" />
57 <field name="serial" />57 <field name="serial" />
58 </tree>58 </tree>
59 </field>59 </field>
60 </group>60 </group>
61 </group>61 </group>
62 <group attrs="{'invisible': [('state', '&lt;&gt;', 'dependency')]}">62 <group attrs="{'invisible': [('state', '&lt;&gt;', 'dependency')]}">
63 <div colspan="4">63 <div colspan="4">
64 <p>Click on add to view the available components</p>64 <p>Click on add to view the available components</p>
65 </div>65 </div>
66 <field 66 <field
67 name="dependency_ids"67 name="dependency_ids"
68 nolabel="1"68 nolabel="1"
69 mode="tree"69 mode="tree"
70 widget="many2many"70 widget="many2many"
71 domain="[('configurator_id', '=', active_id)]">71 domain="[('configurator_id', '=', active_id)]">
72 <tree>72 <tree>
73 <field name="product_id" on_change="onchange_product_id(product_id, context)"/>73 <field name="product_id" on_change="onchange_product_id(product_id, context)"/>
74 </tree>74 </tree>
75 </field>75 </field>
76 </group>76 </group>
7777
78 <footer>78 <footer>
79 <button 79 <button
80 name="do_next"80 name="do_next"
81 string="Next"81 string="Next"
82 type="object"82 type="object"
83 class="oe_highlight"83 class="oe_highlight"
84 states="dependency"84 states="dependency"
85 />85 />
86 <button 86 <button
87 name="do_done"87 name="do_done"
88 string="Done"88 string="Done"
89 type="object"89 type="object"
90 class="oe_highlight"90 class="oe_highlight"
91 states="product,done"91 states="product,done"
92 />92 />
93 <button93 <button
94 string="Cancel"94 string="Cancel"
95 class="oe_link"95 class="oe_link"
96 type="object"96 type="object"
97 name="do_cancel" />97 name="do_cancel" />
98 </footer>98 </footer>
99 </form>99 </form>
100 </field>100 </field>
101 </record>101 </record>
102102
103 <record id="view_contract_service_configurator_line" model="ir.ui.view">103 <record id="view_contract_service_configurator_line" model="ir.ui.view">
104 <field name="name">Product Details</field>104 <field name="name">Product Details</field>
105 <field name="model">contract.service.configurator.line</field>105 <field name="model">contract.service.configurator.line</field>
106 <field name="arch" type="xml">106 <field name="arch" type="xml">
107 <form string="Package Configurator" version="7.0">107 <form string="Package Configurator" version="7.0">
108 <header>108 <header>
109 <field109 <field
110 name="state"110 name="state"
111 class="oe_right"111 class="oe_right"
112 widget="statusbar"112 widget="statusbar"
113 attrs="{'invisible': [('state', '=', 'message')]}"/>113 attrs="{'invisible': [('state', '=', 'message')]}"/>
114 </header>114 </header>
115 <group string="Products" colspan="4" attrs="{'invisible': [('state', 'in', ('message', 'stock'))]}">115 <group string="Products" colspan="4" attrs="{'invisible': [('state', 'in', ('message', 'stock'))]}">
116 <field name="product_id" readonly="1" />116 <field name="product_id" readonly="1" />
117 <field 117 <field
118 name="serial"118 name="serial"
119 class="oe_inline"119 class="oe_inline"
120 domain="[('product_id', '=', product_id), '&amp;', ('stock_available', '&gt;', 0)]"120 domain="[('product_id', '=', product_id), '&amp;', ('stock_available', '&gt;', 0)]"
121 options="{'no_open': True}"121 options="{'no_open': True}"
122 placeholder="Serial Number"122 placeholder="Serial Number"
123 attrs="{'invisible': [('state', '=', 'draft')]}"/>123 attrs="{'invisible': [('state', '=', 'draft')]}"/>
124 </group>124 </group>
125 <group colspan="4" attrs="{'invisible': [('state', 'in', ('serial', 'stock'))]}">125 <group colspan="4" attrs="{'invisible': [('state', 'in', ('serial', 'stock'))]}">
126 <field 126 <field
127 name="message" 127 name="message"
128 nolabel="1"128 nolabel="1"
129 readonly="1"/>129 readonly="1"/>
130 </group>130 </group>
131 <group colspan="4" attrs="{'invisible': [('state', 'in', ('message', 'serial', 'done'))]}">131 <group colspan="4" attrs="{'invisible': [('state', 'in', ('message', 'serial', 'done'))]}">
132 <p>We don't have this product in stock at the moment!</p>132 <p>We don't have this product in stock at the moment!</p>
133 </group> 133 </group>
134 <footer>134 <footer>
135 <button 135 <button
136 name="router"136 name="router"
137 string="Ok"137 string="Ok"
138 type="object"138 type="object"
139 states="message,serial,stock"139 states="message,serial,stock"
140 class="oe_highlight"140 class="oe_highlight"
141 />141 />
142 </footer>142 </footer>
143 </form>143 </form>
144 </field>144 </field>
145 </record>145 </record>
146146
147 <record id="action_contract_isp_package_configurator" model="ir.actions.act_window">147 <record id="action_contract_isp_package_configurator" model="ir.actions.act_window">
148 <field name="name">Package Configurator</field>148 <field name="name">Package Configurator</field>
@@ -150,9 +150,9 @@
150 <field name="res_model">contract.service.configurator</field>150 <field name="res_model">contract.service.configurator</field>
151 <field name="view_type">form</field>151 <field name="view_type">form</field>
152 <field name="view_mode">form</field>152 <field name="view_mode">form</field>
153 <field name="view_id" ref="contract_isp_package_configurator.view_contract_service_configurator" />153 <field name="view_id" ref="contract_isp_package_configurator.view_contract_service_configurator" />
154 <field name="target">new</field>154 <field name="target">new</field>
155 <field name="context">{'default_contract_id': active_id}</field>155 <field name="context">{'default_contract_id': active_id}</field>
156 </record>156 </record>
157157
158 </data>158 </data>

Subscribers

People subscribed via source and target branches