From 6a05a3c77877d46637ad1eac00886f10a2f14be9 Mon Sep 17 00:00:00 2001 From: Harshad Modi Date: Thu, 20 Aug 2009 19:05:21 +0530 Subject: [PATCH] [ADD] Makefile and quality_integration_server module for Integration server bzr revid: hmo@hmo-tinyerp-20090820133521-udjbwhbjnzkdlfhl --- Makefile | 43 +++ .../base_quality_interrogation.py | 296 ++++++++++++++++++ 2 files changed, 339 insertions(+) create mode 100644 Makefile create mode 100755 bin/addons/quality_integration_server/base_quality_interrogation.py diff --git a/Makefile b/Makefile new file mode 100644 index 00000000000..39ab146c13a --- /dev/null +++ b/Makefile @@ -0,0 +1,43 @@ +# -*- makefile -*- + +addons-path := bin/addons/ +root-path := bin/ +port := 8069 +net_port := 8070 +module := base +database := terp +language := fr_FR +i18n-import := bin/addons/base/i18n/fr_FR.po +interrogation_file := bin/addons/quality_integration_server/base_quality_interrogation.py +login := admin +password := admin + +start: + python $(interrogation_file) start-server --root-path=$(root-path) --addons-path=$(addons-path) --port=$(port) + +create-db: + python $(interrogation_file) create-db --database=$(database) --root-path=$(root-path) --addons-path=$(addons-path) --port=$(port) --login=$(login) --password=$(password) + +drop-db: + python $(interrogation_file) drop-db --database=$(database) --root-path=$(root-path) --addons-path=$(addons-path) --port=$(port) + +install-module: + python $(interrogation_file) install-module --modules=$(module) --database=$(database) --root-path=$(root-path) --addons-path=$(addons-path) --port=$(port) --login=$(login) --password=$(password) + +upgrade-module: + python $(interrogation_file) upgrade-module --modules=$(module) --database=$(database) --root-path=$(root-path) --addons-path=$(addons-path) --port=$(port) --login=$(login) --password=$(password) + + +install-translation: + python $(interrogation_file) install-translation --database=$(database) --translate-in=$(i18n-import) --port=$(port) --login=$(login) --password=$(password) --root-path=$(root-path) --addons-path=$(addons-path) + + +version: + python bin/openerp-server.py --version + +check-quality: + python $(interrogation_file) check-quality --database=$(database) --modules=$(module) --port=$(port) --login=$(login) --password=$(password) --addons-path=$(addons-path) --root-path=$(root-path) + + + + diff --git a/bin/addons/quality_integration_server/base_quality_interrogation.py b/bin/addons/quality_integration_server/base_quality_interrogation.py new file mode 100755 index 00000000000..fdcab020dbf --- /dev/null +++ b/bin/addons/quality_integration_server/base_quality_interrogation.py @@ -0,0 +1,296 @@ +# -*- 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) + + +