diff --git a/addons/base_import_module/__openerp__.py b/addons/base_import_module/__openerp__.py
index 09ebca9cf41..262e1232278 100644
--- a/addons/base_import_module/__openerp__.py
+++ b/addons/base_import_module/__openerp__.py
@@ -13,7 +13,7 @@ for customization purpose.
'depends': ['web'],
'installable': True,
'auto_install': False,
- 'data': [],
+ 'data': ['views/base_import_module.xml'],
'qweb': [],
'test': [],
}
diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py
index cbfbd75894b..d97e75ba8b6 100644
--- a/addons/base_import_module/controllers/main.py
+++ b/addons/base_import_module/controllers/main.py
@@ -1,14 +1,8 @@
# -*- coding: utf-8 -*-
import functools
-import os
-import zipfile
-from os.path import join as opj
-
import openerp
from openerp.http import Controller, route, request, Response
-MAX_FILE_SIZE = 100 * 1024 * 1024 # in megabytes
-
def webservice(f):
@functools.wraps(f)
def wrap(*args, **kw):
@@ -42,32 +36,4 @@ class ImportModule(Controller):
@webservice
def upload(self, mod_file=None, **kw):
self.check_user()
- imm = request.registry['ir.module.module']
-
- if not mod_file:
- raise Exception("No file sent.")
- if not zipfile.is_zipfile(mod_file):
- raise Exception("Not a zipfile.")
-
- success = []
- errors = dict()
- with zipfile.ZipFile(mod_file, "r") as z:
- for zf in z.filelist:
- if zf.file_size > MAX_FILE_SIZE:
- raise Exception("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:
- try:
- # assert mod_name.startswith('theme_')
- path = opj(module_dir, mod_name)
- imm.import_module(request.cr, request.uid, mod_name, path, context=request.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)
+ return request.registry['ir.module.module'].import_zipfile(request.cr, request.uid, mod_file, context=request.context)[0]
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
diff --git a/openerp/addons/base/module/wizard/base_module_import_view.xml b/addons/base_import_module/views/base_import_module.xml
similarity index 55%
rename from openerp/addons/base/module/wizard/base_module_import_view.xml
rename to addons/base_import_module/views/base_import_module.xml
index d9d6bb6ee78..daaa7779c27 100644
--- a/openerp/addons/base/module/wizard/base_module_import_view.xml
+++ b/addons/base_import_module/views/base_import_module.xml
@@ -3,49 +3,51 @@
- Module Import
- base.module.import
+ Import Module
+ base.import.module
- Module Import
+ Import Module
ir.actions.act_window
- base.module.import
+ base.import.module
form
form
new
-
+ sequence="100"/>
+
diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py
index f5a9ab5a052..6db84cb84c4 100644
--- a/openerp/addons/base/__openerp__.py
+++ b/openerp/addons/base/__openerp__.py
@@ -63,7 +63,6 @@ The kernel of OpenERP, needed for all installation.
'module/module_view.xml',
'module/module_data.xml',
'module/module_report.xml',
- 'module/wizard/base_module_import_view.xml',
'module/wizard/base_module_update_view.xml',
'module/wizard/base_language_install_view.xml',
'module/wizard/base_import_language_view.xml',
diff --git a/openerp/addons/base/module/wizard/__init__.py b/openerp/addons/base/module/wizard/__init__.py
index a4133a50113..58d5bb97aed 100644
--- a/openerp/addons/base/module/wizard/__init__.py
+++ b/openerp/addons/base/module/wizard/__init__.py
@@ -19,7 +19,6 @@
#
##############################################################################
-import base_module_import
import base_module_update
import base_language_install
import base_import_language
diff --git a/openerp/addons/base/module/wizard/base_module_import.py b/openerp/addons/base/module/wizard/base_module_import.py
deleted file mode 100644
index 2ba789f3332..00000000000
--- a/openerp/addons/base/module/wizard/base_module_import.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-import base64
-import os
-from StringIO import StringIO
-import zipfile
-
-from openerp import tools
-from openerp.osv import osv, fields
-from openerp.tools.translate import _
-
-class base_module_import(osv.osv_memory):
- """ Import Module """
-
- _name = "base.module.import"
- _description = "Import Module"
- _columns = {
- 'module_file': fields.binary('Module .ZIP file', required=True),
- 'state':fields.selection([('init','init'),('done','done')],
- 'Status', readonly=True),
- 'module_name': fields.char('Module Name', size=128),
- }
-
- _defaults = {
- 'state': 'init',
- }
-
- def importzip(self, cr, uid, ids, context):
- #TODO: drop this model and the corresponding view/action in trunk
- raise NotImplementedError('This feature is not available')
-
- def action_module_open(self, cr, uid, ids, context):
- (data,) = self.browse(cr, uid, ids , context=context)
- return {
- 'domain': str([('name', '=', data.module_name)]),
- 'name': 'Modules',
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'ir.module.module',
- 'type': 'ir.actions.act_window',
- }
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: