[FIX] Dependancies loop executes when you install a new module
authorado <ado@tinyerp.com>
Mon, 16 Jan 2012 13:15:28 +0000 (18:45 +0530)
committerado <ado@tinyerp.com>
Mon, 16 Jan 2012 13:15:28 +0000 (18:45 +0530)
bzr revid: ado@tinyerp.com-20120116131528-q2ighcffep0gjvk9

bin/addons/base/module/module.py

index 2e27643..3c38421 100644 (file)
@@ -261,21 +261,23 @@ class module(osv.osv):
                 msg = _('Unable to process module "%s" because an external dependency is not met: %s')
             raise orm.except_orm(_('Error'), msg % (module_name, e.args[0]))
 
-    def state_update(self, cr, uid, ids, newstate, states_to_update, context=None, level=100):
+    def state_update(self, cr, uid, ids, newstate, states_to_update, context=None, level=100, res=[]):
         if level<1:
             raise orm.except_orm(_('Error'), _('Recursion error in modules dependencies !'))
         demo = False
         for module in self.browse(cr, uid, ids):
             mdemo = False
             for dep in module.dependencies_id:
-                if dep.state == 'unknown':
-                    raise orm.except_orm(_('Error'), _("You try to install module '%s' that depends on module '%s'.\nBut the latter module is not available in your system.") % (module.name, dep.name,))
-                ids2 = self.search(cr, uid, [('name','=',dep.name)])
-                if dep.state != newstate:
-                    mdemo = self.state_update(cr, uid, ids2, newstate, states_to_update, context, level-1,) or mdemo
-                else:
-                    od = self.browse(cr, uid, ids2)[0]
-                    mdemo = od.demo or mdemo
+                if dep.name not in res:
+                    res.append(dep.name)
+                    if dep.state == 'unknown':
+                        raise orm.except_orm(_('Error'), _("You try to install module '%s' that depends on module '%s'.\nBut the latter module is not available in your system.") % (module.name, dep.name,))
+                    ids2 = self.search(cr, uid, [('name','=',dep.name)])
+                    if dep.state != newstate:
+                        mdemo = self.state_update(cr, uid, ids2, newstate, states_to_update, context, level-1, res=res) or mdemo
+                    else:
+                        od = self.browse(cr, uid, ids2)[0]
+                        mdemo = od.demo or mdemo
 
             self.check_external_dependencies(module.name, newstate)
             if not module.dependencies_id:
@@ -286,7 +288,8 @@ class module(osv.osv):
         return demo
 
     def button_install(self, cr, uid, ids, context=None):
-        return self.state_update(cr, uid, ids, 'to install', ['uninstalled'], context)
+        res = []
+        return self.state_update(cr, uid, ids, 'to install', ['uninstalled'], context, res=res)
 
     def button_install_cancel(self, cr, uid, ids, context=None):
         self.write(cr, uid, ids, {'state': 'uninstalled', 'demo':False})