paddle-python-sdk 0.3.2__py3-none-any.whl → 1.2.1__py3-none-any.whl

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.
Files changed (145) hide show
  1. paddle_billing/Client.py +11 -13
  2. paddle_billing/Entities/Collections/PaymentMethodCollection.py +13 -0
  3. paddle_billing/Entities/Collections/__init__.py +1 -0
  4. paddle_billing/Entities/CustomerAuthToken.py +18 -0
  5. paddle_billing/Entities/CustomerPortalSession.py +23 -0
  6. paddle_billing/Entities/CustomerPortalSessions/CustomerPortalSessionGeneralUrl.py +13 -0
  7. paddle_billing/Entities/CustomerPortalSessions/CustomerPortalSessionSubscriptionUrl.py +17 -0
  8. paddle_billing/Entities/CustomerPortalSessions/CustomerPortalSessionUrls.py +24 -0
  9. paddle_billing/Entities/CustomerPortalSessions/__init__.py +7 -0
  10. paddle_billing/Entities/NotificationSetting.py +3 -1
  11. paddle_billing/Entities/NotificationSettings/NotificationSettingTrafficSource.py +7 -0
  12. paddle_billing/Entities/NotificationSettings/__init__.py +3 -0
  13. paddle_billing/Entities/PaymentMethod.py +38 -0
  14. paddle_billing/Entities/Price.py +0 -4
  15. paddle_billing/Entities/Reports/ReportFilter.py +1 -4
  16. paddle_billing/Entities/Shared/CustomData.py +0 -3
  17. paddle_billing/Entities/Shared/Paypal.py +15 -0
  18. paddle_billing/Entities/Shared/SavedPaymentMethodOrigin.py +6 -0
  19. paddle_billing/Entities/Shared/SavedPaymentMethodType.py +9 -0
  20. paddle_billing/Entities/Shared/TransactionLineItemPreview.py +5 -5
  21. paddle_billing/Entities/Shared/TransactionPreviewProduct.py +37 -0
  22. paddle_billing/Entities/Shared/__init__.py +3 -0
  23. paddle_billing/Entities/Subscriptions/SubscriptionAdjustmentItem.py +2 -2
  24. paddle_billing/Entities/Subscriptions/__init__.py +0 -8
  25. paddle_billing/Entities/Transactions/TransactionItem.py +0 -2
  26. paddle_billing/Entities/Transactions/TransactionItemPreviewWithPrice.py +3 -3
  27. paddle_billing/Entities/Transactions/TransactionPreviewPrice.py +59 -0
  28. paddle_billing/Entities/Transactions/__init__.py +0 -12
  29. paddle_billing/Notifications/Entities/Entity.py +3 -1
  30. paddle_billing/Notifications/Entities/PaymentMethod.py +32 -0
  31. paddle_billing/Notifications/Entities/PaymentMethodDeleted.py +35 -0
  32. paddle_billing/Notifications/Entities/Price.py +0 -4
  33. paddle_billing/Notifications/Entities/Reports/ReportFilter.py +1 -4
  34. paddle_billing/Notifications/Entities/Shared/CustomData.py +1 -1
  35. paddle_billing/Notifications/Entities/Shared/Paypal.py +15 -0
  36. paddle_billing/Notifications/Entities/Shared/SavedPaymentMethodDeletionReason.py +6 -0
  37. paddle_billing/Notifications/Entities/Shared/SavedPaymentMethodOrigin.py +6 -0
  38. paddle_billing/Notifications/Entities/Shared/SavedPaymentMethodType.py +9 -0
  39. paddle_billing/Notifications/Entities/Shared/__init__.py +6 -0
  40. paddle_billing/Notifications/Entities/Subscription.py +1 -1
  41. paddle_billing/Notifications/Entities/SubscriptionCreated.py +1 -1
  42. paddle_billing/Notifications/Events/PaymentMethodDeleted.py +17 -0
  43. paddle_billing/Notifications/Events/PaymentMethodSaved.py +17 -0
  44. paddle_billing/Resources/Addresses/AddressesClient.py +2 -4
  45. paddle_billing/Resources/Addresses/Operations/CreateAddress.py +3 -5
  46. paddle_billing/Resources/Addresses/Operations/UpdateAddress.py +3 -5
  47. paddle_billing/Resources/Adjustments/AdjustmentsClient.py +1 -1
  48. paddle_billing/Resources/Adjustments/Operations/CreateAdjustment.py +3 -18
  49. paddle_billing/Resources/Businesses/BusinessesClient.py +2 -4
  50. paddle_billing/Resources/Businesses/Operations/CreateBusiness.py +3 -5
  51. paddle_billing/Resources/Businesses/Operations/UpdateBusiness.py +3 -5
  52. paddle_billing/Resources/CustomerPortalSessions/CustomerPortalSessionsClient.py +24 -0
  53. paddle_billing/Resources/CustomerPortalSessions/Operations/CreateCustomerPortalSession.py +9 -0
  54. paddle_billing/Resources/CustomerPortalSessions/Operations/__init__.py +3 -0
  55. paddle_billing/Resources/CustomerPortalSessions/__init__.py +0 -0
  56. paddle_billing/Resources/Customers/CustomersClient.py +14 -3
  57. paddle_billing/Resources/Customers/Operations/CreateCustomer.py +3 -5
  58. paddle_billing/Resources/Customers/Operations/UpdateCustomer.py +3 -5
  59. paddle_billing/Resources/Discounts/DiscountsClient.py +2 -2
  60. paddle_billing/Resources/Discounts/Operations/CreateDiscount.py +5 -6
  61. paddle_billing/Resources/Discounts/Operations/UpdateDiscount.py +5 -6
  62. paddle_billing/Resources/NotificationSettings/NotificationSettingsClient.py +2 -4
  63. paddle_billing/Resources/NotificationSettings/Operations/CreateNotificationSetting.py +5 -6
  64. paddle_billing/Resources/NotificationSettings/Operations/ListNotificationSettings.py +6 -0
  65. paddle_billing/Resources/NotificationSettings/Operations/UpdateNotificationSetting.py +5 -5
  66. paddle_billing/Resources/Notifications/NotificationsClient.py +1 -1
  67. paddle_billing/Resources/PaymentMethods/Operations/ListPaymentMethods.py +32 -0
  68. paddle_billing/Resources/PaymentMethods/Operations/__init__.py +1 -0
  69. paddle_billing/Resources/PaymentMethods/PaymentMethodsClient.py +45 -0
  70. paddle_billing/Resources/PaymentMethods/__init__.py +0 -0
  71. paddle_billing/Resources/Prices/Operations/CreatePrice.py +3 -5
  72. paddle_billing/Resources/Prices/Operations/UpdatePrice.py +3 -5
  73. paddle_billing/Resources/Prices/PricesClient.py +2 -2
  74. paddle_billing/Resources/PricingPreviews/Operations/PreviewPrice.py +3 -5
  75. paddle_billing/Resources/PricingPreviews/PricingPreviewsClient.py +1 -1
  76. paddle_billing/Resources/Products/Operations/CreateProduct.py +3 -5
  77. paddle_billing/Resources/Products/Operations/UpdateProduct.py +3 -5
  78. paddle_billing/Resources/Products/ProductsClient.py +2 -2
  79. paddle_billing/Resources/Reports/Operations/CreateReport.py +5 -3
  80. paddle_billing/Resources/Reports/Operations/Filters/Filter.py +1 -1
  81. paddle_billing/Resources/Reports/ReportsClient.py +1 -1
  82. paddle_billing/Resources/Subscriptions/Operations/CancelSubscription.py +3 -5
  83. paddle_billing/{Entities/Transactions/TransactionUpdateTransactionItem.py → Resources/Subscriptions/Operations/Charge/SubscriptionChargeItem.py} +1 -1
  84. paddle_billing/Resources/Subscriptions/Operations/Charge/SubscriptionChargeItemWithPrice.py +13 -0
  85. paddle_billing/Resources/Subscriptions/Operations/Charge/__init__.py +4 -0
  86. paddle_billing/Resources/Subscriptions/Operations/CreateOneTimeCharge.py +9 -8
  87. paddle_billing/Resources/Subscriptions/Operations/PauseSubscription.py +3 -8
  88. paddle_billing/Resources/Subscriptions/Operations/PreviewOneTimeCharge.py +9 -8
  89. paddle_billing/Resources/Subscriptions/Operations/PreviewUpdateSubscription.py +3 -3
  90. paddle_billing/Resources/Subscriptions/Operations/Price/SubscriptionNonCatalogPrice.py +24 -0
  91. paddle_billing/Resources/Subscriptions/Operations/Price/SubscriptionNonCatalogPriceWithProduct.py +28 -0
  92. paddle_billing/Resources/Subscriptions/Operations/Price/SubscriptionNonCatalogProduct.py +15 -0
  93. paddle_billing/Resources/Subscriptions/Operations/Price/__init__.py +9 -0
  94. paddle_billing/Resources/Subscriptions/Operations/ResumeSubscription.py +2 -8
  95. paddle_billing/Resources/Subscriptions/Operations/Update/SubscriptionUpdateItem.py +9 -0
  96. paddle_billing/Resources/Subscriptions/Operations/Update/SubscriptionUpdateItemWithPrice.py +13 -0
  97. paddle_billing/Resources/Subscriptions/Operations/Update/__init__.py +4 -0
  98. paddle_billing/Resources/Subscriptions/Operations/UpdateSubscription.py +3 -3
  99. paddle_billing/Resources/Subscriptions/SubscriptionsClient.py +5 -7
  100. paddle_billing/Resources/Transactions/Operations/Create/TransactionCreateItem.py +8 -0
  101. paddle_billing/{Entities/Transactions → Resources/Transactions/Operations/Create}/TransactionCreateItemWithPrice.py +2 -2
  102. paddle_billing/Resources/Transactions/Operations/Create/__init__.py +4 -0
  103. paddle_billing/Resources/Transactions/Operations/CreateTransaction.py +5 -2
  104. paddle_billing/Resources/Transactions/Operations/Preview/TransactionItemPreviewWithNonCatalogPrice.py +15 -0
  105. paddle_billing/Resources/Transactions/Operations/Preview/TransactionItemPreviewWithPriceId.py +10 -0
  106. paddle_billing/Resources/Transactions/Operations/Preview/__init__.py +6 -0
  107. paddle_billing/Resources/Transactions/Operations/PreviewTransactionByAddress.py +4 -6
  108. paddle_billing/Resources/Transactions/Operations/PreviewTransactionByCustomer.py +4 -6
  109. paddle_billing/Resources/Transactions/Operations/PreviewTransactionByIP.py +4 -6
  110. paddle_billing/Resources/Transactions/Operations/Price/TransactionNonCatalogPrice.py +24 -0
  111. paddle_billing/Resources/Transactions/Operations/Price/TransactionNonCatalogPriceWithProduct.py +28 -0
  112. paddle_billing/Resources/Transactions/Operations/Price/TransactionNonCatalogProduct.py +15 -0
  113. paddle_billing/Resources/Transactions/Operations/Price/__init__.py +7 -0
  114. paddle_billing/Resources/Transactions/Operations/Update/TransactionUpdateItem.py +8 -0
  115. paddle_billing/Resources/Transactions/Operations/Update/TransactionUpdateItemWithPrice.py +13 -0
  116. paddle_billing/Resources/Transactions/Operations/Update/__init__.py +4 -0
  117. paddle_billing/Resources/Transactions/Operations/UpdateTransaction.py +6 -3
  118. paddle_billing/Resources/Transactions/TransactionsClient.py +1 -1
  119. {paddle_python_sdk-0.3.2.dist-info → paddle_python_sdk-1.2.1.dist-info}/METADATA +10 -10
  120. {paddle_python_sdk-0.3.2.dist-info → paddle_python_sdk-1.2.1.dist-info}/RECORD +133 -93
  121. {paddle_python_sdk-0.3.2.dist-info → paddle_python_sdk-1.2.1.dist-info}/WHEEL +1 -1
  122. tests/Functional/Resources/CustomerPortalSessions/__init__.py +0 -0
  123. tests/Functional/Resources/CustomerPortalSessions/test_CustomerPortalSessionsClient.py +143 -0
  124. tests/Functional/Resources/Customers/test_CustomersClient.py +34 -0
  125. tests/Functional/Resources/Discounts/test_DiscountsClient.py +3 -2
  126. tests/Functional/Resources/NotificationSettings/test_NotificationSettingsClient.py +127 -1
  127. tests/Functional/Resources/Notifications/test_NotificationsClient.py +2 -2
  128. tests/Functional/Resources/PaymentMethods/__init__.py +0 -0
  129. tests/Functional/Resources/PaymentMethods/test_PaymentMethodsClient.py +289 -0
  130. tests/Functional/Resources/Subscriptions/test_SubscriptionsClient.py +273 -75
  131. tests/Functional/Resources/Transactions/test_TransactionsClient.py +233 -13
  132. paddle_billing/Entities/Subscriptions/SubscriptionItems.py +0 -18
  133. paddle_billing/Entities/Subscriptions/SubscriptionItemsWithPrice.py +0 -23
  134. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogPrice.py +0 -33
  135. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogPriceWithProduct.py +0 -35
  136. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogProduct.py +0 -25
  137. paddle_billing/Entities/Subscriptions/SubscriptionUpdateItem.py +0 -15
  138. paddle_billing/Entities/Transactions/TransactionCreateItem.py +0 -15
  139. paddle_billing/Entities/Transactions/TransactionItemPreviewWithNonCatalogPrice.py +0 -29
  140. paddle_billing/Entities/Transactions/TransactionItemPreviewWithPriceId.py +0 -17
  141. paddle_billing/Entities/Transactions/TransactionNonCatalogPrice.py +0 -38
  142. paddle_billing/Entities/Transactions/TransactionNonCatalogPriceWithProduct.py +0 -40
  143. paddle_billing/Entities/Transactions/TransactionNonCatalogProduct.py +0 -24
  144. {paddle_python_sdk-0.3.2.dist-info → paddle_python_sdk-1.2.1.dist-info}/LICENSE +0 -0
  145. {paddle_python_sdk-0.3.2.dist-info → paddle_python_sdk-1.2.1.dist-info}/top_level.txt +0 -0
