diff options
| author | tpa-odoo <tpa@tinyerp.com> | 2014-05-22 15:51:51 +0530 |
|---|---|---|
| committer | tpa-odoo <tpa@tinyerp.com> | 2014-05-22 15:51:51 +0530 |
| commit | 41147025b8a634f746ad14c80b7c764ff494a501 (patch) | |
| tree | 7d40ca04b652bf85121774300a7567675bd39426 /addons/base_import_module/models | |
| parent | b27a3351af1cad72b852788a2a59a79256e6e644 (diff) | |
[ADD] add wizard to import zipped module
Diffstat (limited to 'addons/base_import_module/models')
| -rw-r--r-- | addons/base_import_module/models/__init__.py | 1 | ||||
| -rw-r--r-- | addons/base_import_module/models/base_import_module.py | 44 | ||||
| -rw-r--r-- | addons/base_import_module/models/ir_module.py | 34 |
3 files changed, 78 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..ffdbe0d7bc2 --- /dev/null +++ b/addons/base_import_module/models/base_import_module.py @@ -0,0 +1,44 @@ +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), + 'module_name': fields.char('Module Name', size=128), + } + + _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) + module_obj.import_zipfile(cr, uid, fp, context=context) + fp.close() + self.write(cr, uid, ids, {'state': 'done'}, context=context) + return False + + def action_module_open(self, cr, uid, ids, context): + data = self.browse(cr, uid, ids[0] , context=context) + return { + 'domain': str([('name', '=', data.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..10ffccc2b8e 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,31 @@ 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() + 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: + 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) |
