unzer 1.0.0.dev2__tar.gz → 1.0.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/PKG-INFO +1 -1
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/__init__.py +1 -1
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/client.py +5 -8
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/__init__.py +11 -10
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/address.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/base.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/basket.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/basketItem.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/customer.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/error.py +1 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/payment.py +22 -27
- unzer-1.0.0.dev4/src/unzer/model/payment_type/__init__.py +15 -0
- unzer-1.0.0.dev4/src/unzer/model/payment_type/abstract_paymenttype.py +53 -0
- {unzer-1.0.0.dev2/src/unzer/model → unzer-1.0.0.dev4/src/unzer/model/payment_type}/bancontact.py +8 -9
- unzer-1.0.0.dev4/src/unzer/model/payment_type/card.py +6 -0
- unzer-1.0.0.dev4/src/unzer/model/payment_type/ideal.py +6 -0
- unzer-1.0.0.dev4/src/unzer/model/payment_type/paypal.py +6 -0
- unzer-1.0.0.dev4/src/unzer/model/payment_type/sofort.py +6 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/paymentpage.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/webhook.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/utils.py +0 -3
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/PKG-INFO +1 -1
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/SOURCES.txt +8 -4
- unzer-1.0.0.dev2/src/unzer/model/abstract_paymenttype.py +0 -40
- unzer-1.0.0.dev2/src/unzer/model/card.py +0 -8
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/LICENSE +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/README.md +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/setup.cfg +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/setup.py +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/dependency_links.txt +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/requires.txt +0 -0
- {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/top_level.txt +0 -0
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
__author__ = "Sven Eberth"
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
3
|
-
|
|
4
1
|
import logging
|
|
5
2
|
import time
|
|
6
3
|
from types import NoneType
|
|
7
4
|
|
|
8
5
|
import requests
|
|
9
6
|
from urllib3.exceptions import TimeoutError
|
|
7
|
+
|
|
10
8
|
from . import __version__
|
|
11
9
|
from .model import *
|
|
12
|
-
from .model.abstract_paymenttype import PaymentType
|
|
13
10
|
from .model.basket import Basket
|
|
14
11
|
from .model.payment import PaymentGetResponse, PaymentRequest, PaymentResponse
|
|
15
12
|
from .model.paymentpage import PaymentPage, PaymentPageResponse
|
|
@@ -25,10 +22,10 @@ class UnzerClient:
|
|
|
25
22
|
|
|
26
23
|
def __init__(
|
|
27
24
|
self,
|
|
28
|
-
private_key:str,
|
|
29
|
-
public_key:str,
|
|
30
|
-
sandbox:bool=False,
|
|
31
|
-
language:str="en",
|
|
25
|
+
private_key: str,
|
|
26
|
+
public_key: str,
|
|
27
|
+
sandbox: bool = False,
|
|
28
|
+
language: str = "en",
|
|
32
29
|
):
|
|
33
30
|
super(UnzerClient, self).__init__()
|
|
34
31
|
self.private_key = private_key
|
|
@@ -1,25 +1,18 @@
|
|
|
1
|
-
__author__ = "Sven Eberth"
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
3
|
-
|
|
4
|
-
from .abstract_paymenttype import PaymentType
|
|
5
1
|
from .address import Address
|
|
6
|
-
from .bancontact import Bancontact
|
|
7
|
-
from .base import BaseModel
|
|
8
2
|
from .basket import Basket
|
|
9
3
|
from .basketItem import BasketItem
|
|
10
|
-
from .card import Card
|
|
11
4
|
from .customer import Customer
|
|
12
5
|
from .error import Error, ErrorResponse
|
|
13
|
-
from .payment import PaymentGetResponse, PaymentRequest, PaymentResponse,
|
|
6
|
+
from .payment import PaymentGetResponse, PaymentRequest, PaymentResponse, \
|
|
7
|
+
PaymentTransaction, PaymentTypes
|
|
8
|
+
from .payment_type import *
|
|
14
9
|
from .paymentpage import PaymentPage, PaymentPageResponse
|
|
15
10
|
from .webhook import Webhook
|
|
16
11
|
|
|
17
12
|
__all__ = [
|
|
18
13
|
"Address",
|
|
19
|
-
"Bancontact",
|
|
20
14
|
"Basket",
|
|
21
15
|
"BasketItem",
|
|
22
|
-
"Card",
|
|
23
16
|
"Customer",
|
|
24
17
|
"Error",
|
|
25
18
|
"ErrorResponse",
|
|
@@ -29,5 +22,13 @@ __all__ = [
|
|
|
29
22
|
"PaymentRequest",
|
|
30
23
|
"PaymentResponse",
|
|
31
24
|
"PaymentTransaction",
|
|
25
|
+
"PaymentTypes",
|
|
32
26
|
"Webhook",
|
|
27
|
+
# payment_types
|
|
28
|
+
"PaymentType",
|
|
29
|
+
"Bancontact",
|
|
30
|
+
"Card",
|
|
31
|
+
"Ideal",
|
|
32
|
+
"PayPal",
|
|
33
|
+
"Sofort",
|
|
33
34
|
]
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
__author__ = "Sven Eberth"
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
3
|
-
|
|
4
1
|
import datetime
|
|
5
2
|
import logging
|
|
6
3
|
|
|
@@ -8,6 +5,7 @@ import requests
|
|
|
8
5
|
|
|
9
6
|
logger = logging.getLogger("unzer-sdk")
|
|
10
7
|
|
|
8
|
+
|
|
11
9
|
class Error:
|
|
12
10
|
def __init__(self, code, merchantMessage, customerMessage, **kwargs):
|
|
13
11
|
self.code = code
|
|
@@ -1,35 +1,29 @@
|
|
|
1
|
-
__author__ = "Sven Eberth"
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
3
|
-
|
|
4
1
|
import datetime
|
|
2
|
+
import enum
|
|
5
3
|
import logging
|
|
6
4
|
import re
|
|
5
|
+
import typing as t
|
|
7
6
|
from types import NoneType
|
|
8
7
|
|
|
9
|
-
import unzer.client
|
|
10
|
-
from .abstract_paymenttype import PaymentType
|
|
11
8
|
from .base import BaseModel
|
|
12
9
|
from ..utils import parseBool, parseDateTime
|
|
13
10
|
|
|
11
|
+
if t.TYPE_CHECKING:
|
|
12
|
+
from ..client import UnzerClient
|
|
13
|
+
|
|
14
14
|
|
|
15
|
-
class TransactionStatus:
|
|
15
|
+
class TransactionStatus(enum.Enum):
|
|
16
16
|
SUCCESS = "success"
|
|
17
17
|
PENDING = "pending"
|
|
18
18
|
ERROR = "error"
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class Action:
|
|
21
|
+
class Action(enum.Enum):
|
|
25
22
|
CHARGE = "charge"
|
|
26
23
|
AUTHORIZE = "authorize"
|
|
27
24
|
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class PaymentState:
|
|
26
|
+
class PaymentState(enum.Enum):
|
|
33
27
|
PENDING = 0
|
|
34
28
|
COMPLETED = 1
|
|
35
29
|
CANCELED = 2
|
|
@@ -39,10 +33,7 @@ class PaymentState:
|
|
|
39
33
|
CREATE = 6
|
|
40
34
|
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class PaymentTypes:
|
|
36
|
+
class PaymentTypes(enum.Enum):
|
|
46
37
|
CARD = "crd"
|
|
47
38
|
EPS = "eps"
|
|
48
39
|
GIROPAY = "gro"
|
|
@@ -72,8 +63,6 @@ class PaymentTypes:
|
|
|
72
63
|
UNKNOWN = "unknown"
|
|
73
64
|
|
|
74
65
|
|
|
75
|
-
PaymentTypesInverted = {v: k for k, v in vars(PaymentTypes).items()}
|
|
76
|
-
|
|
77
66
|
paymentUrlRe = re.compile(
|
|
78
67
|
r"^https://api.unzer.com/v1/"
|
|
79
68
|
r"(?P<operation>[a-z]+)/(?P<paymentId>[\w-]+)" # payments/{codeOrOrderId}
|
|
@@ -105,7 +94,7 @@ class PaymentGetResponse(BaseModel):
|
|
|
105
94
|
linkPayId=None,
|
|
106
95
|
typeId=None,
|
|
107
96
|
|
|
108
|
-
client=None,
|
|
97
|
+
client: "UnzerClient" = None,
|
|
109
98
|
|
|
110
99
|
**kwargs
|
|
111
100
|
):
|
|
@@ -159,8 +148,9 @@ class PaymentGetResponse(BaseModel):
|
|
|
159
148
|
"""
|
|
160
149
|
if transactions is None:
|
|
161
150
|
transactions = []
|
|
162
|
-
|
|
163
|
-
|
|
151
|
+
state = PaymentState(state)
|
|
152
|
+
# if state not in vars(PaymentState).values():
|
|
153
|
+
# raise TypeError("Invalid state %r" % state)
|
|
164
154
|
if not isinstance(card3ds, (bool, NoneType)):
|
|
165
155
|
raise TypeError("Invalid value %r for card3ds. Must be a boolean or None." % card3ds)
|
|
166
156
|
self.paymentId = paymentId # type:str
|
|
@@ -185,7 +175,7 @@ class PaymentGetResponse(BaseModel):
|
|
|
185
175
|
self.linkPayId = linkPayId # type: str
|
|
186
176
|
self.typeId = typeId # type: str
|
|
187
177
|
|
|
188
|
-
self._client = client
|
|
178
|
+
self._client: "UnzerClient" = client
|
|
189
179
|
|
|
190
180
|
def serialize(self):
|
|
191
181
|
raise NotImplementedError("No serialisation for response models.")
|
|
@@ -227,15 +217,17 @@ class PaymentGetResponse(BaseModel):
|
|
|
227
217
|
return transactions
|
|
228
218
|
|
|
229
219
|
@staticmethod
|
|
230
|
-
def getPaymentTypeFromTypeId(typeId):
|
|
220
|
+
def getPaymentTypeFromTypeId(typeId) -> PaymentTypes:
|
|
231
221
|
if not typeId:
|
|
232
222
|
raise ValueError("Invalid typeId %r" % typeId) # TODO: or return PaymentTypes.UNKNOWN?
|
|
233
223
|
paymentType = typeId.split("-")[1].lower()
|
|
234
|
-
|
|
224
|
+
try:
|
|
225
|
+
paymentType = PaymentTypes(paymentType)
|
|
226
|
+
except ValueError:
|
|
235
227
|
raise ValueError("Invalid type %r" % typeId) # TODO: or return PaymentTypes.UNKNOWN?
|
|
236
228
|
return paymentType
|
|
237
229
|
|
|
238
|
-
def charge(self, amount
|
|
230
|
+
def charge(self, amount: float) -> "PaymentResponse":
|
|
239
231
|
req_kwargs = self.__dict__.copy()
|
|
240
232
|
req_kwargs["paymentType"] = PaymentType.construct(self.paymentType)(self.typeId)
|
|
241
233
|
req_kwargs["amount"] = amount
|
|
@@ -652,3 +644,6 @@ class PaymentResponseMetadata(BaseModel):
|
|
|
652
644
|
# Nobody, really nobody starts identifier with a digit. Unzer: here you have the 3dsEci flag
|
|
653
645
|
data["threeDsEci"] = data["3dsEci"] if "3dsEci" in data else None
|
|
654
646
|
return cls(**data)
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
from unzer.model.payment_type.abstract_paymenttype import PaymentType # noqa: Avoid circular imports
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from .abstract_paymenttype import PaymentType
|
|
2
|
+
from .bancontact import Bancontact
|
|
3
|
+
from .card import Card
|
|
4
|
+
from .ideal import Ideal
|
|
5
|
+
from .paypal import PayPal
|
|
6
|
+
from .sofort import Sofort
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"PaymentType",
|
|
10
|
+
"Bancontact",
|
|
11
|
+
"Card",
|
|
12
|
+
"Ideal",
|
|
13
|
+
"PayPal",
|
|
14
|
+
"Sofort",
|
|
15
|
+
]
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import logging
|
|
3
|
+
import typing as t
|
|
4
|
+
|
|
5
|
+
from ..base import BaseModel
|
|
6
|
+
|
|
7
|
+
if t.TYPE_CHECKING:
|
|
8
|
+
from .. import PaymentTypes
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger("unzer-sdk").getChild(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PaymentType(BaseModel):
|
|
14
|
+
@property
|
|
15
|
+
@abc.abstractmethod
|
|
16
|
+
def method(self) -> "PaymentTypes":
|
|
17
|
+
"""Hold the type."""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
key: str = None,
|
|
23
|
+
**kwargs
|
|
24
|
+
):
|
|
25
|
+
"""Create a new paymentType ressource.
|
|
26
|
+
|
|
27
|
+
:param key: (optional) (original: id) ID for this payment type
|
|
28
|
+
"""
|
|
29
|
+
self.key: str = key
|
|
30
|
+
|
|
31
|
+
def serialize(self) -> dict:
|
|
32
|
+
return {}
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def fromDict(cls, data: dict) -> t.Self:
|
|
36
|
+
data = data.copy()
|
|
37
|
+
data["key"] = data["id"]
|
|
38
|
+
return cls(**data)
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def get_subclasses(cls) -> t.Type[t.Self]:
|
|
42
|
+
for subclass in cls.__subclasses__():
|
|
43
|
+
yield from subclass.get_subclasses()
|
|
44
|
+
yield subclass
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def construct(cls, method: "PaymentTypes") -> t.Type["PaymentType"]:
|
|
48
|
+
for subclass in PaymentType.get_subclasses():
|
|
49
|
+
if subclass.method == method:
|
|
50
|
+
return subclass
|
|
51
|
+
logger.warning(f"Creating not existing PaymentType for method {method} on the fly")
|
|
52
|
+
sub_cls = type(str(method).title(), (cls,), {"method": method})
|
|
53
|
+
return sub_cls # noqa
|
{unzer-1.0.0.dev2/src/unzer/model → unzer-1.0.0.dev4/src/unzer/model/payment_type}/bancontact.py
RENAMED
|
@@ -1,34 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
1
|
+
import typing as t
|
|
3
2
|
|
|
3
|
+
from unzer.model.payment import PaymentTypes
|
|
4
4
|
from .abstract_paymenttype import PaymentType
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class Bancontact(PaymentType):
|
|
8
|
-
method =
|
|
8
|
+
method = PaymentTypes.BANCONTACT
|
|
9
9
|
|
|
10
10
|
REQUIRED_ATTRIBUTES = ["holder"]
|
|
11
11
|
|
|
12
12
|
def __init__(
|
|
13
13
|
self,
|
|
14
|
-
holder,
|
|
14
|
+
holder: str,
|
|
15
15
|
**kwargs
|
|
16
16
|
):
|
|
17
17
|
"""Create a new Bancontact paymentType ressource.
|
|
18
18
|
|
|
19
19
|
:param holder: The holder name.
|
|
20
|
-
:type holder: str
|
|
21
20
|
"""
|
|
22
|
-
super(
|
|
23
|
-
self.holder = holder
|
|
21
|
+
super().__init__(**kwargs)
|
|
22
|
+
self.holder: str = holder
|
|
24
23
|
|
|
25
|
-
def serialize(self):
|
|
24
|
+
def serialize(self) -> dict:
|
|
26
25
|
return {
|
|
27
26
|
"holder": self.holder,
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
@classmethod
|
|
31
|
-
def fromDict(cls, data):
|
|
30
|
+
def fromDict(cls, data: dict) -> t.Self:
|
|
32
31
|
data = data.copy()
|
|
33
32
|
data["key"] = data["id"]
|
|
34
33
|
return cls(**data)
|
|
@@ -11,15 +11,19 @@ src/unzer.egg-info/dependency_links.txt
|
|
|
11
11
|
src/unzer.egg-info/requires.txt
|
|
12
12
|
src/unzer.egg-info/top_level.txt
|
|
13
13
|
src/unzer/model/__init__.py
|
|
14
|
-
src/unzer/model/abstract_paymenttype.py
|
|
15
14
|
src/unzer/model/address.py
|
|
16
|
-
src/unzer/model/bancontact.py
|
|
17
15
|
src/unzer/model/base.py
|
|
18
16
|
src/unzer/model/basket.py
|
|
19
17
|
src/unzer/model/basketItem.py
|
|
20
|
-
src/unzer/model/card.py
|
|
21
18
|
src/unzer/model/customer.py
|
|
22
19
|
src/unzer/model/error.py
|
|
23
20
|
src/unzer/model/payment.py
|
|
24
21
|
src/unzer/model/paymentpage.py
|
|
25
|
-
src/unzer/model/webhook.py
|
|
22
|
+
src/unzer/model/webhook.py
|
|
23
|
+
src/unzer/model/payment_type/__init__.py
|
|
24
|
+
src/unzer/model/payment_type/abstract_paymenttype.py
|
|
25
|
+
src/unzer/model/payment_type/bancontact.py
|
|
26
|
+
src/unzer/model/payment_type/card.py
|
|
27
|
+
src/unzer/model/payment_type/ideal.py
|
|
28
|
+
src/unzer/model/payment_type/paypal.py
|
|
29
|
+
src/unzer/model/payment_type/sofort.py
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
__author__ = "Sven Eberth"
|
|
2
|
-
__email__ = "se@mausbrand.de"
|
|
3
|
-
|
|
4
|
-
import abc
|
|
5
|
-
|
|
6
|
-
from .base import BaseModel
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PaymentType(BaseModel):
|
|
10
|
-
@property
|
|
11
|
-
@abc.abstractmethod
|
|
12
|
-
def method(self):
|
|
13
|
-
"""Hold the type as str."""
|
|
14
|
-
pass
|
|
15
|
-
|
|
16
|
-
def __init__(
|
|
17
|
-
self,
|
|
18
|
-
key=None,
|
|
19
|
-
**kwargs
|
|
20
|
-
):
|
|
21
|
-
"""Create a new paymentType ressource.
|
|
22
|
-
|
|
23
|
-
:param key: (optional) (original: id) ID for this payment type
|
|
24
|
-
:type key: str
|
|
25
|
-
"""
|
|
26
|
-
self.key = key # type: str
|
|
27
|
-
|
|
28
|
-
def serialize(self):
|
|
29
|
-
return {}
|
|
30
|
-
|
|
31
|
-
@classmethod
|
|
32
|
-
def fromDict(cls, data):
|
|
33
|
-
data = data.copy()
|
|
34
|
-
data["key"] = data["id"]
|
|
35
|
-
return cls(**data)
|
|
36
|
-
|
|
37
|
-
@classmethod
|
|
38
|
-
def construct(cls, method):
|
|
39
|
-
sub_cls = type(str(method).title(), (cls,), {"method": method})
|
|
40
|
-
return sub_cls
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|