paddle_billing/Client.py CHANGED
@@ -20,6 +20,7 @@ from paddle_billing.Resources.Addresses.AddressesClient import AddressesClient
20
20
  from paddle_billing.Resources.Adjustments.AdjustmentsClient import AdjustmentsClient
21
21
  from paddle_billing.Resources.Businesses.BusinessesClient import BusinessesClient
22
22
  from paddle_billing.Resources.Customers.CustomersClient import CustomersClient
23
+ from paddle_billing.Resources.CustomerPortalSessions.CustomerPortalSessionsClient import CustomerPortalSessionsClient
23
24
  from paddle_billing.Resources.Discounts.DiscountsClient import DiscountsClient
24
25
  from paddle_billing.Resources.Events.EventsClient import EventsClient
25
26
  from paddle_billing.Resources.EventTypes.EventTypesClient import EventTypesClient
@@ -27,6 +28,7 @@ from paddle_billing.Resources.IPAddresses.IPAddressesClient import IPAddressesCl
27
28
  from paddle_billing.Resources.Notifications.NotificationsClient import NotificationsClient
28
29
  from paddle_billing.Resources.NotificationLogs.NotificationLogsClient import NotificationLogsClient
29
30
  from paddle_billing.Resources.NotificationSettings.NotificationSettingsClient import NotificationSettingsClient
