[IMP] wip

bzr revid: nicolas.vanhoren@openerp.com-20101117171754-ay58hnzhsq56iq3s
This commit is contained in:
nvi-openerp 2010-11-17 18:17:54 +01:00
parent 91c0e7621c
commit b8551a5fcc
7 changed files with 107 additions and 137 deletions

View File

@ -34,6 +34,7 @@ import ir_exports
import workflow
import ir_rule
import wizard
import ir_config_parameter
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -20,6 +20,7 @@
##############################################################################
import maintenance
import dbuuid
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -20,60 +20,30 @@
##############################################################################
from osv import osv, fields
import pooler
import time
import netsvc
from tools.misc import debug
from tools.misc import ustr
from tools.translate import _
import tools.maintenance as tm
class maintenance_contract_module(osv.osv):
_name ="maintenance.contract.module"
_description = "maintenance contract modules"
_columns = {
'name' : fields.char('Name', size=128, required=True),
'version': fields.char('Version', size=64,),
}
maintenance_contract_module()
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]
contracts = self._get_valid_contracts(cr, uid)
return {
'status': status,
'uncovered_modules': list(uncovered_modules),
'status': "full" if contracts else "none" ,
'uncovered_modules': list(),
}
def send(self, cr, uid, tb, explanations, remarks=None):
status = self.status(cr, uid)
if status['status'] != 'full':
raise osv.except_osv(_('Error'), _("Your can't submit bug reports due to uncovered modules: %s") % (', '.join(status['uncovered_modules']),))
dbmsg = _('This error occurs on database %s') % (cr.dbname,)
if not remarks:
remarks = dbmsg
else:
remarks += '\n\n-----\n' + dbmsg
remarks = ""
valid_contracts = self._get_valid_contracts(cr, uid)
@ -81,8 +51,10 @@ class maintenance_contract(osv.osv):
rc = None
try:
for contract in valid_contracts:
rc = tm.remote_contract(contract.name, contract.password)
rc = tm.remote_contract(cr, uid, contract.name)
if rc.id:
contract_name = contract.name
break
rc = None
@ -90,34 +62,25 @@ class maintenance_contract(osv.osv):
raise osv.except_osv(_('Error'), _('Unable to find a valid contract'))
origin = 'client'
crm_case_id = rc.submit(rc.id, tb, explanations, remarks or '', origin)
dbuuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
crm_case_id = rc.submit({
'contract_name': contract_name,
'tb': tb,
'explanations': explanations,
'remarks': remarks,
'origin': origin,
'dbname': cr.dbname,
'dbuuid': dbuuid})
except tm.RemoteContractException, rce:
netsvc.Logger().notifyChannel('maintenance', netsvc.LOG_INFO, rce)
except osv.except_osv:
raise
except:
pass
pass # don't want to throw exceptions in exception handler
cid = rc and rc.name or valid_contracts[0].name
try:
# as backup, put it also in another database...
import urllib
args = urllib.urlencode({
'contract_id': cid,
'crm_case_id': crm_case_id or 0,
'explanation': explanations,
'remark': remarks or '',
'tb': tb,
})
uo = urllib.urlopen('http://www.openerp.com/scripts/maintenance.php', args)
submit_result = uo.read()
debug(submit_result)
uo.close()
except:
if not crm_case_id:
# TODO schedule a retry (ir.cron)
return False
if not crm_case_id:
return False
return True
def _valid_get(self, cr, uid, ids, field_name, arg, context=None):
@ -127,16 +90,11 @@ class maintenance_contract(osv.osv):
return res
_columns = {
'name' : fields.char('Contract ID', size=256, required=True, readonly=True),
'password' : fields.char('Password', size=64, invisible=True, required=True, readonly=True),
'name' : fields.char('Contract ID', size=384, required=True, readonly=True),
'date_start' : fields.date('Starting Date', readonly=True),
'date_stop' : fields.date('Ending Date', readonly=True),
'module_ids' : fields.many2many('maintenance.contract.module', 'maintenance_contract_module_rel', 'contract_id', 'module_id', 'Covered Modules', readonly=True),
'state' : fields.function(_valid_get, method=True, string="State", type="selection", selection=[('valid', 'Valid'),('unvalid', 'Unvalid')], readonly=True),
'kind' : fields.selection([('full', 'Full'),('partial', 'Partial')], 'Kind', required=True, readonly=True),
}
_defaults = {
'password' : lambda obj,cr,uid,context={} : '',
'kind' : fields.char('Kind', size=64, required=True, readonly=True),
}
_sql_constraints = [
('uniq_name', 'unique(name)', "Your maintenance contract is already subscribed in the system !")
@ -149,8 +107,7 @@ class maintenance_contract_wizard(osv.osv_memory):
_name = 'maintenance.contract.wizard'
_columns = {
'name' : fields.char('Contract ID', size=256, required=True ),
'password' : fields.char('Password', size=64, required=True),
'name' : fields.char('Contract ID', size=384, required=True ),
'state' : fields.selection([('draft', 'Draft'),('validated', 'Validated'),('unvalidated', 'Unvalidated')], 'States'),
}
@ -159,46 +116,31 @@ class maintenance_contract_wizard(osv.osv_memory):
}
def action_validate(self, cr, uid, ids, context=None):
raise Exception("hahaha, this is a dirty exception to make you fail")
if not ids:
return False
module_proxy = self.pool.get('ir.module.module')
module_ids = module_proxy.search(cr, uid, [('state', '=', 'installed')])
modules = module_proxy.read(cr, uid, module_ids, ['name', 'installed_version'])
contract = self.read(cr, uid, ids, ['name', 'password'])[0]
contract = self.read(cr, uid, ids, ['name'])[0]
try:
contract_info = tm.remote_contract(contract['name'], contract['password'], modules)
contract_info = tm.remote_contract(cr, uid, contract['name'])
except tm.RemoteContractException, rce:
raise osv.except_osv(_('Error'), ustr(rce))
is_ok = contract_info['status'] in ('partial', 'full')
if is_ok:
module_ids = []
if contract_info['modules_with_contract']:
for name, version in contract_info['modules_with_contract']:
contract_module = self.pool.get('maintenance.contract.module')
res = contract_module.search(cr, uid, [('name', '=', name),('version', '=', version)])
if not res:
id = contract_module.create(cr, uid, { 'name' : name, 'version' : version } )
else:
id = res[0]
module_ids.append(id)
if contract_info['status'] == "valid":
self.pool.get('maintenance.contract').create(
cr,
uid, {
'name' : contract['name'],
'password' : contract['password'],
'date_start' : contract_info['date_from'],
'date_stop' : contract_info['date_to'],
'kind' : contract_info['status'],
'module_ids' : [(6,0,module_ids)],
'kind' : contract_info['kind'],
}
)
return self.write(cr, uid, ids, {'state' : ('unvalidated', 'validated')[is_ok] }, context=context)
return self.write(cr, uid, ids,
{'state' : ['validated' if contract_info['status'] == "valid" else 'unvalidated'] },
context=context)
maintenance_contract_wizard()

