diff options
| author | Antony Lesuisse <al@openerp.com> | 2011-09-24 16:52:58 +0200 |
|---|---|---|
| committer | Antony Lesuisse <al@openerp.com> | 2011-09-24 16:52:58 +0200 |
| commit | 7a88d9058d8e61d01bebc359609d3bfebdba11a0 (patch) | |
| tree | 40e56db35e0ceb928cf783b64d2c98152e202695 /openerp/addons/base/module | |
| parent | d743353e1681b8400cca3e02d3964117eeb16ab5 (diff) | |
| parent | dfccbaf28b77fef5860b9ad60ffdf97f3b4a64e0 (diff) | |
[MERGE] trunk
bzr revid: al@openerp.com-20110924145258-16r9qi7hr3dip1jz
Diffstat (limited to 'openerp/addons/base/module')
5 files changed, 82 insertions, 57 deletions
diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py index 034829b82b5..a35e4b5d1ce 100644 --- a/openerp/addons/base/module/module.py +++ b/openerp/addons/base/module/module.py @@ -107,48 +107,59 @@ class module(osv.osv): view_obj = self.pool.get('ir.ui.view') report_obj = self.pool.get('ir.actions.report.xml') menu_obj = self.pool.get('ir.ui.menu') - mlist = self.browse(cr, uid, ids, context=context) - mnames = {} - for m in mlist: - # skip uninstalled modules below, - # no data to find anyway - if m.state in ('installed', 'to upgrade', 'to remove'): - mnames[m.name] = m.id - res[m.id] = { - 'menus_by_module':[], - 'reports_by_module':[], + + dmodels = [] + if field_name is None or 'views_by_module' in field_name: + dmodels.append('ir.ui.view') + if field_name is None or 'reports_by_module' in field_name: + dmodels.append('ir.actions.report.xml') + if field_name is None or 'menus_by_module' in field_name: + dmodels.append('ir.ui.menu') + assert dmodels, "no models for %s" % field_name + + for module_rec in self.browse(cr, uid, ids, context=context): + res[module_rec.id] = { + 'menus_by_module': [], + 'reports_by_module': [], 'views_by_module': [] } - if not mnames: - return res + # Skip uninstalled modules below, no data to find anyway. + if module_rec.state not in ('installed', 'to upgrade', 'to remove'): + continue + + # then, search and group ir.model.data records + imd_models = dict( [(m,[]) for m in dmodels]) + imd_ids = model_data_obj.search(cr,uid,[('module','=', module_rec.name), + ('model','in',tuple(dmodels))]) - view_id = model_data_obj.search(cr,uid,[('module','in', mnames.keys()), - ('model','in',('ir.ui.view','ir.actions.report.xml','ir.ui.menu'))]) - for data_id in model_data_obj.browse(cr,uid,view_id,context): - # We use try except, because views or menus may not exist + for imd_res in model_data_obj.read(cr, uid, imd_ids, ['model', 'res_id'], context=context): + imd_models[imd_res['model']].append(imd_res['res_id']) + + # For each one of the models, get the names of these ids. + # We use try except, because views or menus may not exist. try: - key = data_id.model - res_mod_dic = res[mnames[data_id.module]] - if key=='ir.ui.view': - v = view_obj.browse(cr,uid,data_id.res_id) + res_mod_dic = res[module_rec.id] + for v in view_obj.browse(cr, uid, imd_models.get('ir.ui.view', []), context=context): aa = v.inherit_id and '* INHERIT ' or '' res_mod_dic['views_by_module'].append(aa + v.name + '('+v.type+')') - elif key=='ir.actions.report.xml': - res_mod_dic['reports_by_module'].append(report_obj.browse(cr,uid,data_id.res_id).name) - elif key=='ir.ui.menu': - res_mod_dic['menus_by_module'].append(menu_obj.browse(cr,uid,data_id.res_id).complete_name) + + for rx in report_obj.browse(cr, uid, imd_models.get('ir.actions.report.xml', []), context=context): + res_mod_dic['reports_by_module'].append(rx.name) + + for um in menu_obj.browse(cr, uid, imd_models.get('ir.ui.menu', []), context=context): + res_mod_dic['menus_by_module'].append(um.complete_name) except KeyError, e: self.__logger.warning( - 'Data not found for reference %s[%s:%s.%s]', data_id.model, - data_id.res_id, data_id.model, data_id.name, exc_info=True) - pass + 'Data not found for items of %s', module_rec.name) + except AttributeError, e: + self.__logger.warning( + 'Data not found for items of %s %s', module_rec.name, str(e)) except Exception, e: - self.__logger.warning('Unknown error while browsing %s[%s]', - data_id.model, data_id.res_id, exc_info=True) - pass + self.__logger.warning('Unknown error while fetching data of %s', + module_rec.name, exc_info=True) for key, value in res.iteritems(): - for k, v in res[key].iteritems() : + for k, v in res[key].iteritems(): res[key][k] = "\n".join(sorted(v)) return res @@ -437,12 +448,11 @@ class module(osv.osv): res.append(mod.url) if not download: continue - zipfile = urllib.urlopen(mod.url).read() + zip_content = urllib.urlopen(mod.url).read() fname = addons.get_module_path(str(mod.name)+'.zip', downloaded=True) try: - fp = file(fname, 'wb') - fp.write(zipfile) - fp.close() + with open(fname, 'wb') as fp: + fp.write(zip_content) except Exception: self.__logger.exception('Error when trying to create module ' 'file %s', fname) diff --git a/openerp/addons/base/module/wizard/base_import_language.py b/openerp/addons/base/module/wizard/base_import_language.py index d73cd0864a6..fdb9a177d8b 100644 --- a/openerp/addons/base/module/wizard/base_import_language.py +++ b/openerp/addons/base/module/wizard/base_import_language.py @@ -35,9 +35,12 @@ class base_language_import(osv.osv_memory): 'name': fields.char('Language Name',size=64 , required=True), 'code': fields.char('Code (eg:en__US)',size=5 , required=True), 'data': fields.binary('File', required=True), + 'overwrite': fields.boolean('Overwrite Existing Terms', + help="If you enable this option, existing translations (including custom ones) " + "will be overwritten and replaced by those in this file"), } - def import_lang(self, cr, uid, ids, context): + def import_lang(self, cr, uid, ids, context=None): """ Import Language @param cr: the current row, from the database cursor. @@ -45,8 +48,11 @@ class base_language_import(osv.osv_memory): @param ids: the ID or list of IDs @param context: A standard dictionary """ - + if context is None: + context = {} import_data = self.browse(cr, uid, ids)[0] + if import_data.overwrite: + context.update(overwrite=True) fileobj = TemporaryFile('w+') fileobj.write(base64.decodestring(import_data.data)) @@ -56,7 +62,7 @@ class base_language_import(osv.osv_memory): fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po' fileobj.seek(0) - tools.trans_load_data(cr, fileobj, fileformat, import_data.code, lang_name=import_data.name) + tools.trans_load_data(cr, fileobj, fileformat, import_data.code, lang_name=import_data.name, context=context) tools.trans_update_res_ids(cr) fileobj.close() return {} diff --git a/openerp/addons/base/module/wizard/base_import_language_view.xml b/openerp/addons/base/module/wizard/base_import_language_view.xml index d313afc4080..4a1d7e5b758 100644 --- a/openerp/addons/base/module/wizard/base_import_language_view.xml +++ b/openerp/addons/base/module/wizard/base_import_language_view.xml @@ -27,6 +27,7 @@ <field name="name" width="200"/> <field name="code"/> <field name="data" colspan="4"/> + <field name="overwrite"/> </group> <group colspan="8" col="8"> <separator string="" colspan="8"/> diff --git a/openerp/addons/base/module/wizard/base_module_import.py b/openerp/addons/base/module/wizard/base_module_import.py index 05c3b18198d..3ef9132af0e 100644 --- a/openerp/addons/base/module/wizard/base_module_import.py +++ b/openerp/addons/base/module/wizard/base_module_import.py @@ -28,6 +28,8 @@ import base64 from tools.translate import _ from osv import osv, fields +ADDONS_PATH = tools.config['addons_path'].split(",")[-1] + class base_module_import(osv.osv_memory): """ Import Module """ @@ -37,7 +39,8 @@ class base_module_import(osv.osv_memory): _columns = { 'module_file': fields.binary('Module .ZIP file', required=True), - 'state':fields.selection([('init','init'),('done','done')], 'state', readonly=True), + 'state':fields.selection([('init','init'),('done','done')], + 'state', readonly=True), 'module_name': fields.char('Module Name', size=128), } @@ -48,26 +51,30 @@ class base_module_import(osv.osv_memory): def importzip(self, cr, uid, ids, context): (data,) = self.browse(cr, uid, ids , context=context) module_data = data.module_file - - val = base64.decodestring(module_data) + zip_data = base64.decodestring(module_data) fp = StringIO() - fp.write(val) - fdata = zipfile.ZipFile(fp, 'r') - fname = fdata.namelist()[0] - module_name = os.path.split(fname)[0] - - ad = tools.config['addons_path'].split(",")[-1] + fp.write(zip_data) + try: + file_data = zipfile.ZipFile(fp, 'r') + except zipfile.BadZipfile: + raise osv.except_osv(_('Error !'), _('File is not a zip file!')) + init_file_name = sorted(file_data.namelist())[0] + module_name = os.path.split(init_file_name)[0] - fname = os.path.join(ad, module_name+'.zip') + file_path = os.path.join(ADDONS_PATH, '%s.zip' % module_name) try: - fp = file(fname, 'wb') - fp.write(val) - fp.close() + zip_file = open(file_path, 'wb') except IOError: - raise osv.except_osv(_('Error !'), _('Can not create the module file: %s !') % (fname,) ) + raise osv.except_osv(_('Error !'), + _('Can not create the module file: %s !') % \ + (file_path,) ) + zip_file.write(zip_data) + zip_file.close() - self.pool.get('ir.module.module').update_list(cr, uid, {'module_name': module_name,}) - self.write(cr, uid, ids, {'state':'done', 'module_name': module_name}, context) + self.pool.get('ir.module.module').update_list(cr, uid, + {'module_name': module_name,}) + self.write(cr, uid, ids, {'state':'done', 'module_name': module_name}, + context) return False def action_module_open(self, cr, uid, ids, context): @@ -84,4 +91,4 @@ class base_module_import(osv.osv_memory): base_module_import() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/module/wizard/base_module_import_view.xml b/openerp/addons/base/module/wizard/base_module_import_view.xml index 8e43789b057..0ca3e14ea96 100644 --- a/openerp/addons/base/module/wizard/base_module_import_view.xml +++ b/openerp/addons/base/module/wizard/base_module_import_view.xml @@ -12,9 +12,10 @@ <group colspan="3" col="1"> <field name="config_logo" widget="image" width="220" height="130" nolabel="1" colspan="1"/> <newline/> - <label width="220" string="This wizard helps you add a new language to you OpenERP system. After loading a new language it becomes available as default interface language for users and partners."/> + <label width="220" string='This wizard helps you to import a new module to your OpenERP system. +After importing a new module you can install it by clicking on the button "Install" from the form view.'/> <label width="220"/> - <label width="220" string="Please be patient, this operation may take a few minutes (depending on the number of modules currently installed)..."/> + <label width="220" string="Please be patient, this operation may take a few minutes..."/> <field name="state" invisible="1"/> </group> <separator orientation="vertical" rowspan="5"/> |
