[IMP] maintenance: new method to get the contract status when a bug occure
authorChristophe Simonis <christophe@cobalt>
Wed, 31 Dec 2008 13:33:03 +0000 (14:33 +0100)
committerChristophe Simonis <christophe@cobalt>
Wed, 31 Dec 2008 13:33:03 +0000 (14:33 +0100)
[IMP] maintenance: new method to post the error details to openerp.com

bzr revid: christophe@cobalt-20081231133303-q0dgibftxdtvxgc0

bin/addons/base/maintenance/maintenance.py

index 0eae427..70d8724 100644 (file)
@@ -34,7 +34,7 @@ import time
 import math
 from pprint import pprint as pp
 
-from tools import config
+from tools import config, debug
 import xmlrpclib
 
 class maintenance_contract_module(osv.osv):
@@ -51,6 +51,49 @@ class maintenance_contract(osv.osv):
     _name = "maintenance.contract"
     _description = "Maintenance Contract"
 
+    def _get_valid_contracts(self, cr, uid):
+        return [contract for contract in self.browse(cr, uid, self.search(cr, uid, [])) if contract.state == 'valid']
+
+    def status(self, cr, uid):
+        covered_modules, uncovered_modules = set(), set()
+
+        status = 'none'
+        for contract in self._get_valid_contracts(cr, uid):
+            covered_modules.update([m.name for m in contract.module_ids])
+        
+        if covered_modules:
+            modobj = self.pool.get('ir.module.module')
+            modids = modobj.search(cr, uid, [('state', '=', 'installed')])
+            uncovered_modules = set(m.name for m in modobj.browse(cr, uid, modids)) - covered_modules
+            status = ['full', 'partial'][len(uncovered_modules) > 0]
+        
+        return {
+            'status': status,
+            'uncovered_modules': list(uncovered_modules),
+        }
+    
+    def send(self, cr, uid, tb, explanations, remarks=None):
+        assert self.status(cr, uid) == 'full'
+        contract = self._get_valid_contracts(cr, uid)[0]
+        
+        content = "(%s) has reported the following bug:\n%s\nremarks: %s\nThe traceback is:\n%s" % (
+            contract.name, explanations, remarks or '', tb
+        )
+        try:
+            import urllib
+            args = [('contract_id', contract.name),('data', content)]
+            args = urllib.urlencode(args)
+            fp = urllib.urlopen('http://www.openerp.com/scripts/survey.php', args)
+            submit_result = fp.read()
+            debug(submit_result)
+            fp.close()
+        except:
+            # TODO schedule a retry
+            return False
+        return True
+        
+
     def _valid_get(self, cr, uid, ids, field_name, arg, context=None):
         res = {}
         for contract in self.browse(cr, uid, ids, context=context):