View File

@ -27,13 +27,6 @@
<field name="date_start"/>
<field name="date_stop"/>
</group>
<separator string="Covered Modules" colspan="4"/>
<field name="module_ids" nolabel="1" colspan="4">
<tree string="Covered Modules">
<field name="name" />
<field name="version" />
</tree>
</field>
<field name="state" colspan="4"/>
</form>
</field>
@ -94,7 +87,6 @@
<group states="draft">
<field name="name" width="250" />
<newline />
<field name="password" password="True" />
<field name="state" invisible="1" />
</group>
<group states="validated">

View File

@ -113,7 +113,6 @@
"access_res_bank_group_partner_manager","res_bank_group_partner_manager","model_res_bank","group_partner_manager",1,1,1,1
"access_res_bank_user","res_bank user","model_res_bank","group_user",1,0,0,0
"access_maintenance_group_user","maintenance_contract group_user","model_maintenance_contract","group_system",1,1,1,1
"access_maintenance_contract_module","maintenance.contract.module","model_maintenance_contract_module","group_system",1,1,1,1
"access_multi_company_default user","multi_company_default all","model_multi_company_default",,1,0,0,0
"access_multi_company_default manager","multi_company_default Manager","model_multi_company_default","group_erp_manager",1,1,1,1
"access_ir_filter all","ir_filters all","model_ir_filters",,1,0,0,0
@ -123,3 +122,4 @@
"access_res_widget","res.widget","model_res_widget","group_erp_manager",1,1,1,1
"access_res_widget_user","res.widget.user","model_res_widget",,1,0,0,0
"access_res_log_all","res.log","model_res_log",,1,1,1,1
"access_ir_config_parameter","ir_config_parameter","model_ir_config_parameter",,1,0,0,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
113 access_res_bank_group_partner_manager res_bank_group_partner_manager model_res_bank group_partner_manager 1 1 1 1
114 access_res_bank_user res_bank user model_res_bank group_user 1 0 0 0
115 access_maintenance_group_user maintenance_contract group_user model_maintenance_contract group_system 1 1 1 1
access_maintenance_contract_module maintenance.contract.module model_maintenance_contract_module group_system 1 1 1 1
116 access_multi_company_default user multi_company_default all model_multi_company_default 1 0 0 0
117 access_multi_company_default manager multi_company_default Manager model_multi_company_default group_erp_manager 1 1 1 1
118 access_ir_filter all ir_filters all model_ir_filters 1 0 0 0
122 access_res_widget res.widget model_res_widget group_erp_manager 1 1 1 1
123 access_res_widget_user res.widget.user model_res_widget 1 0 0 0
124 access_res_log_all res.log model_res_log 1 1 1 1
125 access_ir_config_parameter ir_config_parameter model_ir_config_parameter 1 0 0 0

View File

