diff --git a/eopayment/__init__.py b/eopayment/__init__.py index 7a15cbc..fbd0e55 100644 --- a/eopayment/__init__.py +++ b/eopayment/__init__.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- +import importlib import logging -from common import (URL, HTML, FORM, RECEIVED, ACCEPTED, PAID, DENIED, - CANCELED, CANCELLED, ERROR, WAITING, ResponseError, force_text) +from .common import (URL, HTML, FORM, RECEIVED, ACCEPTED, PAID, DENIED, + CANCELED, CANCELLED, ERROR, WAITING, ResponseError, force_text) __all__ = ['Payment', 'URL', 'HTML', 'FORM', 'SIPS', 'SYSTEMPAY', 'SPPLUS', 'TIPI', 'DUMMY', 'get_backend', 'RECEIVED', 'ACCEPTED', @@ -23,7 +24,7 @@ logger = logging.getLogger(__name__) def get_backend(kind): '''Resolve a backend name into a module object''' - module = __import__(kind, globals(), locals(), []) + module = importlib.import_module('.' + kind, package='eopayment') return module.Payment __BACKENDS = [ DUMMY, SIPS, SIPS2, SYSTEMPAY, SPPLUS, OGONE, PAYBOX, PAYZEN, TIPI ] diff --git a/eopayment/common.py b/eopayment/common.py index ac37e77..258f856 100644 --- a/eopayment/common.py +++ b/eopayment/common.py @@ -2,9 +2,15 @@ import os.path import os import random import logging -import cgi from datetime import date +import six + +if six.PY3: + import html +else: + import cgi + __all__ = ['PaymentCommon', 'URL', 'HTML', 'RANDOM', 'RECEIVED', 'ACCEPTED', 'PAID', 'ERROR', 'WAITING'] @@ -29,15 +35,27 @@ ORDERID_TRANSACTION_SEPARATOR = '!' def force_text(s, encoding='utf-8'): - if isinstance(s, unicode): + if issubclass(type(s), six.text_type): return s try: - return unicode(s, encoding) + if not issubclass(type(s), six.string_types): + if six.PY3: + if isinstance(s, bytes): + s = six.text_type(s, encoding) + else: + s = six.text_type(s) + elif hasattr(s, '__unicode__'): + s = six.text_type(s) + else: + s = six.text_type(bytes(s), encoding) + else: + s = s.decode(encoding) except UnicodeDecodeError: - return unicode(s) + return six.text_type(s, encoding, 'ignore') + return s def force_byte(s, encoding='utf-8'): - if isinstance(s, str): + if isinstance(s, bytes): return s try: return s.encode(encoding) @@ -148,7 +166,10 @@ class Form(object): return s def escape(self, s): - return cgi.escape(force_text(s, self.encoding).encode(self.encoding)) + if six.PY3: + return html.escape(force_text(s, self.encoding)) + else: + return cgi.escape(force_text(s, self.encoding)).encode(self.encoding) def __str__(self): s = '