summaryrefslogtreecommitdiff
path: root/odoo/loglevels.py
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2016-09-02 15:58:39 +0200
committerRaphael Collet <rco@openerp.com>2016-09-02 17:28:12 +0200
commit9e64f9f9514194d74e166b032add8511182f2677 (patch)
tree5086710c04c6b923be18a6d1d97b3f0f3a2a9c4a /odoo/loglevels.py
parent11812b0b9e82b2b1b9041d8250ce01e7b4a5f7ee (diff)
[REF] openerp: move `openerp` to `odoo`
Diffstat (limited to 'odoo/loglevels.py')
-rw-r--r--odoo/loglevels.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/odoo/loglevels.py b/odoo/loglevels.py
new file mode 100644
index 00000000000..08dba7bfe00
--- /dev/null
+++ b/odoo/loglevels.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import sys
+
+LOG_NOTSET = 'notset'
+LOG_DEBUG = 'debug'
+LOG_INFO = 'info'
+LOG_WARNING = 'warn'
+LOG_ERROR = 'error'
+LOG_CRITICAL = 'critical'
+
+# TODO get_encodings, ustr and exception_to_unicode were originally from tools.misc.
+# There are here until we refactor tools so that this module doesn't depends on tools.
+
+def get_encodings(hint_encoding='utf-8'):
+ fallbacks = {
+ 'latin1': 'latin9',
+ 'iso-8859-1': 'iso8859-15',
+ 'cp1252': '1252',
+ }
+ if hint_encoding:
+ yield hint_encoding
+ if hint_encoding.lower() in fallbacks:
+ yield fallbacks[hint_encoding.lower()]
+
+ # some defaults (also taking care of pure ASCII)
+ for charset in ['utf8','latin1']:
+ if not hint_encoding or (charset.lower() != hint_encoding.lower()):
+ yield charset
+
+ from locale import getpreferredencoding
+ prefenc = getpreferredencoding()
+ if prefenc and prefenc.lower() != 'utf-8':
+ yield prefenc
+ prefenc = fallbacks.get(prefenc.lower())
+ if prefenc:
+ yield prefenc
+
+def ustr(value, hint_encoding='utf-8', errors='strict'):
+ """This method is similar to the builtin `unicode`, except
+ that it may try multiple encodings to find one that works
+ for decoding `value`, and defaults to 'utf-8' first.
+
+ :param: value: the value to convert
+ :param: hint_encoding: an optional encoding that was detecte
+ upstream and should be tried first to decode ``value``.
+ :param str errors: optional `errors` flag to pass to the unicode
+ built-in to indicate how illegal character values should be
+ treated when converting a string: 'strict', 'ignore' or 'replace'
+ (see ``unicode()`` constructor).
+ Passing anything other than 'strict' means that the first
+ encoding tried will be used, even if it's not the correct
+ one to use, so be careful! Ignored if value is not a string/unicode.
+ :raise: UnicodeError if value cannot be coerced to unicode
+ :return: unicode string representing the given value
+ """
+ # We use direct type comparison instead of `isinstance`
+ # as much as possible, in order to make the most common
+ # cases faster (isinstance/issubclass are significantly slower)
+ ttype = type(value)
+
+ if ttype is unicode:
+ return value
+
+ # special short-circuit for str, as we still needs to support
+ # str subclasses such as `openerp.tools.unquote`
+ if ttype is str or issubclass(ttype, str):
+
+ # try hint_encoding first, avoids call to get_encoding()
+ # for the most common case
+ try:
+ return unicode(value, hint_encoding, errors=errors)
+ except Exception:
+ pass
+
+ # rare: no luck with hint_encoding, attempt other ones
+ for ln in get_encodings(hint_encoding):
+ try:
+ return unicode(value, ln, errors=errors)
+ except Exception:
+ pass
+
+ if isinstance(value, Exception):
+ return exception_to_unicode(value)
+
+ # fallback for non-string values
+ try:
+ return unicode(value)
+ except Exception:
+ raise UnicodeError('unable to convert %r' % (value,))
+
+
+def exception_to_unicode(e):
+ if (sys.version_info[:2] < (2,6)) and hasattr(e, 'message'):
+ return ustr(e.message)
+ if hasattr(e, 'args'):
+ return "\n".join((ustr(a) for a in e.args))
+ try:
+ return unicode(e)
+ except Exception:
+ return u"Unknown message"