# -*- encoding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved # $Id$ # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ############################################################################## import xmlrpclib import ConfigParser import optparse import sys import thread import threading import os import time import pickle import base64 admin_passwd = 'admin' def start_server(root_path, port, addons_path): if root_path: root_path += '/' os.system('python '+root_path+'openerp-server.py --pidfile=openerp.pid --port=%s --no-netrpc --addons-path=%s' %(str(port),addons_path)) def clean(): if os.path.isfile('openerp.pid'): ps = open('openerp.pid') if ps: pid = int(ps.read()) ps.close() if pid: os.kill(pid,9) def login(uri, dbname, user, pwd): conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/common') uid = conn.login(dbname, user, pwd) return uid def import_translate(uri, user, pwd, dbname, translate_in): uid = login(uri, dbname, user, pwd) if uid: conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/wizard') wiz_id = conn.create(dbname, uid, pwd, 'module.lang.import') for trans_in in translate_in: lang,ext = os.path.splitext(trans_in.split('/')[-1]) state = 'init' datas = {'form':{}} while state!='end': res = conn.execute(dbname, uid, pwd, wiz_id, datas, state, {}) if 'datas' in res: datas['form'].update( res['datas'].get('form',{}) ) if res['type']=='form': for field in res['fields'].keys(): datas['form'][field] = res['fields'][field].get('value', False) state = res['state'][-1][0] trans_obj = open(trans_in) datas['form'].update({ 'name': lang, 'code': lang, 'data' : base64.encodestring(trans_obj.read()) }) trans_obj.close() elif res['type']=='action': state = res['state'] def check_quality(uri, user, pwd, dbname, modules): uid = login(uri, dbname, user, pwd) if uid: conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/object') qualityresult = {} final = {} test_detail = {} for module in modules: quality_result = conn.execute(dbname, uid, pwd,'module.quality.check','check_quality',module) detail_html = '' html = '''''' html +="

Module : %s

"%(quality_result['name']) html += "

Final score : %s

