summaryrefslogtreecommitdiff
path: root/odoo/tools
diff options
context:
space:
mode:
authorxmo-odoo <xmo@odoo.com>2017-04-28 09:06:53 +0200
committerGitHub <noreply@github.com>2017-04-28 09:06:53 +0200
commitb4429c2a91889bf60b56e0c7909c844d357363f7 (patch)
tree1ae879a60a34454b4a93425f0ebe7d5ccd029c03 /odoo/tools
parentc5579ef89e2a595893d0959bef6fddfdbfb6d697 (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__.py36
-rw-r--r--odoo/tools/amount_to_text_en.py2
-rw-r--r--odoo/tools/appdirs.py6
-rw-r--r--odoo/tools/config.py7
-rw-r--r--odoo/tools/convert.py4
-rw-r--r--odoo/tools/import_email.py148
-rw-r--r--odoo/tools/lru.py2
-rw-r--r--odoo/tools/misc.py34
-rw-r--r--odoo/tools/test_config.py2
-rw-r--r--odoo/tools/translate.py17
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()