summaryrefslogtreecommitdiff
path: root/openerp/addons/base/module
diff options
context:
space:
mode:
authorAntony Lesuisse <al@openerp.com>2011-09-24 16:52:58 +0200
committerAntony Lesuisse <al@openerp.com>2011-09-24 16:52:58 +0200
commit7a88d9058d8e61d01bebc359609d3bfebdba11a0 (patch)
tree40e56db35e0ceb928cf783b64d2c98152e202695 /openerp/addons/base/module
parentd743353e1681b8400cca3e02d3964117eeb16ab5 (diff)
parentdfccbaf28b77fef5860b9ad60ffdf97f3b4a64e0 (diff)
[MERGE] trunk
bzr revid: al@openerp.com-20110924145258-16r9qi7hr3dip1jz
Diffstat (limited to 'openerp/addons/base/module')
-rw-r--r--openerp/addons/base/module/module.py80
-rw-r--r--openerp/addons/base/module/wizard/base_import_language.py12
-rw-r--r--openerp/addons/base/module/wizard/base_import_language_view.xml1
-rw-r--r--openerp/addons/base/module/wizard/base_module_import.py41
-rw-r--r--openerp/addons/base/module/wizard/base_module_import_view.xml5
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"/>