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 | |
| 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')
53 files changed, 290 insertions, 403 deletions
diff --git a/odoo/__init__.py b/odoo/__init__.py index dbf17c02200..4c074c9beb3 100644 --- a/odoo/__init__.py +++ b/odoo/__init__.py @@ -54,17 +54,17 @@ def registry(database_name=None): #---------------------------------------------------------- # Imports #---------------------------------------------------------- -import addons -import conf -import loglevels -import modules -import netsvc -import osv -import release -import report -import service -import sql_db -import tools +from . import addons +from . import conf +from . import loglevels +from . import modules +from . import netsvc +from . import osv +from . import release +from . import report +from . import service +from . import sql_db +from . import tools #---------------------------------------------------------- # Model classes, fields, api decorators, and translations @@ -77,5 +77,5 @@ from odoo.tools.translate import _ #---------------------------------------------------------- # Other imports, which may require stuff from above #---------------------------------------------------------- -import cli -import http +from . import cli +from . import http diff --git a/odoo/addons/base/__init__.py b/odoo/addons/base/__init__.py index 2defb05a2a7..12f085fadc9 100644 --- a/odoo/addons/base/__init__.py +++ b/odoo/addons/base/__init__.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import ir -import module -import res -import report -import tests +from . import ir +from . import module +from . import res +from . import report def post_init(cr, registry): """Rewrite ICP's to force groups""" diff --git a/odoo/addons/base/ir/__init__.py b/odoo/addons/base/ir/__init__.py index 9de55cfaff7..0b99d65f2bf 100644 --- a/odoo/addons/base/ir/__init__.py +++ b/odoo/addons/base/ir/__init__.py @@ -1,22 +1,22 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import ir_model -import ir_sequence -import ir_ui_menu -import ir_ui_view -import ir_actions -import ir_attachment -import ir_cron -import ir_filters -import ir_values -import ir_translation -import ir_exports -import ir_rule -import ir_config_parameter -import ir_autovacuum -import ir_mail_server -import ir_fields -import ir_qweb -import ir_http -import ir_logging +from . import ir_model +from . import ir_sequence +from . import ir_ui_menu +from . import ir_ui_view +from . import ir_actions +from . import ir_attachment +from . import ir_cron +from . import ir_filters +from . import ir_values +from . import ir_translation +from . import ir_exports +from . import ir_rule +from . import ir_config_parameter +from . import ir_autovacuum +from . import ir_mail_server +from . import ir_fields +from . import ir_qweb +from . import ir_http +from . import ir_logging diff --git a/odoo/addons/base/ir/ir_http.py b/odoo/addons/base/ir/ir_http.py index 75676910461..3d9c72aec60 100644 --- a/odoo/addons/base/ir/ir_http.py +++ b/odoo/addons/base/ir/ir_http.py @@ -10,7 +10,6 @@ import mimetypes import os import re import sys -import urllib2 import werkzeug import werkzeug.exceptions diff --git a/odoo/addons/base/ir/ir_qweb/fields.py b/odoo/addons/base/ir/ir_qweb/fields.py index e40f64c3937..a1f9014b6d8 100644 --- a/odoo/addons/base/ir/ir_qweb/fields.py +++ b/odoo/addons/base/ir/ir_qweb/fields.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import re from collections import OrderedDict +from io import BytesIO from odoo import api, fields, models, _ from PIL import Image -from cStringIO import StringIO import babel from odoo.tools import html_escape as escape, posix_to_ldml, safe_eval, float_utils, format_date from .qweb import unicodifier @@ -269,7 +269,7 @@ class ImageConverter(models.AbstractModel): @api.model def value_to_html(self, value, options): try: - image = Image.open(StringIO(value.decode('base64'))) + image = Image.open(BytesIO(value.decode('base64'))) image.verify() except IOError: raise ValueError("Non-image binary fields can not be converted to HTML") diff --git a/odoo/addons/base/ir/ir_qweb/ir_qweb.py b/odoo/addons/base/ir/ir_qweb/ir_qweb.py index 20a640be8d4..68c4bf048d7 100644 --- a/odoo/addons/base/ir/ir_qweb/ir_qweb.py +++ b/odoo/addons/base/ir/ir_qweb/ir_qweb.py @@ -1,23 +1,29 @@ # -*- coding: utf-8 -*- from __future__ import print_function import ast -from urlparse import urlparse +import json +import logging +from collections import OrderedDict +from time import time +try: + from urllib.parse import urlparse +except ImportError: + # pylint: disable=bad-python3-import + from urlparse import urlparse + from lxml import html +from lxml import etree from odoo.tools import pycompat -from .qweb import QWeb, Contextifier -from .assetsbundle import AssetsBundle -from lxml import etree -from collections import OrderedDict from odoo import api, models, tools from odoo.tools.safe_eval import assert_valid_codeobj, _BUILTINS, _SAFE_OPCODES from odoo.http import request from odoo.modules.module import get_resource_path -import json -from time import time -import logging +from .qweb import QWeb, Contextifier +from .assetsbundle import AssetsBundle + _logger = logging.getLogger(__name__) diff --git a/odoo/addons/base/ir/ir_qweb/qweb.py b/odoo/addons/base/ir/ir_qweb/qweb.py index a4204326344..b395dfb7698 100644 --- a/odoo/addons/base/ir/ir_qweb/qweb.py +++ b/odoo/addons/base/ir/ir_qweb/qweb.py @@ -1,28 +1,33 @@ # -*- coding: utf-8 -*- import ast -from collections import OrderedDict, Sized, Mapping, defaultdict -from lxml import etree, html +import logging import re import traceback -from itertools import count + +from collections import OrderedDict, Sized, Mapping, defaultdict +from functools import reduce +from itertools import chain, izip, tee, count from textwrap import dedent + +from lxml import etree, html import werkzeug from werkzeug.utils import escape as _escape -from itertools import chain, izip, tee -import __builtin__ -from functools import reduce from odoo.tools import pycompat -builtin_defaults = {name: getattr(__builtin__, name) for name in dir(__builtin__)} +try: + import builtins + builtin_defaults = {name: getattr(builtins, name) for name in dir(builtins)} +except ImportError: + # pylint: disable=bad-python3-import + import __builtin__ + builtin_defaults = {name: getattr(__builtin__, name) for name in dir(__builtin__)} try: import astor except ImportError: astor = None -import logging - unsafe_eval = eval _logger = logging.getLogger(__name__) diff --git a/odoo/addons/base/module/__init__.py b/odoo/addons/base/module/__init__.py index 8d1010ae88a..e455df15182 100644 --- a/odoo/addons/base/module/__init__.py +++ b/odoo/addons/base/module/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import module -import wizard -import report +from . import module +from . import wizard +from . import report diff --git a/odoo/addons/base/module/module.py b/odoo/addons/base/module/module.py index 1178fcca49f..f95c2b07dc1 100644 --- a/odoo/addons/base/module/module.py +++ b/odoo/addons/base/module/module.py @@ -3,25 +3,27 @@ from collections import defaultdict from operator import attrgetter import importlib +import io import logging import os import shutil import tempfile -import urllib2 -import urlparse import zipfile +try: + from urllib import parse as urlparse + from urllib.request import urlopen +except ImportError: + # pylint: disable=bad-python3-import + import urlparse + from urllib2 import urlopen + from docutils import nodes from docutils.core import publish_string from docutils.transforms import Transform, writer_aux from docutils.writers.html4css1 import Writer import lxml.html -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO # NOQA - import odoo from odoo import api, fields, models, modules, tools, _ from odoo.exceptions import AccessDenied, UserError @@ -676,12 +678,12 @@ class Module(models.Model): try: _logger.info('Downloading module `%s` from OpenERP Apps', module_name) - content = urllib2.urlopen(url).read() + content = urlopen(url).read() except Exception: _logger.exception('Failed to fetch module %s', module_name) raise UserError(_('The `%s` module appears to be unavailable at the moment, please try again later.') % module_name) else: - zipfile.ZipFile(StringIO(content)).extractall(tmp) + zipfile.ZipFile(io.BytesIO(content)).extractall(tmp) assert os.path.isdir(os.path.join(tmp, module_name)) # 2a. Copy/Replace module source in addons path diff --git a/odoo/addons/base/module/report/__init__.py b/odoo/addons/base/module/report/__init__.py index 3354d265c76..1d8f3aef4da 100644 --- a/odoo/addons/base/module/report/__init__.py +++ b/odoo/addons/base/module/report/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import ir_module_reference_print +from . import ir_module_reference_print diff --git a/odoo/addons/base/module/wizard/__init__.py b/odoo/addons/base/module/wizard/__init__.py index 35d85e5e002..a0d693f948d 100644 --- a/odoo/addons/base/module/wizard/__init__.py +++ b/odoo/addons/base/module/wizard/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import base_module_update -import base_language_install -import base_import_language -import base_module_upgrade -import base_module_configuration -import base_export_language -import base_update_translations +from . import base_module_update +from . import base_language_install +from . import base_import_language +from . import base_module_upgrade +from . import base_module_configuration +from . import base_export_language +from . import base_update_translations diff --git a/odoo/addons/base/module/wizard/base_export_language.py b/odoo/addons/base/module/wizard/base_export_language.py index cd19222af14..50c57bb870e 100644 --- a/odoo/addons/base/module/wizard/base_export_language.py +++ b/odoo/addons/base/module/wizard/base_export_language.py @@ -3,7 +3,7 @@ import base64 import contextlib -import cStringIO +import io from odoo import api, fields, models, tools, _ @@ -34,7 +34,7 @@ class BaseLanguageExport(models.TransientModel): lang = this.lang if this.lang != NEW_LANG_KEY else False mods = sorted(this.mapped('modules.name')) or ['all'] - with contextlib.closing(cStringIO.StringIO()) as buf: + with contextlib.closing(io.BytesIO()) as buf: tools.trans_export(lang, mods, buf, this.format, self._cr) out = base64.encodestring(buf.getvalue()) diff --git a/odoo/addons/base/module/wizard/base_update_translations.py b/odoo/addons/base/module/wizard/base_update_translations.py index c5057a01fff..8f487dbbafe 100644 --- a/odoo/addons/base/module/wizard/base_update_translations.py +++ b/odoo/addons/base/module/wizard/base_update_translations.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import contextlib -import cStringIO +import io from odoo import api, fields, models, tools, _ from odoo.exceptions import UserError @@ -37,7 +37,7 @@ class BaseUpdateTranslations(models.TransientModel): def act_update(self): this = self[0] lang_name = self._get_lang_name(this.lang) - with contextlib.closing(cStringIO.StringIO()) as buf: + with contextlib.closing(io.BytesIO()) as buf: tools.trans_export(this.lang, ['all'], buf, 'csv', self._cr) tools.trans_load_data(self._cr, buf, 'csv', this.lang, lang_name=lang_name) return {'type': 'ir.actions.act_window_close'} diff --git a/odoo/addons/base/report/__init__.py b/odoo/addons/base/report/__init__.py index 254008f0185..6ce403b6633 100644 --- a/odoo/addons/base/report/__init__.py +++ b/odoo/addons/base/report/__init__.py @@ -1 +1 @@ -import preview_report +from . import preview_report diff --git a/odoo/addons/base/res/__init__.py b/odoo/addons/base/res/__init__.py index a43bcf80462..ee904734c09 100644 --- a/odoo/addons/base/res/__init__.py +++ b/odoo/addons/base/res/__init__.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import res_country -import res_lang -import res_partner -import res_bank -import res_config -import res_currency -import res_font -import res_company -import res_users -import res_request -import ir_property +from . import res_country +from . import res_lang +from . import res_partner +from . import res_bank +from . import res_config +from . import res_currency +from . import res_font +from . import res_company +from . import res_users +from . import res_request +from . import ir_property diff --git a/odoo/addons/base/res/res_partner.py b/odoo/addons/base/res/res_partner.py index 42edc43b2b7..fe758d36de1 100644 --- a/odoo/addons/base/res/res_partner.py +++ b/odoo/addons/base/res/res_partner.py @@ -6,8 +6,14 @@ import datetime import hashlib import pytz import threading -import urllib2 -import urlparse + +try: + from urllib import parse as urlparse + from urllib.request import urlopen +except ImportError: + # pylint: disable=bad-python3-import + import urlparse + from urllib2 import urlopen from email.utils import formataddr from lxml import etree @@ -16,7 +22,6 @@ from odoo import api, fields, models, tools, SUPERUSER_ID, _ from odoo.modules import get_module_resource from odoo.osv.expression import get_unaccent_wrapper from odoo.exceptions import UserError, ValidationError -from odoo.osv.orm import browse_record # Global variables used for the warning fields declared on the res.partner # in the following modules : sale, purchase, account, stock @@ -702,7 +707,7 @@ class Partner(models.Model): email_hash = hashlib.md5(email.lower()).hexdigest() url = "https://www.gravatar.com/avatar/" + email_hash try: - image_content = urllib2.urlopen(url + "?d=404&s=128", timeout=5).read() + image_content = urlopen(url + "?d=404&s=128", timeout=5).read() gravatar_image = base64.b64encode(image_content) except Exception: pass diff --git a/odoo/addons/base/tests/__init__.py b/odoo/addons/base/tests/__init__.py index a59e87094f7..6ae162486d6 100644 --- a/odoo/addons/base/tests/__init__.py +++ b/odoo/addons/base/tests/__init__.py @@ -1,34 +1,34 @@ -import test_acl -import test_api -import test_base -import test_basecase -import test_db_cursor -import test_expression -import test_float -import test_func -import test_ir_actions -import test_ir_attachment -import test_ir_http -import test_ir_filters -import test_ir_sequence -import test_ir_sequence_date_range -import test_ir_values -import test_mail -import test_menu -import test_mimetypes -import test_misc -import test_orm -import test_ormcache -import test_osv -import test_phase -import test_qweb -import test_res_config -import test_res_lang -import test_search -import test_translate +from . import test_acl +from . import test_api +from . import test_base +from . import test_basecase +from . import test_db_cursor +from . import test_expression +from . import test_float +from . import test_func +from . import test_ir_actions +from . import test_ir_attachment +from . import test_ir_http +from . import test_ir_filters +from . import test_ir_sequence +from . import test_ir_sequence_date_range +from . import test_ir_values +from . import test_mail +from . import test_menu +from . import test_mimetypes +from . import test_misc +from . import test_orm +from . import test_ormcache +from . import test_osv +from . import test_phase +from . import test_qweb +from . import test_res_config +from . import test_res_lang +from . import test_search +from . import test_translate #import test_uninstall # loop -import test_user_has_group -import test_view_validation -import test_views -import test_xmlrpc -import test_res_partner_bank +from . import test_user_has_group +from . import test_view_validation +from . import test_views +from . import test_xmlrpc +from . import test_res_partner_bank diff --git a/odoo/addons/base/tests/test_view_validation.py b/odoo/addons/base/tests/test_view_validation.py index 963f737ae4d..a408b993605 100644 --- a/odoo/addons/base/tests/test_view_validation.py +++ b/odoo/addons/base/tests/test_view_validation.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from lxml import etree -from StringIO import StringIO +import io import unittest from odoo.tools.view_validation import ( @@ -11,7 +11,7 @@ from odoo.tools.view_validation import ( valid_field_in_graph, valid_field_in_tree, ) -invalid_form = etree.parse(StringIO('''\ +invalid_form = etree.parse(io.BytesIO('''\ <form> <label></label> <group> @@ -34,7 +34,7 @@ invalid_form = etree.parse(StringIO('''\ </form> ''')).getroot() -valid_form = etree.parse(StringIO('''\ +valid_form = etree.parse(io.BytesIO('''\ <form string=""> <field name=""></field> <field name=""></field> @@ -54,7 +54,7 @@ valid_form = etree.parse(StringIO('''\ </form> ''')).getroot() -invalid_graph = etree.parse(StringIO('''\ +invalid_graph = etree.parse(io.BytesIO('''\ <graph> <label/> <group> @@ -66,14 +66,14 @@ invalid_graph = etree.parse(StringIO('''\ </graph> ''')).getroot() -valid_graph = etree.parse(StringIO('''\ +valid_graph = etree.parse(io.BytesIO('''\ <graph string=""> <field name=""></field> <field name=""></field> </graph> ''')).getroot() -invalid_tree = etree.parse(StringIO('''\ +invalid_tree = etree.parse(io.BytesIO('''\ <tree> <group> <div> @@ -84,7 +84,7 @@ invalid_tree = etree.parse(StringIO('''\ </tree> ''')).getroot() -valid_tree = etree.parse(StringIO('''\ +valid_tree = etree.parse(io.BytesIO('''\ <tree string=""> <field name=""></field> <field name=""></field> diff --git a/odoo/addons/test_access_rights/__init__.py b/odoo/addons/test_access_rights/__init__.py index 89d26e2f597..a0fdc10fe11 100644 --- a/odoo/addons/test_access_rights/__init__.py +++ b/odoo/addons/test_access_rights/__init__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -import models +from . import models diff --git a/odoo/addons/test_access_rights/tests/__init__.py b/odoo/addons/test_access_rights/tests/__init__.py index 6e1c696fc37..1ba8765ddc0 100644 --- a/odoo/addons/test_access_rights/tests/__init__.py +++ b/odoo/addons/test_access_rights/tests/__init__.py @@ -1 +1 @@ -import test_ir_rules +from . import test_ir_rules diff --git a/odoo/addons/test_assetsbundle/__init__.py b/odoo/addons/test_assetsbundle/__init__.py index ee5959455ad..e046e49fbe2 100644 --- a/odoo/addons/test_assetsbundle/__init__.py +++ b/odoo/addons/test_assetsbundle/__init__.py @@ -1 +1 @@ -import controllers +from . import controllers diff --git a/odoo/addons/test_impex/__init__.py b/odoo/addons/test_impex/__init__.py index bff786c0885..0650744f6bc 100644 --- a/odoo/addons/test_impex/__init__.py +++ b/odoo/addons/test_impex/__init__.py @@ -1 +1 @@ -import models +from . import models diff --git a/odoo/addons/test_inherit/__init__.py b/odoo/addons/test_inherit/__init__.py index 89d26e2f597..a0fdc10fe11 100644 --- a/odoo/addons/test_inherit/__init__.py +++ b/odoo/addons/test_inherit/__init__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -import models +from . import models diff --git a/odoo/addons/test_new_api/__init__.py b/odoo/addons/test_new_api/__init__.py index 361c3498d66..a0fdc10fe11 100644 --- a/odoo/addons/test_new_api/__init__.py +++ b/odoo/addons/test_new_api/__init__.py @@ -1,3 +1,2 @@ # -*- coding: utf-8 -*- -import models -import tests +from . import models diff --git a/odoo/addons/test_pylint/tests/__init__.py b/odoo/addons/test_pylint/tests/__init__.py index c102da5600e..66bc70c522e 100644 --- a/odoo/addons/test_pylint/tests/__init__.py +++ b/odoo/addons/test_pylint/tests/__init__.py @@ -1 +1 @@ -import test_pylint +from . import test_pylint diff --git a/odoo/addons/test_pylint/tests/test_pylint.py b/odoo/addons/test_pylint/tests/test_pylint.py index 02c1a14a261..1ae544e56a6 100644 --- a/odoo/addons/test_pylint/tests/test_pylint.py +++ b/odoo/addons/test_pylint/tests/test_pylint.py @@ -26,6 +26,12 @@ class TestPyLint(TransactionCase): 'W0123', # eval used 'W0101', # unreachable code + 'misplaced-future', + 'relative-import', + 'deprecated-module', + 'import-star-module-level', + # 'bad-python3-import', # TODO: more stuff used in report + 'long-suffix', 'apply-builtin', 'cmp-builtin', @@ -73,4 +79,4 @@ class TestPyLint(TransactionCase): else: out = process.communicate()[0] if process.returncode: - self.fail(msg="\n" + out) + self.fail("\n" + out) diff --git a/odoo/cli/__init__.py b/odoo/cli/__init__.py index 1fd63804785..4b860fe68d6 100644 --- a/odoo/cli/__init__.py +++ b/odoo/cli/__init__.py @@ -4,10 +4,10 @@ import os import odoo -from command import Command, main +from .command import Command, main -import deploy -import scaffold -import server -import shell -import start +from . import deploy +from . import scaffold +from . import server +from . import shell +from . import start diff --git a/odoo/conf/__init__.py b/odoo/conf/__init__.py index a189f085405..b9722b9fff6 100644 --- a/odoo/conf/__init__.py +++ b/odoo/conf/__init__.py @@ -15,7 +15,7 @@ must be used. """ -import deprecation +from . import deprecation # Paths to search for OpenERP addons. addons_paths = [] diff --git a/odoo/exceptions.py b/odoo/exceptions.py index d83e350c624..1facc6207cb 100644 --- a/odoo/exceptions.py +++ b/odoo/exceptions.py @@ -12,7 +12,7 @@ If you consider introducing new exceptions, check out the test_exceptions addon. import logging from inspect import currentframe -from tools.func import frame_codeinfo +from .tools.func import frame_codeinfo _logger = logging.getLogger(__name__) diff --git a/odoo/fields.py b/odoo/fields.py index d713167a101..9a440651268 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -10,7 +10,11 @@ from operator import attrgetter from types import NoneType import logging import pytz -import xmlrpclib +try: + from xmlrpc.client import MAXINT +except ImportError: + #pylint: disable=bad-python3-import + from xmlrpclib import MAXINT import psycopg2 @@ -1168,7 +1172,7 @@ class Integer(Field): def convert_to_read(self, value, record, use_name_get=True): # Integer values greater than 2^31-1 are not supported in pure XMLRPC, # so we have to pass them as floats :-( - if value and value > xmlrpclib.MAXINT: + if value and value > MAXINT: return float(value) return value diff --git a/odoo/http.py b/odoo/http.py index 9eb9e75e101..210361fce1b 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -20,8 +20,12 @@ import sys import threading import time import traceback -import urllib2 -import urlparse +try: + from urllib.parse import parse_qs, urlparse, quote +except ImportError: + # pylint: disable=bad-python3-import + from urllib2 import quote + from urlparse import parse_qs, urlparse import warnings from os.path import join as opj from zlib import adler32 @@ -344,7 +348,7 @@ class WebRequest(object): debug = self.httprequest.environ.get('HTTP_X_DEBUG_MODE') if not debug and self.httprequest.referrer: - debug = bool(urlparse.parse_qs(urlparse.urlparse(self.httprequest.referrer).query, keep_blank_values=True).get('debug')) + debug = bool(parse_qs(urlparse(self.httprequest.referrer).query, keep_blank_values=True).get('debug')) return debug @contextlib.contextmanager @@ -1250,7 +1254,7 @@ class DisableCacheMiddleware(object): def __call__(self, environ, start_response): def start_wrapped(status, headers): referer = environ.get('HTTP_REFERER', '') - parsed = urlparse.urlparse(referer) + parsed = urlparse(referer) debug = parsed.query.count('debug') >= 1 new_headers = [] @@ -1616,7 +1620,7 @@ def send_file(filepath_or_fp, mimetype=None, as_attachment=False, filename=None, def content_disposition(filename): filename = odoo.tools.ustr(filename) - escaped = urllib2.quote(filename.encode('utf8')) + escaped = quote(filename.encode('utf8')) browser = request.httprequest.user_agent.browser version = int((request.httprequest.user_agent.version or '0').split('.')[0]) if browser == 'msie' and version < 9: diff --git a/odoo/modules/graph.py b/odoo/modules/graph.py index 9a11949c508..d962ea78bdc 100644 --- a/odoo/modules/graph.py +++ b/odoo/modules/graph.py @@ -3,27 +3,12 @@ """ Modules dependency graph. """ -import os, sys, imp -from os.path import join as opj import itertools -import zipimport +import logging import odoo - -import odoo.osv as osv import odoo.tools as tools -import odoo.tools.osutil as osutil -from odoo.tools.translate import _ - -import zipfile -import odoo.release as release -import re -import base64 -from zipfile import PyZipFile, ZIP_DEFLATED -from cStringIO import StringIO - -import logging _logger = logging.getLogger(__name__) diff --git a/odoo/netsvc.py b/odoo/netsvc.py index b62f830eb9c..3832ae10cd6 100644 --- a/odoo/netsvc.py +++ b/odoo/netsvc.py @@ -6,15 +6,15 @@ import logging.handlers import os import platform import pprint -import release +from . import release import sys import threading import psycopg2 import odoo -import sql_db -import tools +from . import sql_db +from . import tools _logger = logging.getLogger(__name__) @@ -110,7 +110,7 @@ def init_logger(): logging.addLevelName(25, "INFO") - from tools.translate import resetlocale + from .tools.translate import resetlocale resetlocale() # create a format for log messages and dates diff --git a/odoo/osv/__init__.py b/odoo/osv/__init__.py index 80a43a61ec4..9399e4410fb 100644 --- a/odoo/osv/__init__.py +++ b/odoo/osv/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import osv +from . import osv diff --git a/odoo/service/__init__.py b/odoo/service/__init__.py index eecc801d801..5d61b35f0e4 100644 --- a/odoo/service/__init__.py +++ b/odoo/service/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import common -import db -import model -import report -import wsgi_server -import server +from . import common +from . import db +from . import model +from . import report +from . import wsgi_server +from . import server #.apidoc title: RPC Services diff --git a/odoo/service/common.py b/odoo/service/common.py index e79adcc2528..36f61b0cab5 100644 --- a/odoo/service/common.py +++ b/odoo/service/common.py @@ -6,7 +6,7 @@ import odoo.release import odoo.tools from odoo.tools.translate import _ -import security +from . import security _logger = logging.getLogger(__name__) diff --git a/odoo/service/model.py b/odoo/service/model.py index 33a7fb2b93f..9ceab82b452 100644 --- a/odoo/service/model.py +++ b/odoo/service/model.py @@ -14,7 +14,7 @@ from odoo.tools import pycompat from odoo.tools.translate import translate from odoo.tools.translate import _ -import security +from . import security _logger = logging.getLogger(__name__) diff --git a/odoo/service/report.py b/odoo/service/report.py index 42daa393e77..faac5521b99 100644 --- a/odoo/service/report.py +++ b/odoo/service/report.py @@ -10,7 +10,7 @@ import odoo.report from odoo import tools from odoo.exceptions import UserError -import security +from . import security _logger = logging.getLogger(__name__) diff --git a/odoo/service/wsgi_server.py b/odoo/service/wsgi_server.py index 3f4dc4b46ad..afcac829856 100644 --- a/odoo/service/wsgi_server.py +++ b/odoo/service/wsgi_server.py @@ -7,19 +7,17 @@ WSGI stack, common code. """ -import httplib -import urllib -import xmlrpclib -import StringIO - -import errno import logging -import platform -import socket import sys import threading import traceback +try: + from xmlrpc import client as xmlrpclib +except ImportError: + # pylint: disable=bad-python3-import + import xmlrpclib + import werkzeug.serving import werkzeug.contrib.fixers diff --git a/odoo/sql_db.py b/odoo/sql_db.py index 214dbfca96c..9a438d387de 100644 --- a/odoo/sql_db.py +++ b/odoo/sql_db.py @@ -12,8 +12,12 @@ from contextlib import contextmanager from functools import wraps import logging import time -import urlparse import uuid +try: + from urllib import parse as urlparse +except ImportError: + #pylint: disable=bad-python3-import + import urlparse import psycopg2 import psycopg2.extras @@ -48,8 +52,8 @@ for name, typeoid in types_mapping.items(): psycopg2.extensions.register_type(psycopg2.extensions.new_type((700, 701, 1700,), 'float', undecimalize)) -import tools -from tools.func import frame_codeinfo +from . import tools +from .tools.func import frame_codeinfo from datetime import timedelta import threading from inspect import currentframe diff --git a/odoo/tests/__init__.py b/odoo/tests/__init__.py index bdf699e6467..4b678c6f375 100644 --- a/odoo/tests/__init__.py +++ b/odoo/tests/__init__.py @@ -1,2 +1,2 @@ -import common -from common import * +from . import common +from .common import * diff --git a/odoo/tests/addons/test_translation_import/__init__.py b/odoo/tests/addons/test_translation_import/__init__.py index 89d26e2f597..a0fdc10fe11 100644 --- a/odoo/tests/addons/test_translation_import/__init__.py +++ b/odoo/tests/addons/test_translation_import/__init__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -import models +from . import models diff --git a/odoo/tests/common.py b/odoo/tests/common.py index 29bfdd79d0e..ce7be91ffd4 100644 --- a/odoo/tests/common.py +++ b/odoo/tests/common.py @@ -16,11 +16,16 @@ import threading import time import itertools import unittest -import urllib2 -import xmlrpclib from contextlib import contextmanager from datetime import datetime, timedelta from pprint import pformat +try: + from urllib import request as urllib2 + from xmlrpc import client as xmlrpclib +except ImportError: + # pylint: disable=bad-python3-import + import urllib2 + import xmlrpclib import werkzeug 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() |
