diff --git a/bin/addons/base/maintenance/maintenance.py b/bin/addons/base/maintenance/maintenance.py index 0eae4277f1c..70d872495b4 100644 --- a/bin/addons/base/maintenance/maintenance.py +++ b/bin/addons/base/maintenance/maintenance.py @@ -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):