31
+ from paddle_billing.Resources.PaymentMethods.PaymentMethodsClient import PaymentMethodsClient
30
32
  from paddle_billing.Resources.Prices.PricesClient import PricesClient
31
33
  from paddle_billing.Resources.PricingPreviews.PricingPreviewsClient import PricingPreviewsClient
32
34
  from paddle_billing.Resources.Products.ProductsClient import ProductsClient
@@ -37,6 +39,12 @@ from paddle_billing.Resources.Transactions.TransactionsClient import Transaction
37
39
 
38
40
  class PayloadEncoder(JSONEncoder):
39
41
  def default(self, z):
42
+ if isinstance(z, Undefined):
43
+ return None
44
+
45
+ if hasattr(z, "to_json") and callable(z.to_json):
46
+ return z.to_json()
47
+
40
48
  if is_dataclass(z):
41
49
  data = {}
42
50
  for field in fields(z):
@@ -44,12 +52,6 @@ class PayloadEncoder(JSONEncoder):
44
52
 
45
53
  return FiltersUndefined.filter_undefined_values(data)
46
54
 
47
- if isinstance(z, Undefined):
48
- return None
49
-
50
- if hasattr(z, "to_json") and callable(z.to_json):
51
- return z.to_json()
52
-
53
55
  return super().default(z)
