diff options
| author | xmo-odoo <xmo@odoo.com> | 2017-04-28 09:06:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-28 09:06:53 +0200 |
| commit | b4429c2a91889bf60b56e0c7909c844d357363f7 (patch) | |
| tree | 1ae879a60a34454b4a93425f0ebe7d5ccd029c03 /odoo/tools | |
| parent | c5579ef89e2a595893d0959bef6fddfdbfb6d697 (diff) | |
[FIX] Various P3-related import changes
* LDAP import: python-ldap is not python3-compatible, pyldap is
Warning: only supported from debian Stretch (current testing)?
https://packages.debian.org/search?searchon=names&keywords=pyldap
* implicitly relative imports
* imports of moved or removed stdlib modules
issue #8530
Diffstat (limited to 'odoo/tools')
| -rw-r--r-- | odoo/tools/__init__.py | 36 | ||||
| -rw-r--r-- | odoo/tools/amount_to_text_en.py | 2 | ||||
| -rw-r--r-- | odoo/tools/appdirs.py | 6 | ||||
| -rw-r--r-- | odoo/tools/config.py | 7 | ||||
| -rw-r--r-- | odoo/tools/convert.py | 4 | ||||
| -rw-r--r-- | odoo/tools/import_email.py | 148 | ||||
| -rw-r--r-- | odoo/tools/lru.py | 2 | ||||
| -rw-r--r-- | odoo/tools/misc.py | 34 | ||||
| -rw-r--r-- | odoo/tools/test_config.py | 2 | ||||
| -rw-r--r-- | odoo/tools/translate.py | 17 |
10 files changed, 62 insertions, 196 deletions
diff --git a/odoo/tools/__init__.py b/odoo/tools/__init__.py index 93ab0477546..13c2fd410b9 100644 --- a/odoo/tools/__init__.py +++ b/odoo/tools/__init__.py @@ -2,21 +2,21 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import copy -import win32 -import appdirs -from config import config -from misc import * -from convert import * -from translate import * -from graph import graph -from image import * -from amount_to_text import * -from amount_to_text_en import * -from pdf_utils import * -from yaml_import import * -from sql import * -from float_utils import * -from mail import * -from func import * -from debugger import * -from xml_utils import * +from . import win32 +from . import appdirs +from .config import config +from .misc import * +from .convert import * +from .translate import * +from .graph import graph +from .image import * +from .amount_to_text import * +from .amount_to_text_en import * +from .pdf_utils import * +from .yaml_import import * +from .sql import * +from .float_utils import * +from .mail import * +from .func import * +from .debugger import * +from .xml_utils import * diff --git a/odoo/tools/amount_to_text_en.py b/odoo/tools/amount_to_text_en.py index adfda4324b2..7a7fb5c2ef3 100644 --- a/odoo/tools/amount_to_text_en.py +++ b/odoo/tools/amount_to_text_en.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import logging -from translate import _ +from .translate import _ _logger = logging.getLogger(__name__) diff --git a/odoo/tools/appdirs.py b/odoo/tools/appdirs.py index a1650ba5aba..f98fa1f8ae3 100644 --- a/odoo/tools/appdirs.py +++ b/odoo/tools/appdirs.py @@ -373,7 +373,11 @@ def _get_win_folder_from_registry(csidl_name): registry for this guarantees us the correct answer for all CSIDL_* names. """ - import _winreg + try: + import winreg as _winreg + except ImportError: + # pylint: disable=bad-python3-import + import _winreg shell_folder_name = { "CSIDL_APPDATA": "AppData", diff --git a/odoo/tools/config.py b/odoo/tools/config.py index 4443bc7e6d7..3a227fb5142 100644 --- a/odoo/tools/config.py +++ b/odoo/tools/config.py @@ -1,7 +1,10 @@ #odoo.loggers.handlers. -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import ConfigParser +try: + import configparser as ConfigParser +except ImportError: + import ConfigParser import optparse import os import sys @@ -10,7 +13,7 @@ import odoo.conf import odoo.loglevels as loglevels import logging import odoo.release as release -import appdirs +from . import appdirs class MyOption (optparse.Option, object): """ optparse Option with two additional attributes. diff --git a/odoo/tools/convert.py b/odoo/tools/convert.py index 3df1d20b50f..84dbeec3a5e 100644 --- a/odoo/tools/convert.py +++ b/odoo/tools/convert.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import cStringIO +import io import csv import logging import os.path @@ -848,7 +848,7 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', #remove folder path from model head, model = os.path.split(model) - input = cStringIO.StringIO(csvcontent) #FIXME + input = io.BytesIO(csvcontent) #FIXME reader = csv.reader(input, quotechar='"', delimiter=',') fields = next(reader) diff --git a/odoo/tools/import_email.py b/odoo/tools/import_email.py deleted file mode 100644 index 74029c693eb..00000000000 --- a/odoo/tools/import_email.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -import os, sys -import re -import smtplib -import email, mimetypes -from email.header import decode_header -from email.mime.text import MIMEText -import xmlrpclib - -warn_msg = """ -Bonjour, - -Le message avec le sujet "%s" n'a pu être archivé dans l'ERP. - -""".decode('utf-8') - -class EmailParser(object): - - def __init__(self, headers, dispatcher): - self.headers = headers - self.dispatcher = dispatcher - - def parse(self, msg): - dispatcher((self.headers, msg)) - -class CommandDispatcher(object): - - def __init__(self, receiver): - self.receiver = receiver - - def __call__(self, request): - return self.receiver(request) - -class RPCProxy(object): - - def __init__(self, uid, passwd, host='localhost', port=8069, path='object'): - self.rpc = xmlrpclib.ServerProxy('http://%s:%s/%s' % (host, port, path)) - self.user_id = uid - self.passwd = passwd - - def __call__(self, request): - return self.rpc.execute(self.user_id, self.passwd, *request) - -class ReceiverEmail2Event(object): - - email_re = re.compile(r""" - ([a-zA-Z][\w\.-]*[a-zA-Z0-9] # username part - @ # mandatory @ sign - [a-zA-Z0-9][\w\.-]* # domain must start with a letter - \. - [a-z]{2,3} # TLD - ) - """, re.VERBOSE) - - project_re = re.compile(r"^ *\[?(\d{4}\.?\d{0,3})\]?", re.UNICODE) - - - def __init__(self, rpc): - self.rpc = rpc - - def get_addresses(self, headers, msg): - hcontent = '' - for header in [h for h in headers if h in msg]: - hcontent += msg[header] - return self.email_re.findall(hcontent) - - def get_partners(self, headers, msg): - alladdresses = self.get_addresses(headers, msg) - address_ids = self.rpc(('res.partner', 'search', [('email', 'in', alladdresses)])) - addresses = self.rpc(('res.partner', 'read', address_ids)) - return [x['partner_id'][0] for x in addresses] - - def __call__(self, request): - headers, msg = request - partners = self.get_partners(headers, msg) - subject = u'' - for string, charset in decode_header(msg['Subject']): - if charset: - subject += string.decode(charset) - else: - subject += unicode(string) - if partners: - self.save_mail(msg, subject, partners) - else: - warning = MIMEText((warn_msg % (subject,)).encode('utf-8'), 'plain', 'utf-8') - warning['Subject'] = 'Message de OpenERP' - warning['From'] = 'erp@steel-sa.com' - warning['To'] = msg['From'] - s = smtplib.SMTP() - s.connect() - s.sendmail('erp@steel-sa.com', self.email_re.findall(msg['From']), warning.as_string()) - s.close() - - if msg.is_multipart(): - for message in [m for m in msg.get_payload() if m.get_content_type() == 'message/rfc822']: - self((headers, message.get_payload()[0])) - - def save_mail(self, msg, subject, partners): - counter, description = 1, u'' - if msg.is_multipart(): - for part in msg.get_payload(): - stockdir = os.path.join('emails', msg['Message-Id'][1:-1]) - newdir = os.path.join('/tmp', stockdir) - filename = part.get_filename() - if not filename: - ext = mimetypes.guess_extension(part.get_type()) - if not ext: - ext = '.bin' - filename = 'part-%03d%s' % (counter, ext) - - if part.get_content_maintype() == 'multipart': - continue - elif part.get_content_maintype() == 'text': - if part.get_content_subtype() == 'plain': - description += part.get_payload(decode=1).decode(part.get_charsets()[0]) - description += u'\n\nVous trouverez les éventuels fichiers dans le répertoire: %s' % stockdir - continue - else: - description += u'\n\nCe message est en "%s", vous trouverez ce texte dans le répertoire: %s' % (part.get_content_type(), stockdir) - elif part.get_content_type() == 'message/rfc822': - continue - if not os.path.isdir(newdir): - os.mkdir(newdir) - - counter += 1 - fd = open(os.path.join(newdir, filename), 'w') - fd.write(part.get_payload(decode=1)) - fd.close() - else: - description = msg.get_payload(decode=1).decode(msg.get_charsets()[0]) - - project = self.project_re.search(subject) - if project: - project = project.groups()[0] - else: - project = '' - - for partner in partners: - self.rpc(('res.partner.event', 'create', {'name' : subject, 'partner_id' : partner, 'description' : description, 'project' : project})) - - -if __name__ == '__main__': - rpc_dispatcher = CommandDispatcher(RPCProxy(4, 'admin')) - dispatcher = CommandDispatcher(ReceiverEmail2Event(rpc_dispatcher)) - parser = EmailParser(['To', 'Cc', 'From'], dispatcher) - parser.parse(email.message_from_file(sys.stdin)) diff --git a/odoo/tools/lru.py b/odoo/tools/lru.py index b0ea21bba44..7c485a039d3 100644 --- a/odoo/tools/lru.py +++ b/odoo/tools/lru.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # taken from http://code.activestate.com/recipes/252524-length-limited-o1-lru-cache-implementation/ import threading -from func import synchronized +from .func import synchronized __all__ = ['LRU'] diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py index d90031e43eb..4c570e7cc87 100644 --- a/odoo/tools/misc.py +++ b/odoo/tools/misc.py @@ -8,12 +8,10 @@ Miscellaneous tools used by OpenERP. from functools import wraps import babel -import cPickle -import cProfile from contextlib import contextmanager import datetime import subprocess -import logging +import io import os import passlib.utils import re @@ -23,24 +21,35 @@ import threading import time import werkzeug.utils import zipfile -from cStringIO import StringIO from collections import defaultdict, Iterable, Mapping, MutableSet, OrderedDict from itertools import islice, izip, groupby, repeat from lxml import etree -from which import which +from .which import which from threading import local import traceback import csv from operator import itemgetter try: + # pylint: disable=bad-python3-import + import cProfile +except ImportError: + import profile as cProfile + +try: + # pylint: disable=bad-python3-import + import cPickle as pickle_ +except ImportError: + import pickle as pickle_ + +try: from html2text import html2text except ImportError: html2text = None -from config import config -from cache import * +from .config import config +from .cache import * from .parse_version import parse_version from . import pycompat @@ -227,10 +236,9 @@ def _fileopen(path, mode, basedir, pathinfo, basename=None): zipname = tail zpath = os.path.join(basedir, head + '.zip') if zipfile.is_zipfile(zpath): - from cStringIO import StringIO zfile = zipfile.ZipFile(zpath) try: - fo = StringIO() + fo = io.BytesIO() fo.write(zfile.read(os.path.join( os.path.basename(head), zipname).replace( os.sep, '/'))) @@ -1122,7 +1130,7 @@ consteq = getattr(passlib.utils, 'consteq', _consteq) class Pickle(object): @classmethod def load(cls, stream, errors=False): - unpickler = cPickle.Unpickler(stream) + unpickler = pickle_.Unpickler(stream) # pickle builtins: str/unicode, int/long, float, bool, tuple, list, dict, None unpickler.find_global = None try: @@ -1133,9 +1141,9 @@ class Pickle(object): @classmethod def loads(cls, text): - return cls.load(StringIO(text)) + return cls.load(io.BytesIO(text)) - dumps = cPickle.dumps - dump = cPickle.dump + dumps = pickle_.dumps + dump = pickle_.dump pickle = Pickle diff --git a/odoo/tools/test_config.py b/odoo/tools/test_config.py index 256e7ba4c32..045bcaaa9c7 100644 --- a/odoo/tools/test_config.py +++ b/odoo/tools/test_config.py @@ -9,7 +9,7 @@ import os -import config +from . import config config_file_00 = os.path.join(os.path.dirname(__file__),'test-config-values-00.conf') diff --git a/odoo/tools/translate.py b/odoo/tools/translate.py index 75495b4bbae..32299d6db14 100644 --- a/odoo/tools/translate.py +++ b/odoo/tools/translate.py @@ -20,10 +20,9 @@ from babel.messages import extract from lxml import etree import odoo -from odoo.tools import config, pycompat -from odoo.tools.misc import file_open, get_iso_codes, SKIPPED_ELEMENT_TYPES -from odoo.tools.osutil import walksymlinks -from odoo import sql_db, SUPERUSER_ID +from . import config, pycompat +from .misc import file_open, get_iso_codes, SKIPPED_ELEMENT_TYPES +from .osutil import walksymlinks _logger = logging.getLogger(__name__) @@ -337,7 +336,7 @@ class GettextAlias(object): # find current DB based on thread/worker db name (see netsvc) db_name = getattr(threading.currentThread(), 'dbname', None) if db_name: - return sql_db.db_connect(db_name) + return odoo.sql_db.db_connect(db_name) def _get_cr(self, frame, allow_create=True): # try, in order: cr, cursor, self.env.cr, self.cr, @@ -423,7 +422,7 @@ class GettextAlias(object): cr, is_new_cr = self._get_cr(frame) if cr: # Try to use ir.translation to benefit from global cache if possible - env = odoo.api.Environment(cr, SUPERUSER_ID, {}) + env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) res = env['ir.translation']._get_source(None, ('code','sql_constraint'), lang, source) else: _logger.debug('no context cursor detected, skipping translation for "%r"', source) @@ -780,7 +779,7 @@ def babel_extract_qweb(fileobj, keywords, comment_tags, options): def trans_generate(lang, modules, cr): - env = odoo.api.Environment(cr, SUPERUSER_ID, {}) + env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) to_translate = set() def push_translation(module, type, name, id, source, comments=None): @@ -1019,7 +1018,7 @@ def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, if verbose: _logger.info('loading translation file for language %s', lang) - env = odoo.api.Environment(cr, SUPERUSER_ID, context or {}) + env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, context or {}) Lang = env['res.lang'] Translation = env['ir.translation'] @@ -1196,6 +1195,6 @@ def load_language(cr, lang): :param lang: language ISO code with optional _underscore_ and l10n flavor (ex: 'fr', 'fr_BE', but not 'fr-BE') :type lang: str """ - env = odoo.api.Environment(cr, SUPERUSER_ID, {}) + env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) installer = env['base.language.install'].create({'lang': lang}) installer.lang_install() |
