From 40fdb08a7db13c52c49026f8425bc40dac5a7696 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 19 Mar 2014 09:53:43 +0100 Subject: [WIP] base_import_module bzr revid: fme@openerp.com-20140319085343-zkee3rmqc9dzpa7h --- addons/base_import_module/controllers/main.py | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 addons/base_import_module/controllers/main.py (limited to 'addons/base_import_module/controllers/main.py') diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py new file mode 100644 index 00000000000..6ddd0158b4d --- /dev/null +++ b/addons/base_import_module/controllers/main.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +import os +import zipfile +from os.path import join as opj + +import openerp +from openerp.http import Controller, route, request + +MAX_FILE_SIZE = 100 * 1024 * 1024 # in megabytes + +class ImportModule(Controller): + + @route('/base_import_module/upload', type='http', auth='none') + def upload(self, mod_file=None, **kw): + assert request.db # TODO: custom ensure_db? + request.uid = openerp.SUPERUSER_ID # TODO: proper security + + 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.") + + with zipfile.ZipFile(mod_file, "r") as z: + for zf in z.filelist: + if zf.file_size > MAX_FILE_SIZE: + raise Exception("File %r 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: + # assert mod_name.startswith('theme_') + path = opj(module_dir, mod_name) + imm.import_module(request.cr, request.uid, mod_name, path, context=request.context) + return 'ok' + -- cgit v1.2.3 From 62a5632aec7c14a094164862f8bc2f47060a7943 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 26 Mar 2014 16:08:42 +0100 Subject: [IMP] Use requests for http requests. python does not provide multipart encoding bzr revid: fme@openerp.com-20140326150842-h33yuiwsnrm8gmbk --- addons/base_import_module/controllers/main.py | 28 ++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'addons/base_import_module/controllers/main.py') diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py index 6ddd0158b4d..45ce1e57480 100644 --- a/addons/base_import_module/controllers/main.py +++ b/addons/base_import_module/controllers/main.py @@ -10,10 +10,16 @@ MAX_FILE_SIZE = 100 * 1024 * 1024 # in megabytes class ImportModule(Controller): - @route('/base_import_module/upload', type='http', auth='none') + @route('/base_import_module/check', type='http', auth='user', methods=['GET']) + def check(self): + assert request.db # TODO: custom ensure_db? + assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group + return 'ok' + + @route('/base_import_module/upload', type='http', auth='user', methods=['POST']) def upload(self, mod_file=None, **kw): assert request.db # TODO: custom ensure_db? - request.uid = openerp.SUPERUSER_ID # TODO: proper security + assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group imm = request.registry['ir.module.module'] @@ -22,6 +28,8 @@ class ImportModule(Controller): 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: @@ -31,8 +39,14 @@ class ImportModule(Controller): 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: - # assert mod_name.startswith('theme_') - path = opj(module_dir, mod_name) - imm.import_module(request.cr, request.uid, mod_name, path, context=request.context) - return 'ok' - + 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 %r" % mod for mod in success] + for mod, error in errors.items(): + r.append("Error while importing module %r: %r" % (mod, error)) + return '\n'.join(r) -- cgit v1.2.3 From e49b8f5ae32b072c7a22763ad9472fcce9265f04 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 26 Mar 2014 22:57:09 +0100 Subject: [FIX] /login is not webservice friendly, base_import_module uses it's own Exceptions in /base_import_module/* will generate 500 pages with a short message bzr revid: fme@openerp.com-20140326215709-esc4zkpfp8uzuww1 --- addons/base_import_module/controllers/main.py | 45 ++++++++++++++++++++------- 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'addons/base_import_module/controllers/main.py') diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py index 45ce1e57480..cbfbd75894b 100644 --- a/addons/base_import_module/controllers/main.py +++ b/addons/base_import_module/controllers/main.py @@ -1,26 +1,47 @@ # -*- 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 +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): + try: + return f(*args, **kw) + except Exception, e: + return Response(response=str(e), status=500) + return wrap + class ImportModule(Controller): - @route('/base_import_module/check', type='http', auth='user', methods=['GET']) - def check(self): - assert request.db # TODO: custom ensure_db? - assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group - return 'ok' + def check_user(self, uid=None): + if uid is None: + uid = request.uid + is_admin = request.registry['res.users'].has_group(request.cr, uid, 'base.group_erp_manager') + if not is_admin: + raise openerp.exceptions.AccessError("Only administrators can upload a module") + + @route('/base_import_module/login', type='http', auth='none', methods=['POST']) + @webservice + def login(self, login, password, db=None): + if db and db != request.db: + raise Exception("Could not select database '%s'" % db) + uid = request.session.authenticate(request.db, login, password) + if not uid: + return Response(response="Wrong login/password", status=401) + self.check_user(uid) + return "ok" @route('/base_import_module/upload', type='http', auth='user', methods=['POST']) + @webservice def upload(self, mod_file=None, **kw): - assert request.db # TODO: custom ensure_db? - assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group - + self.check_user() imm = request.registry['ir.module.module'] if not mod_file: @@ -33,7 +54,7 @@ class ImportModule(Controller): with zipfile.ZipFile(mod_file, "r") as z: for zf in z.filelist: if zf.file_size > MAX_FILE_SIZE: - raise Exception("File %r exceed maximum allowed file size" % zf.filename) + raise Exception("File '%s' exceed maximum allowed file size" % zf.filename) with openerp.tools.osutil.tempdir() as module_dir: z.extractall(module_dir) @@ -46,7 +67,7 @@ class ImportModule(Controller): success.append(mod_name) except Exception, e: errors[mod_name] = str(e) - r = ["Successfully imported module %r" % mod for mod in success] + r = ["Successfully imported module '%s'" % mod for mod in success] for mod, error in errors.items(): - r.append("Error while importing module %r: %r" % (mod, error)) + r.append("Error while importing module '%s': %r" % (mod, error)) return '\n'.join(r) -- cgit v1.2.3