← Back to team overview

savoirfairelinux-openerp team mailing list archive

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

 

Mathieu Benoit has proposed merging lp:~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator into lp:openerp-isp.

Requested reviews:
  Joao Alfredo Gama Batista (joao-gama)

For more details, see:
https://code.launchpad.net/~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator/+merge/214056

Clean code contract_isp_package_configurator
- pep8
- Remove dupplication code
- Add .pot
-- 
https://code.launchpad.net/~savoirfairelinux-openerp/openerp-isp/contract_isp_package_configurator/+merge/214056
Your team Savoir-faire Linux' OpenERP is subscribed to branch lp:openerp-isp.
=== 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-03 15:14:10 +0000
@@ -28,7 +28,9 @@
 Contract ISP Package Configurator
 =================================
 
-This 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.""",
+This 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.""",
     'author': 'Savoirfaire-Linux Inc',
     'website': 'www.savoirfairelinux.com',
     'license': 'AGPL-3',

=== 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-03 15:14:10 +0000
@@ -30,5 +30,6 @@
             'product.category',
             'Default Product Category',
             required=True,
-            help='''Set the default starting point for the package configuration wizard'''),
+            help='''Set the default starting point for the package \
+            configuration wizard'''),
     }

=== 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-03 15:14:10 +0000
@@ -13,17 +13,16 @@
 		</xpath>
 	    </field>
 	</record>
-        <record id="view_company_form_package_configurator" model="ir.ui.view">
-            <field name="name">company.form.package.configurator</field>
-            <field name="model">res.company</field>
-            <field name="inherit_id" ref="contract_isp.view_company_contract_isp_form"/>
-            <field name="arch" type="xml">
-		<field name="parent_account_id" position="before">
-		    <field name="default_product_category" />
-		</field>
-	    </field>
-	</record>
-
+    <record id="view_company_form_package_configurator" model="ir.ui.view">
+        <field name="name">company.form.package.configurator</field>
+        <field name="model">res.company</field>
+        <field name="inherit_id" ref="contract_isp.view_company_contract_isp_form"/>
+        <field name="arch" type="xml">
+            <field name="parent_account_id" position="before">
+                <field name="default_product_category" />
+            </field>
+        </field>
+    </record>
     </data>
 </openerp>
 