54
56
 
55
57
 
@@ -84,12 +86,14 @@ class Client:
84
86
  self.adjustments = AdjustmentsClient(self)
85
87
  self.businesses = BusinessesClient(self)
86
88
  self.customers = CustomersClient(self)
89
+ self.customer_portal_sessions = CustomerPortalSessionsClient(self)
87
90
  self.discounts = DiscountsClient(self)
88
91
  self.events = EventsClient(self)
89
92
  self.event_types = EventTypesClient(self)
90
93
  self.notifications = NotificationsClient(self)
91
94
  self.notification_logs = NotificationLogsClient(self)
92
95
  self.notification_settings = NotificationSettingsClient(self)
96
+ self.payment_methods = PaymentMethodsClient(self)
93
97
  self.prices = PricesClient(self)
94
98
  self.pricing_previews = PricingPreviewsClient(self)
95
99
  self.products = ProductsClient(self)
@@ -183,17 +187,11 @@ class Client:
183
187
  def post_raw(
184
188
  self, url: str, payload: dict | Operation | None = None, parameters: HasParameters | dict | None = None
185
189
  ) -> Response:
186
- if isinstance(payload, dict):
187
- payload = FiltersUndefined.filter_undefined_values(payload) # Strip Undefined items from the dict
188
-
189
190
  url = Client.format_uri_parameters(url, parameters) if parameters else url
190
191
 
191
192
  return self._make_request("POST", url, payload)
192
193
 
193
194
  def patch_raw(self, url: str, payload: dict | Operation | None) -> Response:
194
- if isinstance(payload, dict):
195
- payload = FiltersUndefined.filter_undefined_values(payload) # Strip Undefined items from the dict
196
-
197
195
  return self._make_request("PATCH", url, payload)
198
196
 
199
197
  def delete_raw(self, url: str) -> Response:
@@ -206,7 +204,7 @@ class Client:
206
204
  "Authorization": f"Bearer {self.__api_key}",
207
205
  "Content-Type": "application/json",
208
206
  "Paddle-Version": str(self.use_api_version),
209
- "User-Agent": "PaddleSDK/python 0.3.2",
207
+ "User-Agent": "PaddleSDK/python 1.2.1",
210
208
  }
211
209
  )
212
210
 
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+
3
+ from paddle_billing.Entities.Collections.Collection import Collection
4
+ from paddle_billing.Entities.Collections.Paginator import Paginator
5
+ from paddle_billing.Entities.PaymentMethod import PaymentMethod
6
+
7
+
8
+ class PaymentMethodCollection(Collection[PaymentMethod]):
9
+ @classmethod
10
+ def from_list(cls, items_data: list, paginator: Paginator | None = None) -> PaymentMethodCollection:
11
+ items: list[PaymentMethod] = [PaymentMethod.from_dict(item) for item in items_data]
12
+
13
+ return PaymentMethodCollection(items, paginator)
@@ -11,6 +11,7 @@ from paddle_billing.Entities.Collections.NotificationCollection import Notificat
11
11
  from paddle_billing.Entities.Collections.NotificationLogCollection import NotificationLogCollection
12
12
  from paddle_billing.Entities.Collections.NotificationSettingCollection import NotificationSettingCollection
13
13
  from paddle_billing.Entities.Collections.Paginator import Paginator
14
+ from paddle_billing.Entities.Collections.PaymentMethodCollection import PaymentMethodCollection
14
15
  from paddle_billing.Entities.Collections.PriceCollection import PriceCollection
15
16
  from paddle_billing.Entities.Collections.ProductCollection import ProductCollection
