summaryrefslogtreecommitdiff
path: root/addons/base_import_module/models
diff options
context:
space:
mode:
authorFabien Meghazi <agr@amigrave.com>2014-05-26 17:30:29 +0200
committerFabien Meghazi <agr@amigrave.com>2014-05-26 17:30:29 +0200
commita91a12e67f0b70cf6fe121a340c9fa67b58fb72f (patch)
tree349b67da3ec815593dc568f590447da0e6922ed4 /addons/base_import_module/models
parent1779495f79edc50c50c383266201fc0bb9cc457b (diff)
parentfc9d0d9ab043e27046bd6cdb98c3d483b36d0dda (diff)
Merge pull request #216 from odoo-dev/master-import-module-wizard-tpa
[IMP] Add 'Import Module' wizard to base_import_module
Diffstat (limited to 'addons/base_import_module/models')
-rw-r--r--addons/base_import_module/models/__init__.py1
-rw-r--r--addons/base_import_module/models/base_import_module.py53
-rw-r--r--addons/base_import_module/models/ir_module.py36
3 files changed, 89 insertions, 1 deletions
diff --git a/addons/base_import_module/models/__init__.py b/addons/base_import_module/models/__init__.py
index a28c82fe5ba..02b8831509a 100644
--- a/addons/base_import_module/models/__init__.py
+++ b/addons/base_import_module/models/__init__.py
@@ -1,2 +1,3 @@
# -*- coding: utf-8 -*-
import ir_module
+import base_import_module
diff --git a/addons/base_import_module/models/base_import_module.py b/addons/base_import_module/models/base_import_module.py
new file mode 100644
index 00000000000..36edb5a56f3
--- /dev/null
+++ b/addons/base_import_module/models/base_import_module.py
@@ -0,0 +1,53 @@
+import base64
+from StringIO import StringIO
+from io import BytesIO
+from openerp.osv import osv, fields
+
+class base_import_module(osv.TransientModel):
+ """ Import Module """
+ _name = "base.import.module"
+ _description = "Import Module"
+
+ _columns = {
+ 'module_file': fields.binary('Module .ZIP file', required=True),
+ 'state':fields.selection([('init','init'),('done','done')], 'Status', readonly=True),
+ 'import_message': fields.char('Import message'),
+ }
+
+ _defaults = {
+ 'state': 'init',
+ }
+
+ def import_module(self, cr, uid, ids, context=None):
+ module_obj = self.pool.get('ir.module.module')
+ data = self.browse(cr, uid, ids[0] , context=context)
+ zip_data = base64.decodestring(data.module_file)
+ fp = BytesIO()
+ fp.write(zip_data)
+ res = module_obj.import_zipfile(cr, uid, fp, context=context)
+ self.write(cr, uid, ids, {'state': 'done', 'import_message': res[0]}, context=context)
+ context = dict(context, module_name=res[1])
+ # Return wizard otherwise it will close wizard and will not show result message to user.
+ return {
+ 'name': 'Import Module',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'res_id': ids[0],
+ 'res_model': 'base.import.module',
+ 'type': 'ir.actions.act_window',
+ 'context': context,
+ }
+
+ def action_module_open(self, cr, uid, ids, context):
+ return {
+ 'domain': [('name', 'in', context.get('module_name',[]))],
+ 'name': 'Modules',
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'ir.module.module',
+ 'view_id': False,
+ 'type': 'ir.actions.act_window',
+ }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py
index 18e60f858da..2a0a9ea7fed 100644
--- a/addons/base_import_module/models/ir_module.py
+++ b/addons/base_import_module/models/ir_module.py
@@ -1,14 +1,18 @@
import logging
import os
import sys
+import zipfile
from os.path import join as opj
import openerp
from openerp.osv import osv
from openerp.tools import convert_file
+from openerp.tools.translate import _
_logger = logging.getLogger(__name__)
+MAX_FILE_SIZE = 100 * 1024 * 1024 # in megabytes
+
class view(osv.osv):
_inherit = "ir.module.module"
@@ -22,7 +26,7 @@ class view(osv.osv):
unmet_dependencies = set(terp['depends']).difference(known_mods_names.keys())
if unmet_dependencies:
- raise Exception("Unmet module dependencies: %s" % ', '.join(unmet_dependencies))
+ raise osv.except_osv(_('Error !'), _("Unmet module dependencies: %s" % ', '.join(unmet_dependencies)))
if mod:
self.write(cr, uid, mod.id, values)
@@ -69,3 +73,33 @@ class view(osv.osv):
return True
+ def import_zipfile(self, cr, uid, module_file, context=None):
+ if not module_file:
+ raise Exception("No file sent.")
+ if not zipfile.is_zipfile(module_file):
+ raise osv.except_osv(_('Error !'), _('File is not a zip file!'))
+
+ success = []
+ errors = dict()
+ module_names = []
+ with zipfile.ZipFile(module_file, "r") as z:
+ for zf in z.filelist:
+ if zf.file_size > MAX_FILE_SIZE:
+ raise osv.except_osv(_('Error !'), _("File '%s' exceed maximum allowed file size" % zf.filename))
+
+ with openerp.tools.osutil.tempdir() as module_dir:
+ z.extractall(module_dir)
+ dirs = [d for d in os.listdir(module_dir) if os.path.isdir(opj(module_dir, d))]
+ for mod_name in dirs:
+ module_names.append(mod_name)
+ try:
+ # assert mod_name.startswith('theme_')
+ path = opj(module_dir, mod_name)
+ self.import_module(cr, uid, mod_name, path, context=context)
+ success.append(mod_name)
+ except Exception, e:
+ errors[mod_name] = str(e)
+ r = ["Successfully imported module '%s'" % mod for mod in success]
+ for mod, error in errors.items():
+ r.append("Error while importing module '%s': %r" % (mod, error))
+ return '\n'.join(r), module_names