=== 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-03 15:14:10 +0000
@@ -0,0 +1,263 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#	* contract_isp_package_configurator
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-02 19:06+0000\n"
+"PO-Revision-Date: 2014-04-02 19:06+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+#: field:contract.service.configurator,product_category_id:0
+#: field:contract.service.configurator,root_category_id:0
+msgid "Category"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:42
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:114
+#: selection:contract.service.configurator.dependency.line,state:0
+#: selection:contract.service.configurator.line,state:0
+#, python-format
+msgid "Information"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,is_level2:0
+msgid "Is level 2"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:149
+#: selection:contract.service.configurator,state:0
+#, python-format
+msgid "Select product"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,handle_dependency:0
+#: field:contract.service.configurator.line,handle_dependency:0
+msgid "Handle dependencies"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:44
+#: selection:contract.service.configurator.dependency.line,state:0
+#: selection:contract.service.configurator.line,state:0
+#, python-format
+msgid "No Stock"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator_dependency_line
+msgid "contract.service.configurator.dependency.line"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+msgid "Next"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: help:res.company,default_product_category:0
+msgid "Set the default starting point for the package             configuration wizard"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:148
+#: selection:contract.service.configurator,state:0
+#, python-format
+msgid "Start"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+msgid "Add"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:43
+#: selection:contract.service.configurator.dependency.line,state:0
+#: selection:contract.service.configurator.line,state:0
+#, python-format
+msgid "Select serial number"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:150
+#: selection:contract.service.configurator,state:0
+#, python-format
+msgid "Select components"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:356
+#, python-format
+msgid "Product not found!"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+#: field:contract.service.configurator.dependency.line,product_id:0
+#: field:contract.service.configurator.line,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,current_product_id:0
+msgid "Add Product"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,parent_id:0
+#: field:contract.service.configurator.line,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,serial:0
+#: view:contract.service.configurator.line:0
+#: field:contract.service.configurator.line,serial:0
+msgid "Serial Number"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,dependency_ids:0
+msgid "Dependencies"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:res.company,default_product_category:0
+msgid "Default Product Category"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,line_ids:0
+msgid "Line"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator_line
+msgid "contract.service.configurator.line"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:414
+#, python-format
+msgid "Product Details"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator.line:0
+msgid "Ok"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,name:0
+#: field:contract.service.configurator.line,name:0
+msgid "Name"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: model:ir.model,name:contract_isp_package_configurator.model_contract_service_configurator
+msgid "contract.service.configurator"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: model:ir.model,name:contract_isp_package_configurator.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,contract_id:0
+msgid "Contract"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:41
+#: selection:contract.service.configurator.dependency.line,state:0
+#: selection:contract.service.configurator.line,state:0
+#, python-format
+msgid "Added"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+#: view:contract.service.configurator.line:0
+msgid "Products"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:356
+#, python-format
+msgid "Error"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:account.analytic.account:0
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:426
+#: view:contract.service.configurator:0
+#: field:contract.service.configurator.dependency.line,configurator_id:0
+#: view:contract.service.configurator.line:0
+#: field:contract.service.configurator.line,configurator_id:0
+#: model:ir.actions.act_window,name:contract_isp_package_configurator.action_contract_isp_package_configurator
+#, python-format
+msgid "Package Configurator"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,stock_move_id:0
+#: field:contract.service.configurator.line,stock_move_id:0
+msgid "Stock Move"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator,state:0
+#: field:contract.service.configurator.dependency.line,state:0
+#: field:contract.service.configurator.line,state:0
+msgid "State"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:45
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:151
+#: view:contract.service.configurator:0
+#: selection:contract.service.configurator,state:0
+#: selection:contract.service.configurator.dependency.line,state:0
+#: selection:contract.service.configurator.line,state:0
+#, python-format
+msgid "Done"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator:0
+msgid "Click on add to view the available components"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: code:addons/contract_isp_package_configurator/wizard/package_configurator.py:450
+#: view:contract.service.configurator:0
+#, python-format
+msgid "Cancel"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: field:contract.service.configurator.dependency.line,message:0
+#: field:contract.service.configurator.line,message:0
+msgid "Message"
+msgstr ""
+
+#. module: contract_isp_package_configurator
+#: view:contract.service.configurator.line:0
+msgid "We don't have this product in stock at the moment!"
+msgstr ""
+

=== 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-03 15:14:10 +0000
@@ -27,7 +27,6 @@
 class contract_service_configurator_line(orm.TransientModel):
     _name = 'contract.service.configurator.line'
 
-    #def _get_stock_production_lot_available(self, cr, uid, )
     _columns = {
         'name': fields.char('Name'),
         'product_id': fields.many2one('product.product', 'Product'),
@@ -42,7 +41,7 @@
         'state': fields.selection((('draft', _('Added')),
                                    ('message', _('Information')),
                                    ('serial', _('Select serial number')),
-                                   ('stock', ('No Stock')),
+                                   ('stock', _('No Stock')),
                                    ('done', _('Done'))), 'State'),
     }
 
@@ -51,37 +50,43 @@
     }
 
     def router(self, cr, uid, ids, data=None, context=None):
+        if isinstance(ids, list):
+            ids = ids[0]
+        pool_stock_move = self.pool.get('stock.move')
+        pool_model_data = self.pool.get('ir.model.data')
+
         stock_move_id = None
-        if isinstance(ids, list):
-            ids = ids[0]
         line = self.browse(cr, uid, ids, context=context)
         if line.state == 'message':
-            if line.product_id.type == 'product' and \
-                    line.product_id.qty_available > 0.0:
+            if line.product_id.type == 'product' \
+                    and line.product_id.qty_available > 0:
                 state = 'serial'
             else:
                 state = 'stock'
         elif line.state in ('serial', 'stock'):