16
17
  from paddle_billing.Entities.Collections.ReportCollection import ReportCollection
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+
5
+ from paddle_billing.Entities.Entity import Entity
6
+
7
+
8
+ @dataclass
9
+ class CustomerAuthToken(Entity):
10
+ customer_auth_token: str
11
+ expires_at: datetime
12
+
13
+ @staticmethod
14
+ def from_dict(data: dict) -> CustomerAuthToken:
15
+ return CustomerAuthToken(
16
+ customer_auth_token=data["customer_auth_token"],
17
+ expires_at=datetime.fromisoformat(data["expires_at"]),
18
+ )
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+
5
+ from paddle_billing.Entities.Entity import Entity
6
+ from paddle_billing.Entities.CustomerPortalSessions import CustomerPortalSessionUrls
7
+
8
+
9
+ @dataclass
10
+ class CustomerPortalSession(Entity):
11
+ id: str
12
+ customer_id: str
13
+ urls: CustomerPortalSessionUrls
14
+ created_at: datetime
15
+
16
+ @staticmethod
17
+ def from_dict(data: dict) -> CustomerPortalSession:
18
+ return CustomerPortalSession(
19
+ id=data["id"],
20
+ customer_id=data["customer_id"],
21
+ urls=CustomerPortalSessionUrls.from_dict(data["urls"]),
22
+ created_at=datetime.fromisoformat(data["created_at"]),
23
+ )
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class CustomerPortalSessionGeneralUrl:
7
+ overview: str
8
+
9
+ @staticmethod
10
+ def from_dict(data: dict) -> CustomerPortalSessionGeneralUrl:
11
+ return CustomerPortalSessionGeneralUrl(
12
+ overview=data["overview"],
13
+ )
@@ -0,0 +1,17 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class CustomerPortalSessionSubscriptionUrl:
7
+ id: str
8
+ cancel_subscription: str
9
+ update_subscription_payment_method: str
10
+
11
+ @staticmethod
12
+ def from_dict(data: dict) -> CustomerPortalSessionSubscriptionUrl:
13
+ return CustomerPortalSessionSubscriptionUrl(
14
+ id=data["id"],
15
+ cancel_subscription=data["cancel_subscription"],
16
+ update_subscription_payment_method=data["update_subscription_payment_method"],
17
+ )
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+
4
+ from paddle_billing.Entities.CustomerPortalSessions.CustomerPortalSessionGeneralUrl import (
5
+ CustomerPortalSessionGeneralUrl,
6
+ )
7
+ from paddle_billing.Entities.CustomerPortalSessions.CustomerPortalSessionSubscriptionUrl import (
8
+ CustomerPortalSessionSubscriptionUrl,
9
+ )
10
+
11
+
12
+ @dataclass
13
+ class CustomerPortalSessionUrls:
14
+ general: CustomerPortalSessionGeneralUrl
15
+ subscriptions: list[CustomerPortalSessionSubscriptionUrl]
16
+
17
+ @staticmethod
18
+ def from_dict(data: dict) -> CustomerPortalSessionUrls:
19
+ return CustomerPortalSessionUrls(
20
+ general=CustomerPortalSessionGeneralUrl.from_dict(data["general"]),
21
+ subscriptions=[
22
+ CustomerPortalSessionSubscriptionUrl.from_dict(item) for item in data.get("subscriptions", [])
23
+ ],
24
+ )
@@ -0,0 +1,7 @@
1
+ from paddle_billing.Entities.CustomerPortalSessions.CustomerPortalSessionUrls import CustomerPortalSessionUrls
2
+ from paddle_billing.Entities.CustomerPortalSessions.CustomerPortalSessionGeneralUrl import (
3
+ CustomerPortalSessionGeneralUrl,
4
+ )
5
+ from paddle_billing.Entities.CustomerPortalSessions.CustomerPortalSessionSubscriptionUrl import (
6
+ CustomerPortalSessionSubscriptionUrl,
7
+ )
@@ -3,7 +3,7 @@ from dataclasses import dataclass
3
3
 
4
4
  from paddle_billing.Entities.Entity import Entity
5
5
  from paddle_billing.Entities.EventType import EventType
6
- from paddle_billing.Entities.NotificationSettings import NotificationSettingType
6
+ from paddle_billing.Entities.NotificationSettings import NotificationSettingType, NotificationSettingTrafficSource
7
7
 
8
8
 
9
9
  @dataclass
@@ -17,6 +17,7 @@ class NotificationSetting(Entity):
17
17
  include_sensitive_fields: bool
18
18
  subscribed_events: list[EventType]
19
19
  endpoint_secret_key: str
20
+ traffic_source: NotificationSettingTrafficSource
20
21
 
21
22
  @staticmethod
22
23
  def from_dict(data: dict) -> NotificationSetting:
@@ -30,4 +31,5 @@ class NotificationSetting(Entity):
30
31
  include_sensitive_fields=data["include_sensitive_fields"],
31
32
  subscribed_events=[EventType.from_dict(event) for event in data.get("subscribed_events", [])],
32
33
  endpoint_secret_key=data["endpoint_secret_key"],
34
+ traffic_source=NotificationSettingTrafficSource(data["traffic_source"]),
33
35
  )
