[ADD] Makefile and quality_integration_server module for Integration server
authorHarshad Modi <hmo@hmo-tinyerp>
Thu, 20 Aug 2009 13:35:21 +0000 (19:05 +0530)
committerHarshad Modi <hmo@hmo-tinyerp>
Thu, 20 Aug 2009 13:35:21 +0000 (19:05 +0530)
bzr revid: hmo@hmo-tinyerp-20090820133521-udjbwhbjnzkdlfhl

Makefile [new file with mode: 0644]
bin/addons/quality_integration_server/base_quality_interrogation.py [new file with mode: 0755]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..39ab146
--- /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 (executable)
index 0000000..fdcab02
--- /dev/null
@@ -0,0 +1,296 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution    
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+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><html><html><html><body><a name="TOP"></a>'''
+            html +="<h1> Module : %s </h1>"%(quality_result['name'])   
+            html += "<h2> Final score : %s</h2>"%(quality_result['final_score'])
+            html += "<oi>"
+            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 += "<li><a href=\"#%s\">%s (%.2f)</a></li>"%(test,test,score)
+                    detail_html +="<a name=\"%s\"><h3>%s (Score : %s)</h3>%s</a>"%(test,test,score,detail.get('detail'))
+                    detail_html +='''<a href="#TOP">Go to Top</a>'''
+                    test_detail[test] = (score,detail.get('detail',''))
+            html += "</oi>%s</body></html></html></html></html></html>"%(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)
+
+
+