-            stock_move_obj = self.pool.get('stock.move')
-            location_id = self.pool.get('ir.model.data').get_object_reference(
-                cr, uid, 'stock', 'stock_location_stock')[1]
-            location_dest_id = line.configurator_id.contract_id.partner_id.property_stock_customer.id
+            location_id = \
+                pool_model_data.get_object_reference(cr, uid, 'stock',
+                                                     'stock_location_stock')[1]
+            partner = line.configurator_id.contract_id.partner_id
+            product = line.product_id and line.product_id
+            product_uom = product and product.uom_id
+            location_dest_id = partner.property_stock_customer.id
             move = {
                 'name': line.product_id and line.product_id.name or '',
-                'product_id': line.product_id and line.product_id.id,
-                'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,
+                'product_id': product and product.id,
+                'product_uom': product_uom and product_uom.id or None,
                 'prodlot_id': line.serial and line.serial.id or None,
                 'location_id': location_id,
                 'location_dest_id': location_dest_id,
-                'partner_id': line.configurator_id.contract_id.partner_id.id,
+                'partner_id': partner.id,
                 'type': 'out'
             }
-            stock_move_id = stock_move_obj.create(
-                cr, uid, move, context=context)
-            stock_move_obj.action_confirm(
-                cr, uid, [stock_move_id], context=context)
-            stock_move_obj.action_done(
-                cr, uid, [stock_move_id], context=context)
+            stock_move_id = pool_stock_move.create(cr, uid, move,
+                                                   context=context)
+            pool_stock_move.action_confirm(cr, uid, [stock_move_id],
+                                           context=context)
+            pool_stock_move.action_done(cr, uid, [stock_move_id],
+                                        context=context)
 
             state = 'done'
 
@@ -93,37 +98,21 @@
         if isinstance(ids, int):
             ids = [ids]
 
-        for line in self.browse(cr, uid, ids, context=context):
-            if line.product_id.type == 'product' and line.stock_move_id:
-                stock_move_obj = self.pool.get('stock.move')
-                move = {
-                    'name': ' '.join([_('Cancel'), line.product_id and line.product_id.name or '']),
-                    'product_id': line.product_id and line.product_id.id,
-                    'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,
-                    'prodlot_id': line.serial and line.serial.id or None,
-                    'location_id': line.stock_move_id.location_dest_id.id,
-                    'location_dest_id': line.stock_move_id.location_id.id,
-                    'partner_id': line.configurator_id.contract_id.partner_id.id,
-                    'type': 'in'
-                }
-                stock_move_id = stock_move_obj.create(
-                    cr, uid, move, context=context)
-                stock_move_obj.action_confirm(
-                    cr, uid, [stock_move_id], context=context)
-                stock_move_obj.action_done(
-                    cr, uid, [stock_move_id], context=context)
+        cancel_dependancy(self, cr, uid, ids, context, cancel_line=False)
 
         return super(contract_service_configurator_line, self).unlink(
             cr, uid, ids, context=context)
 
     def onchange_product_id(self, cr, uid, ids, product_id, context):
         ret = {}
-        product_product_obj = self.pool.get('product.product')
+        pool_product_product = self.pool.get('product.product')
+        product_product_obj = pool_product_product.browse(cr, uid, product_id,
+                                                          context)
 
-        if product_product_obj.browse(cr, uid, product_id, context).description:
+        if product_product_obj.description:
             ret['warning'] = {
                 'title': _('Information'),
-                'message': product_product_obj.browse(cr, uid, product_id, context).description
+                'message': product_product_obj.description
             }
         return ret
 
@@ -136,29 +125,23 @@
 class contract_service_configurator(orm.TransientModel):
     _name = 'contract.service.configurator'
 
-    def _get_default_category(self, cr, uid, context=None):
+    def get_default_category(self, cr, uid, context=None):
         res_company_obj = self.pool.get("res.company")
         company_id = res_company_obj._company_default_get(cr, uid, context)
         res_company = res_company_obj.browse(cr, uid, company_id,
                                              context=context)
-        return res_company.default_product_category and \
-            res_company.default_product_category.id
+        cat = res_company.default_product_category
+        return cat and cat.id
 
-    def _get_is_level2(self, cr, uid, context=None):
+    def get_is_level2(self, cr, uid, context=None):
         ir_model_data_obj = self.pool.get('ir.model.data')
-        res_groups_obj = self.pool.get('res.groups')
         res_user = self.pool.get('res.users').browse(
             cr, uid, uid, context={})
         group_agent_n2_id = ir_model_data_obj.get_object_reference(
             cr, uid, 'contract_isp', 'group_isp_agent2')[1]
-        group_agent_n2 = res_groups_obj.browse(
-            cr, uid, group_agent_n2_id, context={})
 
         groups_id = [i.id for i in res_user.groups_id]