@@ -0,0 +1,7 @@
1
+ from paddle_billing.PaddleStrEnum import PaddleStrEnum, PaddleStrEnumMeta
2
+
3
+
4
+ class NotificationSettingTrafficSource(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
5
+ All: "NotificationSettingTrafficSource" = "all"
6
+ Platform: "NotificationSettingTrafficSource" = "platform"
7
+ Simulation: "NotificationSettingTrafficSource" = "simulation"
@@ -1 +1,4 @@
1
+ from paddle_billing.Entities.NotificationSettings.NotificationSettingTrafficSource import (
2
+ NotificationSettingTrafficSource,
3
+ )
1
4
  from paddle_billing.Entities.NotificationSettings.NotificationSettingType import NotificationSettingType
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+
5
+ from paddle_billing.Entities.Entity import Entity
6
+ from paddle_billing.Entities.Shared import (
7
+ Card,
8
+ Paypal,
9
+ SavedPaymentMethodOrigin,
10
+ SavedPaymentMethodType,
11
+ )
12
+
13
+
14
+ @dataclass
15
+ class PaymentMethod(Entity):
16
+ id: str
17
+ customer_id: str
18
+ address_id: str
19
+ type: SavedPaymentMethodType
20
+ card: Card | None
21
+ paypal: Paypal | None
22
+ origin: SavedPaymentMethodOrigin
23
+ saved_at: datetime
24
+ updated_at: datetime
25
+
26
+ @staticmethod
27
+ def from_dict(data: dict) -> PaymentMethod:
28
+ return PaymentMethod(
29
+ id=data["id"],
30
+ customer_id=data["customer_id"],
31
+ address_id=data["address_id"],
32
+ type=SavedPaymentMethodType(data["type"]),
33
+ card=Card.from_dict(data["card"]) if data.get("card") else None,
34
+ paypal=Paypal.from_dict(data["paypal"]) if data.get("paypal") else None,
35
+ origin=SavedPaymentMethodOrigin(data["origin"]),
36
+ saved_at=datetime.fromisoformat(data["saved_at"]),
37
+ updated_at=datetime.fromisoformat(data["updated_at"]),
38
+ )
@@ -15,10 +15,6 @@ from paddle_billing.Entities.Shared import (
15
15
  UnitPriceOverride,
16
16
  )
17
17
 
18
- from paddle_billing.Logger import get_logger
19
-
20
- log = get_logger()
21
-
22
18
 
23
19
  @dataclass
24
20
  class Price(Entity):
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from dataclasses import asdict, dataclass
2
+ from dataclasses import dataclass
3
3
 
4
4
  from paddle_billing.Entities.Reports import ReportFilterName, ReportFilterOperator
5
5
 
@@ -13,6 +13,3 @@ class ReportFilter:
13
13
  @staticmethod
14
14
  def from_dict(data: dict) -> ReportFilter:
15
15
  return ReportFilter(**data)
16
-
17
- def get_parameters(self) -> dict:
18
- return asdict(self)
@@ -4,8 +4,5 @@ class CustomData:
4
4
  def __init__(self, data: dict | list):
5
5
  self.data = data
6
6
 
7
- def get_parameters(self):
8
- return self.data
9
-
10
7
  def to_json(self):
11
8
  return self.data
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class Paypal:
7
+ email: str
8
+ reference: str
9
+
10
+ @staticmethod
11
+ def from_dict(data: dict) -> Paypal:
12
+ return Paypal(
13
+ email=data["email"],
14
+ reference=data["reference"],
15
+ )
@@ -0,0 +1,6 @@
1
+ from paddle_billing.PaddleStrEnum import PaddleStrEnum, PaddleStrEnumMeta
2
+
3
+
4
+ class SavedPaymentMethodOrigin(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
5
+ SavedDuringPurchase: "SavedPaymentMethodOrigin" = "saved_during_purchase"
6
+ Subscription: "SavedPaymentMethodOrigin" = "subscription"
@@ -0,0 +1,9 @@
1
+ from paddle_billing.PaddleStrEnum import PaddleStrEnum, PaddleStrEnumMeta
2
+
3
+
4
+ class SavedPaymentMethodType(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
5
+ Alipay: "SavedPaymentMethodType" = "alipay"
6
+ ApplePay: "SavedPaymentMethodType" = "apple_pay"
7
+ Card: "SavedPaymentMethodType" = "card"
8
+ GooglePay: "SavedPaymentMethodType" = "google_pay"
9
+ Paypal: "SavedPaymentMethodType" = "paypal"
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from dataclasses import dataclass
3
3
 
4
- from paddle_billing.Entities.Product import Product
4
+ from paddle_billing.Entities.Shared.TransactionPreviewProduct import TransactionPreviewProduct
5
5
  from paddle_billing.Entities.Shared.Totals import Totals
6
6
  from paddle_billing.Entities.Shared.UnitTotals import UnitTotals
7
7
  from paddle_billing.Entities.Shared.Proration import Proration
@@ -9,22 +9,22 @@ from paddle_billing.Entities.Shared.Proration import Proration
9
9
 
10
10
  @dataclass
11
11
  class TransactionLineItemPreview:
12
- price_id: str
12
+ price_id: str | None
13
13
  quantity: int
14
14
  tax_rate: str
15
15
  unit_totals: UnitTotals
16
16
  totals: Totals
17
- product: Product
17
+ product: TransactionPreviewProduct
18
18
  proration: Proration | None
19
19
 
20
20
  @staticmethod
21
21
  def from_dict(data: dict) -> TransactionLineItemPreview:
22
22
  return TransactionLineItemPreview(
23
- price_id=data["price_id"],
23
+ price_id=data.get("price_id"),
24
24
  quantity=data["quantity"],
25
25
  tax_rate=data["tax_rate"],
26
26
  unit_totals=UnitTotals.from_dict(data["unit_totals"]),
27
27
  totals=Totals.from_dict(data["totals"]),
28
- product=Product.from_dict(data["product"]),
28
+ product=TransactionPreviewProduct.from_dict(data["product"]),
29
29
  proration=Proration.from_dict(data["proration"]) if data.get("proration") else None,
30
30
  )
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+
5
+ from paddle_billing.Entities.Entity import Entity
6
+ from paddle_billing.Entities.Shared import CatalogType, CustomData, ImportMeta, Status, TaxCategory
7
+
8
+
9
+ @dataclass
10
+ class TransactionPreviewProduct(Entity):
11
+ id: str | None
12
+ name: str
13
+ description: str | None
14
+ tax_category: TaxCategory
15
+ image_url: str | None
16
+ status: Status
17
+ created_at: datetime
18
+ updated_at: datetime
19
+ type: CatalogType | None = None
20
+ custom_data: CustomData | None = None
21
+ import_meta: ImportMeta | None = None
22
+
23
+ @staticmethod
24
+ def from_dict(data: dict) -> TransactionPreviewProduct:
25
+ return TransactionPreviewProduct(
26
+ id=data.get("id"),
27
+ name=data["name"],
28
+ description=data.get("description"),
29
+ tax_category=TaxCategory(data["tax_category"]),
30
+ image_url=data.get("image_url"),
31
+ status=Status(data["status"]),
32
+ created_at=datetime.fromisoformat(data["created_at"]),
33
+ updated_at=datetime.fromisoformat(data["updated_at"]),
34
+ type=CatalogType(data["type"]) if data.get("type") else None,
35
+ custom_data=CustomData(data["custom_data"]) if data.get("custom_data") else None,
36
+ import_meta=ImportMeta.from_dict(data["import_meta"]) if data.get("import_meta") else None,
37
+ )
@@ -31,8 +31,11 @@ from paddle_billing.Entities.Shared.Pagination import Pagination
31
31
  from paddle_billing.Entities.Shared.PaymentAttemptStatus import PaymentAttemptStatus
32
32
  from paddle_billing.Entities.Shared.PaymentMethodType import PaymentMethodType
33
33
  from paddle_billing.Entities.Shared.PayoutTotalsAdjustment import PayoutTotalsAdjustment
34
+ from paddle_billing.Entities.Shared.Paypal import Paypal
34
35
  from paddle_billing.Entities.Shared.PriceQuantity import PriceQuantity
35
36
  from paddle_billing.Entities.Shared.Proration import Proration
37
+ from paddle_billing.Entities.Shared.SavedPaymentMethodOrigin import SavedPaymentMethodOrigin
38
+ from paddle_billing.Entities.Shared.SavedPaymentMethodType import SavedPaymentMethodType
36
39
  from paddle_billing.Entities.Shared.Status import Status
37
40
  from paddle_billing.Entities.Shared.TransactionStatus import TransactionStatus
38
41
  from paddle_billing.Entities.Shared.TaxCategory import TaxCategory
@@ -9,7 +9,7 @@ class SubscriptionAdjustmentItem:
9
9
  item_id: str
10
10
  type: AdjustmentType
11
11
  amount: str | None
12
- proration: Proration
12
+ proration: Proration | None
13
13
  totals: AdjustmentItemTotals
14
14
 
15
15
  @staticmethod
@@ -18,6 +18,6 @@ class SubscriptionAdjustmentItem:
18
18
  item_id=data["item_id"],
19
19
  type=AdjustmentType(data["type"]),
20
20
  amount=data.get("amount"),
21
- proration=Proration.from_dict(data["proration"]),
21
+ proration=Proration.from_dict(data["proration"]) if data.get("proration") else None,
22
22
  totals=AdjustmentItemTotals.from_dict(data["totals"]),
23
23
  )
@@ -6,15 +6,8 @@ from paddle_billing.Entities.Subscriptions.SubscriptionDiscount import Subscript
6
6
  from paddle_billing.Entities.Subscriptions.SubscriptionEffectiveFrom import SubscriptionEffectiveFrom
7
7
  from paddle_billing.Entities.Subscriptions.SubscriptionItem import SubscriptionItem
8
8
  from paddle_billing.Entities.Subscriptions.SubscriptionItemStatus import SubscriptionItemStatus
9
- from paddle_billing.Entities.Subscriptions.SubscriptionItems import SubscriptionItems
10
- from paddle_billing.Entities.Subscriptions.SubscriptionItemsWithPrice import SubscriptionItemsWithPrice
11
9
  from paddle_billing.Entities.Subscriptions.SubscriptionManagementUrls import SubscriptionManagementUrls
12
10
  from paddle_billing.Entities.Subscriptions.SubscriptionNextTransaction import SubscriptionNextTransaction
13
- from paddle_billing.Entities.Subscriptions.SubscriptionNonCatalogPrice import SubscriptionNonCatalogPrice
14
- from paddle_billing.Entities.Subscriptions.SubscriptionNonCatalogPriceWithProduct import (
15
- SubscriptionNonCatalogPriceWithProduct,
16
- )
17
- from paddle_billing.Entities.Subscriptions.SubscriptionNonCatalogProduct import SubscriptionNonCatalogProduct
18
11
  from paddle_billing.Entities.Subscriptions.SubscriptionOnPaymentFailure import SubscriptionOnPaymentFailure
19
12
  from paddle_billing.Entities.Subscriptions.SubscriptionPreviewSubscriptionUpdateSummary import (
20
13
  SubscriptionPreviewSubscriptionUpdateSummary,
@@ -26,4 +19,3 @@ from paddle_billing.Entities.Subscriptions.SubscriptionResumeEffectiveFrom impor
26
19
  from paddle_billing.Entities.Subscriptions.SubscriptionScheduledChange import SubscriptionScheduledChange
27
20
  from paddle_billing.Entities.Subscriptions.SubscriptionScheduledChangeAction import SubscriptionScheduledChangeAction
28
21
  from paddle_billing.Entities.Subscriptions.SubscriptionStatus import SubscriptionStatus
29
- from paddle_billing.Entities.Subscriptions.SubscriptionUpdateItem import SubscriptionUpdateItem
@@ -8,7 +8,6 @@ from paddle_billing.Entities.Shared.Proration import Proration
8
8
 
9
9
  @dataclass
10
10
  class TransactionItem:
11
- price_id: str | None
12
11
  price: Price
13
12
  quantity: int
14
13
  proration: Proration | None
@@ -16,7 +15,6 @@ class TransactionItem:
16
15
  @staticmethod
17
16
  def from_dict(data: dict) -> TransactionItem:
18
17
  return TransactionItem(
19
- price_id=data.get("price_id"),
20
18
  price=Price.from_dict(data["price"]),
21
19
  quantity=data["quantity"],
22
20
  proration=Proration.from_dict(data["proration"]) if data.get("proration") else None,
@@ -1,14 +1,14 @@
1
1
  from __future__ import annotations
2
2
  from dataclasses import dataclass
3
3
 
4
- from paddle_billing.Entities.Price import Price
4
+ from paddle_billing.Entities.Transactions.TransactionPreviewPrice import TransactionPreviewPrice
5
5
 
6
6
  from paddle_billing.Entities.Shared.Proration import Proration
7
7
 
8
8
 
9
9
  @dataclass
10
10
  class TransactionItemPreviewWithPrice:
11
- price: Price
11
+ price: TransactionPreviewPrice
12
12
  quantity: int
13
13
  include_in_totals: bool
14
14
  proration: Proration | None
@@ -16,7 +16,7 @@ class TransactionItemPreviewWithPrice:
16
16
  @staticmethod
17
17
  def from_dict(data: dict) -> TransactionItemPreviewWithPrice:
18
18
  return TransactionItemPreviewWithPrice(
19
- price=Price.from_dict(data["price"]),
19
+ price=TransactionPreviewPrice.from_dict(data["price"]),
20
20
  quantity=data["quantity"],
21
21
  include_in_totals=data["include_in_totals"],
22
22
  proration=Proration.from_dict(data["proration"]) if data.get("proration") else None,
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+
5
+ from paddle_billing.Entities.Entity import Entity
6
+ from paddle_billing.Entities.Shared import (
7
+ CatalogType,
8
+ CustomData,
9
+ Duration,
10
+ ImportMeta,
11
+ Money,
12
+ PriceQuantity,
13
+ Status,
14
+ TaxMode,
15
+ UnitPriceOverride,
16
+ )
17
+
18
+
19
+ @dataclass
20
+ class TransactionPreviewPrice(Entity):
21
+ id: str | None
22
+ product_id: str | None
23
+ name: str | None
24
+ description: str
25
+ type: CatalogType
26
+ billing_cycle: Duration | None
27
+ trial_period: Duration | None
28
+ tax_mode: TaxMode
29
+ unit_price: Money
30
+ unit_price_overrides: list[UnitPriceOverride]
31
+ quantity: PriceQuantity
32
+ status: Status
33
+ custom_data: CustomData | None
34
+ import_meta: ImportMeta | None
35
+ created_at: datetime
36
+ updated_at: datetime
37
+
38
+ @staticmethod
39
+ def from_dict(data: dict) -> TransactionPreviewPrice:
40
+ return TransactionPreviewPrice(
41
+ id=data.get("id"),
42
+ product_id=data.get("product_id"),
43
+ name=data.get("name"),
44
+ description=data["description"],
45
+ unit_price=Money.from_dict(data["unit_price"]),
46
+ quantity=PriceQuantity.from_dict(data["quantity"]),
47
+ status=Status(data["status"]),
48
+ tax_mode=TaxMode(data.get("tax_mode")),
49
+ created_at=datetime.fromisoformat(data["created_at"]),
50
+ updated_at=datetime.fromisoformat(data["updated_at"]),
51
+ unit_price_overrides=[
52
+ UnitPriceOverride.from_dict(override) for override in data.get("unit_price_overrides", [])
53
+ ],
54
+ type=CatalogType(data.get("type")) if data.get("type") else None,
55
+ billing_cycle=Duration.from_dict(data["billing_cycle"]) if data.get("billing_cycle") else None,
56
+ trial_period=Duration.from_dict(data["trial_period"]) if data.get("trial_period") else None,
57
+ custom_data=CustomData(data["custom_data"]) if data.get("custom_data") else None,
58
+ import_meta=ImportMeta.from_dict(data["import_meta"]) if data.get("import_meta") else None,
59
+ )
@@ -1,19 +1,7 @@
1
1
  from paddle_billing.Entities.Transactions.TransactionAdjustmentsTotals import TransactionAdjustmentsTotals
2
2
  from paddle_billing.Entities.Transactions.TransactionBreakdown import TransactionBreakdown
3
3
  from paddle_billing.Entities.Transactions.TransactionCardType import TransactionCardType
4
- from paddle_billing.Entities.Transactions.TransactionCreateItem import TransactionCreateItem
5
- from paddle_billing.Entities.Transactions.TransactionCreateItemWithPrice import TransactionCreateItemWithPrice
6
- from paddle_billing.Entities.Transactions.TransactionItemPreviewWithNonCatalogPrice import (
7
- TransactionItemPreviewWithNonCatalogPrice,
8
- )
9
- from paddle_billing.Entities.Transactions.TransactionItemPreviewWithPriceId import TransactionItemPreviewWithPriceId
10
- from paddle_billing.Entities.Transactions.TransactionNonCatalogPrice import TransactionNonCatalogPrice
11
- from paddle_billing.Entities.Transactions.TransactionNonCatalogPriceWithProduct import (
12
- TransactionNonCatalogPriceWithProduct,
13
- )
14
- from paddle_billing.Entities.Transactions.TransactionNonCatalogProduct import TransactionNonCatalogProduct
15
4
  from paddle_billing.Entities.Shared.TimePeriod import TimePeriod
16
- from paddle_billing.Entities.Transactions.TransactionUpdateTransactionItem import TransactionUpdateTransactionItem
17
5
 
18
6
 
19
7
  # These cause circular imports
@@ -44,10 +44,12 @@ class Entity(ABC, EntityDict):
44
44
  def _resolve_event_class_name(event_type) -> str:
45
45
  if event_type == "subscription.created":
46
46
  return "SubscriptionCreated"
47
+ if event_type == "payment_method.deleted":
48
+ return "PaymentMethodDeleted"
47
49
 
48
50
  event_entity = event_type.split(".")[0] or ""
49
51
 
50
- return event_entity.lower().title()
52
+ return event_entity.lower().title().replace("_", "")
51
53
 
52
54
  def to_dict(self) -> dict:
53
55
  return asdict(self)