summaryrefslogtreecommitdiff
path: root/addons/base_module_quality/base_module_quality.py
diff options
context:
space:
mode:
authormra (Open ERP) <mra@tinyerp.com>2009-07-03 10:50:40 +0530
committermra (Open ERP) <mra@tinyerp.com>2009-07-03 10:50:40 +0530
commit484d021700986e73aa15534cb7303b0457e1a4df (patch)
treeb2f6a99093affd36b2e26cd66f4ffd13a62ad24f /addons/base_module_quality/base_module_quality.py
parenta3b98e29d585bc1fca4df4613bb8b54306740822 (diff)
[ADD] add base_module_quality module
bzr revid: mra@tinyerp.com-20090703052040-3rokridr4h3z33xj
Diffstat (limited to 'addons/base_module_quality/base_module_quality.py')
-rw-r--r--addons/base_module_quality/base_module_quality.py250
1 files changed, 250 insertions, 0 deletions
diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py
new file mode 100644
index 00000000000..ec1a50adb4a
--- /dev/null
+++ b/addons/base_module_quality/base_module_quality.py
@@ -0,0 +1,250 @@
+# -*- 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 os
+
+import pooler
+import osv
+import tools
+from tools import config
+from tools.translate import _
+from osv import osv, fields
+
+class abstract_quality_check(object):
+ '''
+ This Class provides...
+ '''
+
+ def __init__(self):
+ '''
+ this method should initialize the var
+ '''
+ #This float have to store the rating of the module.
+ #Used to compute the final score (average of all scores).
+ #0 <= self.score <= 1
+ self.score = 0.0
+
+ #This char have to store the name of the test.
+ self.name = ""
+
+ #This char have to store the aim of the test and eventually a note.
+ self.note = ""
+
+ #This char have to store the result.
+ #Used to display the result of the test.
+ self.result = ""
+
+ #This char have to store the result with more details.
+ #Used to provide more details if necessary.
+ self.result_details = ""
+
+ # This boolean variable defines that if you do not want to calculate score and just only need detail
+ # or summary report for some test then you will make it False.
+ self.bool_count_score = True
+
+ #This bool defines if the test can be run only if the module
+ #is installed.
+ #True => the module have to be installed.
+ #False => the module can be uninstalled.
+ self.bool_installed_only = True
+
+ #This variable is used to give result of test more weight,
+ #because some tests are more critical than others.
+ self.ponderation = 1.0
+
+ #Specify test got an error on module
+ self.error = False
+
+ #The tests have to subscribe itselfs in this list, that contains
+ #all the test that have to be performed.
+ self.tests = []
+ self.list_folders = os.listdir(config['addons_path'] +
+ '/base_module_quality/')
+ for item in self.list_folders:
+ self.item = item
+ path = config['addons_path']+'/base_module_quality/'+item
+ if os.path.exists(path + '/' + item + '.py') and item not in ['report', 'wizard', 'security']:
+ item2 = 'base_module_quality.' + item +'.' + item
+ x_module = __import__(item2)
+ x_file = getattr(x_module, item)
+ x_obj = getattr(x_file, item)
+ self.tests.append(x_obj)
+# raise 'Not Implemented'
+
+ def run_test(self, cr, uid, module_path=""):
+ '''
+ this method should do the test and fill the score, result and result_details var
+ '''
+ raise osv.except_osv(_('Programming Error'), _('Test Is Not Implemented'))
+
+ def get_objects(self, cr, uid, module):
+ # This function returns all object of the given module..
+ pool = pooler.get_pool(cr.dbname)
+ ids2 = pool.get('ir.model.data').search(cr, uid,
+ [('module', '=', module), ('model', '=', 'ir.model')])
+ model_list = []
+ model_data = pool.get('ir.model.data').browse(cr, uid, ids2)
+ for model in model_data:
+ model_list.append(model.res_id)
+ obj_list = []
+ for mod in pool.get('ir.model').browse(cr, uid, model_list):
+ obj_list.append(str(mod.model))
+ return obj_list
+
+ def get_model_ids(self, cr, uid, models=[]):
+ # This function returns all ids of the given objects..
+ if not models:
+ return []
+ pool = pooler.get_pool(cr.dbname)
+ return pool.get('ir.model').search(cr, uid, [('model', 'in', models)])
+
+ def get_ids(self, cr, uid, object_list):
+ #This method return dictionary with ids of records of object for module
+ pool = pooler.get_pool(cr.dbname)
+ result_ids = {}
+ for obj in object_list:
+ ids = pool.get(obj).search(cr, uid, [])
+ ids = filter(lambda id: id != None, ids)
+ result_ids[obj] = ids
+ return result_ids
+
+ def format_table(self, header=[], data_list={}): #This function can work forwidget="text_wiki"
+ detail = ""
+ detail += (header[0]) % tuple(header[1])
+ frow = '\n|-'
+ for i in header[1]:
+ frow += '\n| %s'
+ for key, value in data_list.items():
+ detail += (frow) % tuple(value)
+ detail = detail + '\n|}'
+ return detail
+
+ def format_html_table(self, header=[], data_list=[]): #This function can work for widget="html_tag"
+ # function create html table....
+ detail = ""
+ detail += (header[0]) % tuple(header[1])
+ frow = '<tr>'
+ for i in header[1]:
+ frow += '<td>%s</td>'
+ frow += '</tr>'
+ for key, value in data_list.items():
+ detail += (frow) % tuple(value)
+ return detail
+
+ def add_quatation(self, x_no, y_no):
+ return x_no/y_no
+
+class module_quality_check(osv.osv):
+ _name = 'module.quality.check'
+ _columns = {
+ 'name': fields.char('Rated Module', size=64, ),
+ 'final_score': fields.char('Final Score (%)', size=10,),
+ 'check_detail_ids': fields.one2many('module.quality.detail', 'quality_check_id', 'Tests',)
+ }
+
+ def check_quality(self, cr, uid, module_name, module_state=None):
+ '''
+ This function will calculate score of openerp module
+ It will return data in below format:
+ Format: {'final_score':'80.50', 'name': 'sale',
+ 'check_detail_ids':
+ [(0,0,{'name':'workflow_test', 'score':'100', 'ponderation':'0', 'summary': text_wiki format data, 'detail': html format data, 'state':'done', 'note':'XXXX'}),
+ ((0,0,{'name':'terp_test', 'score':'60', 'ponderation':'1', 'summary': text_wiki format data, 'detail': html format data, 'state':'done', 'note':'terp desctioption'}),
+ ..........]}
+ So here the detail result is in html format and summary will be in text_wiki format.
+ '''
+ #list_folders = os.listdir(config['addons_path']+'/base_module_quality/')
+ pool = pooler.get_pool(cr.dbname)
+ obj_module = pool.get('ir.module.module')
+ if not module_state:
+ module_id = obj_module.search(cr, uid, [('name', '=', module_name)])
+ if module_id:
+ module_state = obj_module.browse(cr, uid, module_id[0]).state
+
+ abstract_obj = abstract_quality_check()
+ score_sum = 0.0
+ ponderation_sum = 0.0
+ create_ids = []
+ for test in abstract_obj.tests:
+ ad = tools.config['addons_path']
+ if module_name == 'base':
+ ad = tools.config['root_path']+'/addons'
+ module_path = os.path.join(ad, module_name)
+ val = test.quality_test()
+ if not val.bool_installed_only or module_state == "installed":
+ val.run_test(cr, uid, str(module_path))
+ if not val.error:
+ data = {
+ 'name': val.name,
+ 'score': val.score * 100,
+ 'ponderation': val.ponderation,
+ 'summary': val.result,
+ 'detail': val.result_details,
+ 'state': 'done',
+ 'note': val.note,
+ }
+ if val.bool_count_score:
+ score_sum += val.score * val.ponderation
+ ponderation_sum += val.ponderation
+ else:
+ data = {
+ 'name': val.name,
+ 'score': 0,
+ 'summary': val.result,
+ 'state': 'skipped',
+ 'note': val.note,
+ }
+ else:
+ data = {
+ 'name': val.name,
+ 'note': val.note,
+ 'score': 0,
+ 'state': 'skipped',
+ 'summary': _("The module has to be installed before running this test.")
+ }
+ create_ids.append((0, 0, data))
+
+ final_score = '%.2f' % (score_sum / ponderation_sum * 100)
+ data = {
+ 'name': module_name,
+ 'final_score': final_score,
+ 'check_detail_ids' : create_ids,
+ }
+ return data
+
+module_quality_check()
+
+class module_quality_detail(osv.osv):
+ _name = 'module.quality.detail'
+ _columns = {
+ 'quality_check_id': fields.many2one('module.quality.check', 'Quality'),
+ 'name': fields.char('Name',size=128,),
+ 'score': fields.float('Score (%)'),
+ 'ponderation': fields.float('Ponderation', help='Some tests are more critical than others, so they have a bigger weight in the computation of final rating'),
+ 'note': fields.text('Note',),
+ 'summary': fields.text('Summary'),
+ 'detail': fields.text('Details'),
+ 'state': fields.selection([('done','Done'),('skipped','Skipped'),], 'State', size=6, help='The test will be completed only if the module is installed or if the test may be processed on uninstalled module.'),
+ }
+
+module_quality_detail()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file