-        if group_agent_n2_id not in groups_id:
-            return False
-        else:
-            return True
+        return group_agent_n2_id in groups_id
 
     _columns = {
         'contract_id': fields.many2one('account.analytic.account', 'Contract'),
@@ -171,11 +154,12 @@
                                     'Line'),
         'current_product_id': fields.many2one('product.product',
                                               'Add Product'),
-        'dependency_ids': fields.many2many('contract.service.configurator.dependency.line',
-                                           'contract_service_configurator_dependency_rel',
-                                           'configurator_id',
-                                           'dependency_id',
-                                           'Dependencies'),
+        'dependency_ids': fields.many2many(
+            'contract.service.configurator.dependency.line',
+            'contract_service_configurator_dependency_rel',
+            'configurator_id',
+            'dependency_id',
+            'Dependencies'),
         'root_category_id': fields.many2one('product.category', 'Category'),
         'product_category_id': fields.many2one('product.category', 'Category'),
         'is_level2': fields.boolean('Is level 2')
@@ -183,16 +167,18 @@
 
     _defaults = {
         'state': 'draft',
-        'product_category_id': lambda s, cr, uid, ctx: s._get_default_category(cr, uid, ctx),
-        'root_category_id': lambda s, cr, uid, ctx: s._get_default_category(cr, uid, ctx),
-        'is_level2': lambda s, cr, uid, ctx: s._get_is_level2(cr, uid, ctx)
+        'product_category_id':
+            lambda s, cr, uid, ctx: s.get_default_category(cr, uid, ctx),
+        'root_category_id':
+            lambda s, cr, uid, ctx: s.get_default_category(cr, uid, ctx),
+        'is_level2': lambda s, cr, uid, ctx: s.get_is_level2(cr, uid, ctx)
     }
 
-    def onchange_product_category_id(self, cr, uid, ids,
-                                     product_category_id, is_level2):
+    @staticmethod
+    def onchange_product_category_id(cr, uid, ids, product_category_id,
+                                     is_level2):
         domain = [('categ_id', '=', product_category_id)]
-        ret = {
-            'domain': {'current_product_id': None}}
+        ret = {'domain': {'current_product_id': None}}
 
         if not is_level2:
             domain.append(('list_price', '>=', 0))
@@ -202,9 +188,10 @@
         return ret
 
     def do_next(self, cr, uid, ids, context=None):
-        contract_service_configurator_line_obj = self.pool.get('contract.service.configurator.line')
-        contract_service_configurator_dependency_line_obj = self.pool.get('contract.service.configurator.dependency.line')
-        product_product_obj = self.pool.get('product.product')
+        contract_service_configurator_line_obj = self.pool.get(
+            'contract.service.configurator.line')
+        pool_conf_dep_line = self.pool.get(
+            'contract.service.configurator.dependency.line')
 
         wizard = self.browse(cr, uid, ids[0], context=context)
 
@@ -221,117 +208,116 @@
                     'name': line.product_id.name,
                     'product_id': line.product_id.id,
                     'configurator_id': wizard.id,
-                    'handle_dependency': line.product_id.dependency_ids and True or False,
+                    'handle_dependency': line.product_id.dependency_ids,
                     'message': line.product_id.description,
                     'state': state
                 }
-                contract_service_configurator_line_obj.create(cr, uid, l, context=context)
+                contract_service_configurator_line_obj.create(cr, uid, l,
+                                                              context=context)
 
         query = [('configurator_id', '=', wizard.id)]
-        ids_to_unlink = contract_service_configurator_dependency_line_obj.search(cr,
-                                                                                 uid,
-                                                                                 query,
-                                                                                 context=context)
+        ids_to_unlink = pool_conf_dep_line.search(
+            cr,
+            uid,
+            query,
+            context=context)
         if ids_to_unlink:
-            contract_service_configurator_dependency_line_obj.unlink(cr, uid,
-                                                                     ids_to_unlink,
-                                                                     context)
+            pool_conf_dep_line.unlink(cr, uid, ids_to_unlink, context)
 
         loop_deps = False
         for line in wizard.line_ids:
-            if line.handle_dependency:
-                loop_deps = True
-                for dep in line.product_id.dependency_ids:
-                    if dep.type == 'product':
-                        if not wizard.is_level2 and dep.list_price < 0:
-                            continue
-
-                        if line.product_id.description:
-                            state = 'message'
-                        elif line.product_id.type == 'product':
-                            state = 'serial'
-                        else:
-                            state = 'done'
-
-                        wl = {
-                            'name': dep.product_id.name,
-                            'product_id': dep.product_id.id,
-                            'configurator_id': wizard.id,
-                            'parent_id': line.id,
-                            'message': line.product_id.description,
-                            'state': state
-                        }
-                        new_dep = contract_service_configurator_dependency_line_obj.create(
-                            cr, uid, wl, context=context)
-
-                        if dep.auto:
-                            wizard.write({'dependency_ids': [(4, new_dep)]})
-
-                    elif dep.type == 'category':
-                        query = [('categ_id', '=', dep.category_id.id)]
-                        product_ids = product_product_obj.search(cr, uid,
-                                                                 query,
-                                                                 context=context)
-                        for product in product_product_obj.browse(cr, uid, product_ids, context=context):
-                            if not wizard.is_level2 and dep.list_price < 0:
-                                continue
-
-                            if line.product_id.description:
-                                state = 'message'
-                            elif line.product_id.type == 'product':
-                                state = 'serial'
-                            else:
-                                state = 'done'
-
-                            wl = {
-                                'name': product.name,
-                                'product_id': product.id,
-                                'configurator_id': wizard.id,
-                                'parent_id': line.id,
-                                'message': product.description,
-                                'state': state
-                            }
-                            contract_service_configurator_dependency_line_obj.create(cr, uid, wl,
-                                                                                     context=context)
-                line.write({'handle_dependency': False})
-                break
+            if not line.handle_dependency:
+                continue
+
+            loop_deps = True
+            self._write_dependance(line, wizard, cr, uid, context)
+            line.write({'handle_dependency': False})
+            break
 
         if loop_deps:
             record = {
                 'state': 'dependency',
             }
-            wizard.write(record)
-            return self.router(cr, uid, ids, {}, context=context)
-
         else:
             record = {
                 'state': 'product',
                 'current_product_id': None,
-                'dependency_ids': [(5)],
+                'dependency_ids': [5],
             }
-            wizard.write(record)
-
-            query = [('configurator_id', '=', wizard.id)]
-            ids_to_unlink = contract_service_configurator_dependency_line_obj.search(cr,
-                                                                                     uid,
-                                                                                     query,
-                                                                                     context=context)
-            return self.router(cr, uid, ids, {}, context=context)
+        wizard.write(record)
+        return self.router(cr, uid, ids, {}, context=context)
+
+    def _write_dependance(self, line, wizard, cr, uid, context):
+        pool_conf_dep_line = self.pool.get(
+            'contract.service.configurator.dependency.line')
+        product_product_obj = self.pool.get('product.product')
+
+        contains_dep = False
+        for dep in line.product_id.dependency_ids:
+            if dep.type == 'product':
+                if not wizard.is_level2 and dep.list_price < 0:
+                    continue
+
+                if line.product_id.description:
+                    state = 'message'
+                elif line.product_id.type == 'product':
+                    state = 'serial'
+                else:
+                    state = 'done'
+                contains_dep = True
+                wl = {
+                    'name': dep.product_id.name,
+                    'product_id': dep.product_id.id,
+                    'configurator_id': wizard.id,
+                    'parent_id': line.id,
+                    'message': line.product_id.description,
+                    'state': state
+                }
+                new_dep = pool_conf_dep_line.create(cr, uid, wl,
+                                                    context=context)
+
+                if dep.auto:
+                    wizard.write({'dependency_ids': [(4, new_dep)]})
+
+            elif dep.type == 'category':
+                query = [('categ_id', '=', dep.category_id.id)]
+                product_ids = product_product_obj.search(cr, uid,
+                                                         query,
+                                                         context=context)
+                for product in product_product_obj.browse(cr, uid,
+                                                          product_ids,
+                                                          context=context):
+                    if not wizard.is_level2 and dep.list_price < 0:
+                        continue
+
+                    if line.product_id.description:
+                        state = 'message'
+                    elif line.product_id.type == 'product':
+                        state = 'serial'
+                    else:
+                        state = 'done'
+                    contains_dep = True
+                    wl = {
+                        'name': product.name,
+                        'product_id': product.id,
+                        'configurator_id': wizard.id,
+                        'parent_id': line.id,
+                        'message': product.description,
+                        'state': state
+                    }
+                    pool_conf_dep_line.create(
+                        cr, uid, wl,
+                        context=context)
+        return contains_dep
 
     def do_add_current_product_id(self, cr, uid, ids, context=None):
         if context is None:
             context = {}