"%(quality_result['final_score']) html += "" for x,y,detail in quality_result['check_detail_ids']: if detail.get('detail') != '': test = detail.get('name') score = round(float(detail.get('score',0)),2) html += "
  • %s (%.2f)
  • "%(test,test,score) detail_html +="

    %s (Score : %s)

    %s
    "%(test,test,score,detail.get('detail')) detail_html +='''Go to Top''' test_detail[test] = (score,detail.get('detail','')) html += "
    %s"%(detail_html) final[quality_result['name']] = (quality_result['final_score'],html,test_detail) fp = open('quality_log.pck','wb') pck_obj = pickle.dump(final,fp) fp.close() print "LOG PATH%s"%(os.path.realpath('quality_log.pck')) return final else: print 'Login Failed...' clean() sys.exit(1) def wait(id,url=''): progress=0.0 sock2 = xmlrpclib.ServerProxy(url+'/db') while not progress==1.0: progress,users = sock2.get_progress(admin_passwd, id) return True def create_db(uri, dbname, user='admin', pwd='admin', lang='en_US'): conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/db') obj_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/object') wiz_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/wizard') login_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/common') db_list = conn.list() if dbname not in db_list: id = conn.create(admin_passwd, dbname, True, lang) wait(id,uri) uid = login_conn.login(dbname, user, pwd) wiz_id = wiz_conn.create(dbname, uid, user, 'base_setup.base_setup') state = 'init' datas = {'form':{}} while state!='config': res = wiz_conn.execute(dbname, uid, pwd, wiz_id, datas, state, {}) if state=='init': datas['form'].update( res['datas'] ) if res['type']=='form': for field in res['fields'].keys(): datas['form'][field] = datas['form'].get(field,False) state = res['state'][-1][0] datas['form'].update({ 'profile': -1 }) elif res['type']=='state': state = res['state'] res = wiz_conn.execute(dbname, uid, pwd, wiz_id, datas, state, {}) install_module(uri, dbname, ['base_module_quality'],user,pwd) return True def drop_db(uri, dbname): conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/db') db_list = conn.list() if dbname in db_list: conn.drop(admin_passwd, dbname) return True def install_module(uri, dbname, modules, user='admin', pwd='admin'): uid = login(uri, dbname, user, pwd) if uid: obj_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/object') wizard_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/wizard') module_ids = obj_conn.execute(dbname, uid, pwd, 'ir.module.module', 'search', [('name','in',modules)]) obj_conn.execute(dbname, uid, pwd, 'ir.module.module', 'button_install', module_ids) wiz_id = wizard_conn.create(dbname, uid, pwd, 'module.upgrade.simple') state = 'init' datas = {} #while state!='menu': while state!='end': res = wizard_conn.execute(dbname, uid, pwd, wiz_id, datas, state, {}) if state == 'init': state = 'start' elif state == 'start': state = 'end' return True def upgrade_module(uri, dbname, modules, user='admin', pwd='admin'): uid = login(uri, dbname, user, pwd) if uid: obj_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/object') wizard_conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/wizard') module_ids = obj_conn.execute(dbname, uid, pwd, 'ir.module.module', 'search', [('name','in',modules)]) obj_conn.execute(dbname, uid, pwd, 'ir.module.module', 'button_upgrade', module_ids) wiz_id = wizard_conn.create(dbname, uid, pwd, 'module.upgrade.simple') state = 'init' datas = {} #while state!='menu': while state!='end': res = wizard_conn.execute(dbname, uid, pwd, wiz_id, datas, state, {}) if state == 'init': state = 'start' elif state == 'start': state = 'end' return True usage = """%prog command [options] Basic Commands: start-server Start Server create-db Create new database drop-db Drop database install-module Install module upgrade-module Upgrade module install-translation Install translation file check-quality Calculate quality and dump quality result into quality_log.pck using pickle """ parser = optparse.OptionParser(usage) parser.add_option("--modules", dest="modules", help="specify modules to install or check quality") parser.add_option("--addons-path", dest="addons_path", help="specify the addons path") parser.add_option("--root-path", dest="root_path", help="specify the root path") parser.add_option("-p", "--port", dest="port", help="specify the TCP port", type="int") parser.add_option("-d", "--database", dest="db_name", help="specify the database name") parser.add_option("--login", dest="login", help="specify the User Login") parser.add_option("--password", dest="pwd", help="specify the User Password") parser.add_option("--translate-in", dest="translate_in", help="specify .po files to import translation terms") (opt, args) = parser.parse_args() if len(args) != 1: parser.error("incorrect number of arguments") command = args[0] if command not in ('start-server','create-db','drop-db','install-module','upgrade-module','check-quality','install-translation'): parser.error("incorrect command") def die(cond, msg): if cond: print msg sys.exit(1) die(opt.modules and (not opt.db_name), "the modules option cannot be used without the database (-d) option") die(opt.translate_in and (not opt.db_name), "the translate-in option cannot be used without the database (-d) option") options = { 'addons-path' : opt.addons_path or 'addons', 'root-path' : opt.root_path or '', 'translate-in': opt.translate_in, 'port' : opt.port or 8069, 'database': opt.db_name or 'terp', 'modules' : opt.modules or [], 'login' : opt.login or 'admin', 'pwd' : opt.pwd or '', } options['modules'] = opt.modules and map(lambda m: m.strip(), opt.modules.split(',')) or [] options['translate_in'] = opt.translate_in and map(lambda m: m.strip(), opt.translate_in.split(',')) or [] uri = 'http://localhost:' + str(options['port']) server_thread = threading.Thread(target=start_server, args=(options['root-path'], options['port'], options['addons-path'])) try: server_thread.start() print 'Please wait 20 sec to start server....',uri time.sleep(20) if command == 'create-db': create_db(uri, options['database'], options['login'], options['pwd']) if command == 'drop-db': drop_db(uri, options['database']) if command == 'install-module': install_module(uri, options['database'], options['modules'], options['login'], options['pwd']) if command == 'upgrade-module': upgrade_module(uri, options['database'], options['modules'], options['login'], options['pwd']) if command == 'check-quality': check_quality(uri, options['login'], options['pwd'], options['database'], options['modules']) if command == 'install-translation': import_translate(uri, options['login'], options['pwd'], options['database'], options['translate_in']) clean() sys.exit(0) except xmlrpclib.Fault, e: print e.faultString clean() sys.exit(1) except Exception, e: print e clean() sys.exit(1)