@ -31,8 +31,8 @@ def check_ssl():
try:
from OpenSSL import SSL
import socket
return hasattr(socket, 'ssl')
return hasattr(socket, 'ssl') and hasattr(SSL, "Connection")
except:
return False
@ -91,6 +91,10 @@ class configmanager(object):
'static_http_url_prefix': None,
'secure_cert_file': 'server.cert',
'secure_pkey_file': 'server.pkey',
'maintenance_server': 'http://tiny.my.odoo.com:8069/xmlrpc/',
'maintenance_db': 'tiny_belgium',
'maintenance_login': 'maintenance',
'maintenance_password': 'maintenance',
}
self.misc = {}
@ -224,7 +228,7 @@ class configmanager(object):
parser.add_option_group(security)
def parse_config(self):
(opt, args) = self.parser.parse_args()
opt = self.parser.parse_args()[0]
def die(cond, msg):
if cond:
@ -317,7 +321,7 @@ class configmanager(object):
# If an explicit TZ was provided in the config, make sure it is known
try:
import pytz
tz = pytz.timezone(self.options['timezone'])
pytz.timezone(self.options['timezone'])
except pytz.UnknownTimeZoneError:
die(True, "The specified timezone (%s) is invalid" % self.options['timezone'])
except:
@ -374,7 +378,10 @@ class configmanager(object):
fp.close()
if is_win32:
import _winreg
try:
import _winreg
except ImportError:
_winreg = None
x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
y = _winreg.OpenKey(x, r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", 0,_winreg.KEY_ALL_ACCESS)
_winreg.SetValueEx(y,"PGPASSFILE", 0, _winreg.REG_EXPAND_SZ, filename )
@ -436,7 +443,7 @@ class configmanager(object):
p = ConfigParser.ConfigParser()
loglevelnames = dict(zip(self._LOGLEVELS.values(), self._LOGLEVELS.keys()))
p.add_section('options')
for opt in self.options.keys():
for opt in sorted(self.options.keys()):
if opt in ('version', 'language', 'translate_out', 'translate_in', 'init', 'update'):
continue
if opt in ('log_level', 'assert_exit_level'):
@ -444,8 +451,8 @@ class configmanager(object):
else:
p.set('options', opt, self.options[opt])
for sec in self.misc.keys():
for opt in self.misc[sec].keys():
for sec in sorted(self.misc.keys()):
for opt in sorted(self.misc[sec].keys()):
p.set(sec,opt,self.misc[sec][opt])
# try to create the directories and write the file

View File

@ -20,50 +20,77 @@
##############################################################################
import xmlrpclib
import config
import logging
import pooler
class RemoteContractException(Exception): pass
_logger = logging.getLogger(__name__)
class remote_contract(object):
def __init__(self, contract_id, contract_password, modules=None):
self.__server = 'http://tiny.my.odoo.com:8069/xmlrpc/'
self.__db = "tiny_belgium"
self.__password = "maintenance"
self.__login = "maintenance"
class RemoteConnectionException(Exception):
pass
class RemoteConnection:
def __init__(self, server, db, login, password):
self._server = server.strip()
if not self._server.endswith("/"):
self._server += "/"
self._db = db
self._login = login
self._password = password
rpc = xmlrpclib.ServerProxy(self.__server + 'common')
rpc = xmlrpclib.ServerProxy(self._server + "xmlrpc/common")
try:
self.__userid = rpc.login(self.__db, self.__login, self.__password)
self._userid = rpc.login(self._db, self._login, self._password)
except:
raise RemoteContractException("Unable to contact the migration server")
raise RemoteConnectionException("Unable to contact the remote server")
if not self.__userid:
raise RemoteContractException("Unable to contact the migration server")
self.__rpc = xmlrpclib.ServerProxy(self.__server + 'object')
if not self._userid:
raise RemoteConnectionException("Unable to contact the remote server")
contract = {
'name': contract_id,
'password': contract_password,
}
if modules is None:
modules = []
info = self.check_contract(modules, contract)
for n in info:
setattr(self, n, info[n])
self.name = contract_id
self.contract_id = self.name
self.password = contract_password
self._rpc = xmlrpclib.ServerProxy(self._server + "xmlrpc/object")
def get_remote_object(self, object):
return RemoteObject(self, object)
class RemoteObject(object):
def __init__(self, connection, object):
self._c = connection
self._object = object
def __getattr__(self, fun):
def remote_call(*args, **kwargs):
return self.__rpc.execute(self.__db, self.__userid, self.__password, 'maintenance.maintenance', fun, *args, **kwargs)
return self._c._rpc.execute(self._c._db, self._c._userid,
self._c._password, self._object, fun, *args, **kwargs)
return remote_call
def __getitem__(self, item):
return getattr(self, item)
class RemoteContractException(Exception): pass
def remote_contract(cr, uid, contract_id):
pool = pooler.get_pool(cr.dbname)
dbuuid = pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
try:
ro = RemoteConnection(config.config.get("maintenance_server"), config.config.get("maintenance_db"),
config.config.get("maintenance_login"), config.config.get("maintenance_password")
).get_remote_object('maintenance.maintenance')
except:
_logger.exception("Exception")
raise RemoteContractException("Unable to contact the migration server")
info = ro.check_contract({
"contract_name": contract_id,
"dbuuid": dbuuid,
"dbname": cr.dbname})
for n in info:
setattr(ro, n, info[n])
return ro
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: