From 41147025b8a634f746ad14c80b7c764ff494a501 Mon Sep 17 00:00:00 2001 From: tpa-odoo Date: Thu, 22 May 2014 15:51:51 +0530 Subject: [PATCH 1/4] [ADD] add wizard to import zipped module --- addons/base_import_module/__openerp__.py | 2 +- addons/base_import_module/controllers/main.py | 36 +---------- addons/base_import_module/models/__init__.py | 1 + .../models/base_import_module.py | 44 +++++++++++++ addons/base_import_module/models/ir_module.py | 34 +++++++++- .../views/base_import_module.xml | 22 ++++--- openerp/addons/base/__openerp__.py | 1 - openerp/addons/base/module/wizard/__init__.py | 1 - .../base/module/wizard/base_module_import.py | 63 ------------------- 9 files changed, 92 insertions(+), 112 deletions(-) create mode 100644 addons/base_import_module/models/base_import_module.py rename openerp/addons/base/module/wizard/base_module_import_view.xml => addons/base_import_module/views/base_import_module.xml (67%) delete mode 100644 openerp/addons/base/module/wizard/base_module_import.py 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..4707deffca5 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) 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) 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 67% 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..405ec765473 100644 --- a/openerp/addons/base/module/wizard/base_module_import_view.xml +++ b/addons/base_import_module/views/base_import_module.xml @@ -4,7 +4,7 @@ Module Import - base.module.import + base.import.module
@@ -17,11 +17,14 @@
@@ -30,22 +33,21 @@ Module Import ir.actions.act_window - base.module.import + base.import.module form form new - + 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: From 8fa3a17c3918d46e600dd5171229fb58561c5ff7 Mon Sep 17 00:00:00 2001 From: tpa-odoo Date: Thu, 22 May 2014 17:09:52 +0530 Subject: [PATCH 2/4] [IMP] improved code to show import result in wizard and improved typo --- addons/base_import_module/controllers/main.py | 2 +- .../models/base_import_module.py | 23 +++++++++++++------ addons/base_import_module/models/ir_module.py | 4 +++- .../views/base_import_module.xml | 8 +++---- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py index 4707deffca5..d97e75ba8b6 100644 --- a/addons/base_import_module/controllers/main.py +++ b/addons/base_import_module/controllers/main.py @@ -36,4 +36,4 @@ class ImportModule(Controller): @webservice def upload(self, mod_file=None, **kw): self.check_user() - return request.registry['ir.module.module'].import_zipfile(request.cr, request.uid, mod_file, context=request.context) + 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/base_import_module.py b/addons/base_import_module/models/base_import_module.py index ffdbe0d7bc2..3d1e39e77b9 100644 --- a/addons/base_import_module/models/base_import_module.py +++ b/addons/base_import_module/models/base_import_module.py @@ -11,7 +11,7 @@ class base_import_module(osv.TransientModel): _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), + 'import_messgae': fields.char('Import messge'), } _defaults = { @@ -24,15 +24,24 @@ class base_import_module(osv.TransientModel): 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 + res = module_obj.import_zipfile(cr, uid, fp, context=context) + self.write(cr, uid, ids, {'state': 'done', 'import_messgae': 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): - data = self.browse(cr, uid, ids[0] , context=context) return { - 'domain': str([('name', '=', data.module_name)]), + 'domain': [('name', 'in', context.get('module_name',[]))], 'name': 'Modules', 'view_type': 'form', 'view_mode': 'tree,form', diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py index 10ffccc2b8e..2a0a9ea7fed 100644 --- a/addons/base_import_module/models/ir_module.py +++ b/addons/base_import_module/models/ir_module.py @@ -81,6 +81,7 @@ class view(osv.osv): 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: @@ -90,6 +91,7 @@ class view(osv.osv): 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) @@ -100,4 +102,4 @@ class view(osv.osv): 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 '\n'.join(r), module_names diff --git a/addons/base_import_module/views/base_import_module.xml b/addons/base_import_module/views/base_import_module.xml index 405ec765473..ffc3c18d702 100644 --- a/addons/base_import_module/views/base_import_module.xml +++ b/addons/base_import_module/views/base_import_module.xml @@ -3,18 +3,18 @@ - Module Import + Import Module base.import.module
- + -