-        deps = 0
         wizard = self.browse(cr, uid, ids[0], context=context)
-        contract_service_configurator_line_obj = self.pool.get(
-            'contract.service.configurator.line')
-        contract_service_configurator_dependency_line_obj = self.pool.get(
-            'contract.service.configurator.dependency.line')
-        product_product_obj = self.pool.get('product.product')
-        contract_service_serial_obj = self.pool.get('contract.service.serial')
+        pool_cs_conf_line = self.pool.get('contract.service.configurator.line')
 
         if wizard.current_product_id:
-            #if group_agent_n2_id not in res_user.groups_id and \
+            # if group_agent_n2_id not in res_user.groups_id and \
             #        wizard.current_product_id.type == 'product' and \
             #        wizard.current_product_id.qty_available <= 0:
             #    raise orm.except_orm(_('Error!'), _('Product not available!'))
@@ -350,72 +336,19 @@
                 'message': wizard.current_product_id.description,
                 'state': state
             }
-            new_line = contract_service_configurator_line_obj.create(
-                cr, uid, record, context=context)
-
-            for dep in contract_service_configurator_line_obj.browse(
-                    cr, uid, new_line,
-                    context=context).product_id.dependency_ids:
-
-                if dep.type == 'product':
-                    if not wizard.is_level2 and dep.product_id.list_price < 0:
-                        continue
-
-                    if dep.product_id.description:
-                        state = 'message'
-                    elif dep.product_id.type == 'product':
-                        state = 'serial'
-                    else:
-                        state = 'done'
-
-                    deps += 1
-                    wl = {
-                        'name': dep.product_id.name,
-                        'product_id': dep.product_id.id,
-                        'configurator_id': wizard.id,
-                        'parent_id': new_line,
-                        'message': dep.product_id.description,
-                        'state': state
-                    }
-                    new_dep = contract_service_configurator_dependency_line_obj.create(cr, uid, wl,
-                                                                                       context=context)
-
-                    if dep.auto:
-                        wizard.write({'dependency_ids': [(4, new_dep)]})
-
-                elif dep.type == 'category':
-                    query = [('categ_id', '=', dep.category_id.id)]
-                    product_ids = product_product_obj.search(cr, uid, query,
-                                                             context=context)
-                    for product in product_product_obj.browse(cr, uid,
-                                                              product_ids,
-                                                              context=context):
-                        if not wizard.is_level2 and dep.product_id.list_price < 0:
-                            continue
-
-                        if product.description:
-                            state = 'message'
-                        elif product.type == 'product':
-                            state = 'serial'
-                        else:
-                            state = 'done'
-
-                        deps += 1
-                        record = {
-                            'name': product.name,
-                            'product_id': product.id,
-                            'configurator_id': wizard.id,
-                            'parent_id': new_line,
-                            'message': product.description,
-                            'state': state
-                        }
-                        contract_service_configurator_dependency_line_obj.create(
-                            cr, uid, record, context=context)
+            new_line = pool_cs_conf_line.create(cr, uid, record,
+                                                context=context)
+
+            product_obj = pool_cs_conf_line.browse(cr, uid, new_line,
+                                                   context=context)
+            contains_dep = self._write_dependance(product_obj, wizard, cr, uid,
+                                                  context)
 
             record = {
                 'current_product_id': None,
-                'product_category_id': self._get_default_category(cr, uid, context),
-                'state': deps and 'dependency' or 'product'
+                'product_category_id': self.get_default_category(cr, uid,
+                                                                 context),
+                'state': contains_dep and 'dependency' or 'product'
             }
 
             wizard.write(record)
@@ -424,11 +357,7 @@
         raise orm.except_orm(_('Error'), _('Product not found!'))
 
     def do_done(self, cr, uid, ids, context=None):
-        account_analytic_account_obj = self.pool.get('account.analytic.account')
-        contract_service_obj = self.pool.get('contract.service')
-        stock_move_obj = self.pool.get('stock.move')
-        contract_service_serial_obj = self.pool.get('contract.service.serial')
-        ret = self.write(cr, uid, ids, {'state': 'done'}, context=context)
+        pool_contract_service = self.pool.get('contract.service')
         wizard = self.browse(cr, uid, ids[0], context=context)
         for line in wizard.line_ids:
             l = {
@@ -439,7 +368,7 @@
                 'analytic_line_type': line.product_id.analytic_line_type,
                 'require_activation': line.product_id.require_activation
             }
-            contract_service_obj.create(cr, uid, l, context=context)
+            pool_contract_service.create(cr, uid, l, context=context)
 
             if line.product_id.type == 'product' and line.stock_move_id:
                 line.write({'stock_move_id': None})
@@ -458,44 +387,26 @@
         if isinstance(ids, int):
             ids = [ids]
 
-        for line in self.browse(cr, uid, ids[0], context=context).line_ids:
-            if line.product_id.type == 'product' and line.stock_move_id:
-                stock_move_obj = self.pool.get('stock.move')
-                move = {
-                    'name': ' '.join([_('Cancel'), line.product_id and line.product_id.name or '']),
-                    'product_id': line.product_id and line.product_id.id,
-                    'product_uom': line.product_id and line.product_id.uom_id and line.product_id.uom_id.id or None,
-                    'prodlot_id': line.serial and line.serial.id or None,
-                    'location_id': line.stock_move_id.location_dest_id.id,
-                    'location_dest_id': line.stock_move_id.location_id.id,
-                    'partner_id': line.configurator_id.contract_id.partner_id.id,
-                    'type': 'in'
-                }
-                stock_move_id = stock_move_obj.create(
-                    cr, uid, move, context=context)
-                stock_move_obj.action_confirm(
-                    cr, uid, [stock_move_id], context=context)
-                stock_move_obj.action_done(
-                    cr, uid, [stock_move_id], context=context)
+        cancel_dependancy(self, cr, uid, ids, context, cancel_line=True)
 
         return True
 
     def router(self, cr, uid, ids, data=None, context=None):
+        pool_stock_prod_lot = self.pool.get('stock.production.lot')
         if isinstance(ids, list):
             ids = ids[0]
         wizard = self.browse(cr, uid, ids, context=context)
         for line in wizard.line_ids:
             if line.state in ('message', 'serial', 'stock'):
                 if line.state == 'serial':
-                    stock_production_lot_obj = self.pool.get('stock.production.lot')
-                    product_product_obj = self.pool.get('product.product')
 
                     query = [
                         ('product_id', '=', line.product_id.id),
                         ('stock_available', '>', 0)
                     ]
 
-                    serial_ids = stock_production_lot_obj.search(cr, uid, query, context=context)
+                    serial_ids = pool_stock_prod_lot.search(cr, uid, query,
+                                                            context=context)
 
                     if not serial_ids:
                         line.write({'state': 'stock'})
@@ -523,3 +434,36 @@
             'nodestroy': True,
             'context': context
         }
+
+
+def cancel_dependancy(obj_orm, cr, uid, ids, context, cancel_line=True):
+    pool_stock_move = obj_orm.pool.get('stock.move')
+    if cancel_line:
+        lines = obj_orm.browse(cr, uid, ids[0], context=context).line_ids
+    else:
+        lines = obj_orm.browse(cr, uid, ids, context=context)
+
+    for line in lines:
+        if line.product_id.type == 'product' and line.stock_move_id:
+            product = line.product_id and line.product_id
+            product_name = product.name or ''
+            product_uom = product.uom_id and line.product_id.uom_id
+            name = "%s %s" % (_('Cancel'), product_name)
+
+            partner = line.configurator_id.contract_id.partner_id.id
+            move = {
+                'name': name,
+                'product_id': product.id,
+                'product_uom': product_uom,
+                'prodlot_id': line.serial and line.serial.id or None,
+                'location_id': line.stock_move_id.location_dest_id.id,
+                'location_dest_id': line.stock_move_id.location_id.id,
+                'partner_id': partner,
+                'type': 'in'
+            }
+            stock_move_id = pool_stock_move.create(cr, uid, move,
+                                                   context=context)
+            pool_stock_move.action_confirm(cr, uid, [stock_move_id],
+                                           context=context)
+            pool_stock_move.action_done(cr, uid, [stock_move_id],
+                                        context=context)
\ No newline at end of file