django-cfg 1.3.7__py3-none-any.whl → 1.3.11__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 (246) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +269 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +183 -460
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +153 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  48. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  49. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  50. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  51. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  52. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  53. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  54. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +43 -17
  55. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  56. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  57. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +109 -63
  58. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  59. django_cfg/apps/payments/config/__init__.py +14 -15
  60. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  61. django_cfg/apps/payments/config/helpers.py +8 -13
  62. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  63. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  64. django_cfg/apps/payments/middleware/api_access.py +32 -6
  65. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  66. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  67. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  68. django_cfg/apps/payments/models/balance.py +12 -0
  69. django_cfg/apps/payments/models/currencies.py +106 -32
  70. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  71. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  72. django_cfg/apps/payments/models/payments.py +94 -0
  73. django_cfg/apps/payments/services/core/base.py +4 -4
  74. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  75. django_cfg/apps/payments/services/core/payment_service.py +266 -39
  76. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  77. django_cfg/apps/payments/services/providers/base.py +303 -41
  78. django_cfg/apps/payments/services/providers/models/__init__.py +42 -0
  79. django_cfg/apps/payments/services/providers/models/base.py +145 -0
  80. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  81. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  82. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  83. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  84. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  85. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  86. django_cfg/apps/payments/services/providers/nowpayments/provider.py +557 -0
  87. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  88. django_cfg/apps/payments/services/providers/registry.py +9 -37
  89. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  90. django_cfg/apps/payments/services/types/requests.py +19 -7
  91. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  92. django_cfg/apps/payments/static/payments/js/api-client.js +29 -6
  93. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  94. django_cfg/apps/payments/static/payments/js/payment-form.js +98 -32
  95. django_cfg/apps/payments/tasks/__init__.py +39 -0
  96. django_cfg/apps/payments/tasks/types.py +73 -0
  97. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  98. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  99. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  100. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  101. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  102. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  103. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  104. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  105. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  106. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  107. django_cfg/apps/payments/urls.py +3 -2
  108. django_cfg/apps/payments/urls_admin.py +1 -1
  109. django_cfg/apps/payments/views/api/currencies.py +8 -5
  110. django_cfg/apps/payments/views/overview/services.py +2 -2
  111. django_cfg/apps/payments/views/serializers/currencies.py +22 -8
  112. django_cfg/apps/support/admin/__init__.py +10 -1
  113. django_cfg/apps/support/admin/support_admin.py +338 -141
  114. django_cfg/apps/tasks/admin/__init__.py +11 -0
  115. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  116. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  117. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  118. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  119. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  120. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  121. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  122. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  123. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  124. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  125. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  126. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  127. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  128. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  129. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  130. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  131. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  132. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  133. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  134. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  135. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  136. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  137. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  138. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  139. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  140. django_cfg/apps/tasks/urls.py +2 -2
  141. django_cfg/apps/tasks/urls_admin.py +2 -2
  142. django_cfg/apps/tasks/utils/__init__.py +1 -0
  143. django_cfg/apps/tasks/utils/simulator.py +356 -0
  144. django_cfg/apps/tasks/views/__init__.py +16 -0
  145. django_cfg/apps/tasks/views/api.py +569 -0
  146. django_cfg/apps/tasks/views/dashboard.py +58 -0
  147. django_cfg/config.py +1 -1
  148. django_cfg/core/config.py +10 -5
  149. django_cfg/core/generation.py +1 -1
  150. django_cfg/core/integration/__init__.py +21 -0
  151. django_cfg/management/commands/__init__.py +13 -1
  152. django_cfg/management/commands/migrate_all.py +9 -3
  153. django_cfg/management/commands/migrator.py +11 -6
  154. django_cfg/management/commands/rundramatiq.py +3 -2
  155. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  156. django_cfg/middleware/__init__.py +0 -2
  157. django_cfg/models/api_keys.py +115 -0
  158. django_cfg/models/constance.py +0 -11
  159. django_cfg/models/payments.py +137 -3
  160. django_cfg/modules/django_admin/__init__.py +64 -0
  161. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  162. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  163. django_cfg/modules/django_admin/decorators/display.py +106 -0
  164. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  165. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  166. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  167. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  168. django_cfg/modules/django_admin/models/__init__.py +20 -0
  169. django_cfg/modules/django_admin/models/action_models.py +33 -0
  170. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  171. django_cfg/modules/django_admin/models/base.py +26 -0
  172. django_cfg/modules/django_admin/models/display_models.py +31 -0
  173. django_cfg/modules/django_admin/utils/badges.py +159 -0
  174. django_cfg/modules/django_admin/utils/displays.py +247 -0
  175. django_cfg/modules/django_currency/__init__.py +2 -2
  176. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  177. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  178. django_cfg/modules/django_currency/core/converter.py +12 -12
  179. django_cfg/modules/django_currency/database/__init__.py +2 -2
  180. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  181. django_cfg/modules/django_llm/llm/client.py +10 -2
  182. django_cfg/modules/django_tasks.py +54 -21
  183. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  184. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  185. django_cfg/modules/django_unfold/dashboard.py +14 -13
  186. django_cfg/modules/django_unfold/models/config.py +1 -1
  187. django_cfg/registry/core.py +7 -9
  188. django_cfg/registry/third_party.py +2 -2
  189. django_cfg/template_archive/django_sample.zip +0 -0
  190. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -1
  191. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/RECORD +198 -160
  192. django_cfg/apps/accounts/admin/activity.py +0 -96
  193. django_cfg/apps/accounts/admin/group.py +0 -17
  194. django_cfg/apps/accounts/admin/otp.py +0 -59
  195. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  196. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  197. django_cfg/apps/accounts/admin/user.py +0 -300
  198. django_cfg/apps/agents/core/agent.py +0 -281
  199. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  200. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  201. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  202. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  203. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  204. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  205. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  206. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  207. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  208. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  209. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  210. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  211. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  212. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  213. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  214. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  215. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  216. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  217. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  218. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  219. django_cfg/apps/payments/config/constance/fields.py +0 -69
  220. django_cfg/apps/payments/config/constance/settings.py +0 -160
  221. django_cfg/apps/payments/services/providers/nowpayments.py +0 -478
  222. django_cfg/apps/tasks/admin.py +0 -320
  223. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  224. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  225. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  226. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  227. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  228. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  229. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  230. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  231. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  232. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  233. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  234. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  235. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  236. django_cfg/apps/tasks/views.py +0 -461
  237. django_cfg/management/commands/auto_generate.py +0 -486
  238. django_cfg/middleware/static_nocache.py +0 -55
  239. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  240. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  241. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  242. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  243. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  244. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  245. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  246. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,48 @@
1
+ """
2
+ Universal models for cross-provider compatibility.
3
+
4
+ These models provide a standardized interface across different payment providers.
5
+ """
6
+
7
+ from pydantic import BaseModel, Field, ConfigDict
8
+ from typing import Optional, List
9
+
10
+
11
+ class UniversalCurrency(BaseModel):
12
+ """Universal currency representation for cross-provider compatibility."""
13
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
14
+
15
+ provider_currency_code: str = Field(..., description="Provider-specific currency code")
16
+ base_currency_code: str = Field(..., description="Base currency code (e.g., BTC, USDT)")
17
+ network_code: Optional[str] = Field(None, description="Network code (e.g., eth, bsc, tron)")
18
+ name: str = Field(..., description="Human-readable currency name")
19
+ currency_type: str = Field(..., description="Currency type (fiat, crypto, metal)")
20
+ is_enabled: bool = Field(default=True, description="Whether currency is enabled")
21
+ is_popular: bool = Field(default=False, description="Whether currency is popular")
22
+ is_stable: bool = Field(default=False, description="Whether currency is a stablecoin")
23
+ priority: int = Field(default=0, description="Currency priority for sorting")
24
+ logo_url: str = Field(default="", description="Currency logo URL")
25
+ available_for_payment: bool = Field(default=True, description="Available for payment")
26
+ available_for_payout: bool = Field(default=True, description="Available for payout")
27
+ min_payment_amount: Optional[float] = Field(None, description="Minimum payment amount in USD")
28
+ raw_data: dict = Field(default_factory=dict, description="Raw provider data")
29
+
30
+
31
+ class UniversalCurrenciesResponse(BaseModel):
32
+ """Response containing list of universal currencies."""
33
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
34
+
35
+ currencies: List[UniversalCurrency] = Field(default_factory=list, description="List of currencies")
36
+
37
+
38
+ class CurrencySyncResult(BaseModel):
39
+ """Result of currency synchronization operation."""
40
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
41
+
42
+ currencies_created: int = Field(default=0, description="Number of currencies created")
43
+ currencies_updated: int = Field(default=0, description="Number of currencies updated")
44
+ networks_created: int = Field(default=0, description="Number of networks created")
45
+ provider_currencies_created: int = Field(default=0, description="Number of provider currencies created")
46
+ provider_currencies_updated: int = Field(default=0, description="Number of provider currencies updated")
47
+ errors: List[str] = Field(default_factory=list, description="List of errors encountered")
48
+ total_processed: int = Field(default=0, description="Total currencies processed")
@@ -0,0 +1,31 @@
1
+ """
2
+ NowPayments provider package for Universal Payment System v2.0.
3
+
4
+ Comprehensive NowPayments integration with currency synchronization.
5
+ """
6
+
7
+ from .provider import NowPaymentsProvider
8
+ from .models import (
9
+ NowPaymentsProviderConfig,
10
+ NowPaymentsCurrency,
11
+ NowPaymentsFullCurrenciesResponse,
12
+ NowPaymentsPaymentRequest,
13
+ NowPaymentsPaymentResponse,
14
+ NowPaymentsWebhook,
15
+ NowPaymentsStatusResponse
16
+ )
17
+ from .sync import NowPaymentsCurrencySync
18
+ from .config import NowPaymentsConfig as Config
19
+
20
+ __all__ = [
21
+ 'NowPaymentsProvider',
22
+ 'NowPaymentsProviderConfig',
23
+ 'NowPaymentsCurrency',
24
+ 'NowPaymentsFullCurrenciesResponse',
25
+ 'NowPaymentsPaymentRequest',
26
+ 'NowPaymentsPaymentResponse',
27
+ 'NowPaymentsWebhook',
28
+ 'NowPaymentsStatusResponse',
29
+ 'NowPaymentsCurrencySync',
30
+ 'Config'
31
+ ]
@@ -0,0 +1,70 @@
1
+ """
2
+ NowPayments provider configuration.
3
+
4
+ Simple configuration constants for NowPayments provider.
5
+ """
6
+
7
+ from decimal import Decimal
8
+
9
+ # NowPayments configuration constants
10
+ class NowPaymentsConfig:
11
+ """Simple NowPayments configuration."""
12
+
13
+ # Fees
14
+ FEE_PERCENTAGE = Decimal('0.005') # 0.5%
15
+ FIXED_FEE_USD = Decimal('0.0') # No fixed fee
16
+
17
+ # Limits
18
+ MIN_AMOUNT_USD = Decimal('0.000001') # Minimum for all crypto
19
+ MAX_AMOUNT_USD = Decimal('1000000.0')
20
+
21
+ # Network names
22
+ NETWORK_NAMES = {
23
+ 'eth': 'Ethereum',
24
+ 'bsc': 'Binance Smart Chain',
25
+ 'matic': 'Polygon',
26
+ 'trx': 'TRON',
27
+ 'btc': 'Bitcoin',
28
+ 'ltc': 'Litecoin',
29
+ 'sol': 'Solana',
30
+ 'avaxc': 'Avalanche C-Chain',
31
+ 'arbitrum': 'Arbitrum',
32
+ 'op': 'Optimism',
33
+ 'base': 'Base',
34
+ 'ton': 'TON',
35
+ 'near': 'NEAR',
36
+ 'algo': 'Algorand',
37
+ 'xtz': 'Tezos',
38
+ 'dot': 'Polkadot',
39
+ 'ada': 'Cardano',
40
+ 'xlm': 'Stellar',
41
+ 'xrp': 'Ripple',
42
+ 'atom': 'Cosmos',
43
+ 'luna': 'Terra',
44
+ 'neo': 'Neo',
45
+ 'waves': 'Waves',
46
+ }
47
+
48
+ # Confirmation blocks
49
+ CONFIRMATION_BLOCKS = {
50
+ 'btc': 1,
51
+ 'eth': 12,
52
+ 'bsc': 3,
53
+ 'matic': 20,
54
+ 'trx': 19,
55
+ }
56
+
57
+ @classmethod
58
+ def get_network_name(cls, network_code: str) -> str:
59
+ """Get human-readable network name."""
60
+ return cls.NETWORK_NAMES.get(network_code.lower(), network_code.upper())
61
+
62
+ @classmethod
63
+ def get_confirmation_blocks(cls, network_code: str) -> int:
64
+ """Get confirmation blocks for network."""
65
+ return cls.CONFIRMATION_BLOCKS.get(network_code.lower(), 1)
66
+
67
+ @classmethod
68
+ def get_min_amount(cls) -> Decimal:
69
+ """Get minimum amount for all currencies."""
70
+ return cls.MIN_AMOUNT_USD
@@ -0,0 +1,150 @@
1
+ """
2
+ NowPayments provider models for Universal Payment System v2.0.
3
+
4
+ Pydantic models for NowPayments API integration.
5
+ """
6
+
7
+ from pydantic import BaseModel, Field, ConfigDict, field_validator
8
+ from typing import Optional, List
9
+ from decimal import Decimal
10
+
11
+ from ..models import ProviderConfig
12
+
13
+
14
+ class NowPaymentsProviderConfig(ProviderConfig):
15
+ """NowPayments provider configuration with Pydantic v2."""
16
+
17
+ ipn_secret: Optional[str] = Field(default=None, description="IPN secret for webhook validation")
18
+ callback_url: Optional[str] = Field(default=None, description="Webhook callback URL")
19
+ success_url: Optional[str] = Field(default=None, description="Payment success redirect URL")
20
+ cancel_url: Optional[str] = Field(default=None, description="Payment cancel redirect URL")
21
+
22
+ def __init__(self, **data):
23
+ """Initialize with NowPayments defaults."""
24
+ # Set NowPayments-specific defaults
25
+ if 'provider_name' not in data:
26
+ data['provider_name'] = 'nowpayments'
27
+
28
+ if 'api_url' not in data:
29
+ # TEMP: Force production URL since sandbox is down
30
+ # sandbox_mode = data.get('sandbox_mode', False)
31
+ # data['api_url'] = (
32
+ # 'https://api-sandbox.nowpayments.io/v1' if sandbox_mode
33
+ # else 'https://api.nowpayments.io/v1'
34
+ # )
35
+ data['api_url'] = 'https://api.nowpayments.io/v1' # Force production
36
+
37
+ super().__init__(**data)
38
+
39
+
40
+ class NowPaymentsCurrency(BaseModel):
41
+ """NowPayments full currency model from /v1/full-currencies."""
42
+ model_config = ConfigDict(validate_assignment=True, extra="allow")
43
+
44
+ id: int = Field(..., description="Currency ID")
45
+ code: str = Field(..., description="Currency code (e.g., BTC, USDTERC20)")
46
+ name: str = Field(..., description="Full currency name")
47
+ enable: bool = Field(..., description="Currency availability")
48
+ wallet_regex: Optional[str] = Field(None, description="Wallet address regex")
49
+ priority: int = Field(..., description="Currency priority")
50
+ extra_id_exists: bool = Field(..., description="Whether extra ID is required")
51
+ extra_id_regex: Optional[str] = Field(None, description="Extra ID regex")
52
+ logo_url: str = Field(..., description="Currency logo URL")
53
+ track: bool = Field(..., description="Track transactions")
54
+ cg_id: Optional[str] = Field(None, description="CoinGecko ID")
55
+ is_maxlimit: bool = Field(..., description="Has max limit")
56
+ network: Optional[str] = Field(None, description="Blockchain network")
57
+ smart_contract: Optional[str] = Field(None, description="Smart contract address")
58
+ network_precision: Optional[str] = Field(None, description="Network precision")
59
+ explorer_link_hash: Optional[str] = Field(None, description="Explorer link")
60
+ precision: int = Field(..., description="Currency precision")
61
+ ticker: Optional[str] = Field(None, description="Ticker symbol")
62
+ is_defi: bool = Field(..., description="Is DeFi token")
63
+ is_popular: bool = Field(..., description="Is popular currency")
64
+ is_stable: bool = Field(..., description="Is stablecoin")
65
+ available_for_to_conversion: bool = Field(..., description="Available for conversion")
66
+ trust_wallet_id: Optional[str] = Field(None, description="Trust Wallet ID")
67
+ created_at: str = Field(..., description="Creation timestamp")
68
+ updated_at: str = Field(..., description="Update timestamp")
69
+ available_for_payment: bool = Field(..., description="Available for payment")
70
+ available_for_payout: bool = Field(..., description="Available for payout")
71
+ extra_id_optional: bool = Field(..., description="Extra ID is optional")
72
+
73
+
74
+ class NowPaymentsFullCurrenciesResponse(BaseModel):
75
+ """NowPayments full currencies response from /v1/full-currencies."""
76
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
77
+
78
+ currencies: List[NowPaymentsCurrency] = Field(..., description="List of full currency data")
79
+
80
+
81
+ class NowPaymentsPaymentRequest(BaseModel):
82
+ """NowPayments payment creation request."""
83
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
84
+
85
+ price_amount: float = Field(..., description="Payment amount")
86
+ price_currency: str = Field(..., description="Price currency (usually USD)")
87
+ pay_currency: str = Field(..., description="Payment currency (crypto)")
88
+ order_id: str = Field(..., description="Unique order identifier")
89
+ order_description: Optional[str] = Field(None, description="Order description")
90
+ success_url: Optional[str] = Field(None, description="Success redirect URL")
91
+ cancel_url: Optional[str] = Field(None, description="Cancel redirect URL")
92
+ ipn_callback_url: Optional[str] = Field(None, description="IPN callback URL")
93
+
94
+
95
+ class NowPaymentsPaymentResponse(BaseModel):
96
+ """NowPayments payment creation response."""
97
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
98
+
99
+ payment_id: str = Field(..., description="Payment ID")
100
+ payment_status: str = Field(..., description="Payment status")
101
+ pay_address: str = Field(..., description="Payment address")
102
+ price_amount: float = Field(..., description="Price amount")
103
+ price_currency: str = Field(..., description="Price currency")
104
+ pay_amount: float = Field(..., description="Payment amount")
105
+ pay_currency: str = Field(..., description="Payment currency")
106
+ order_id: str = Field(..., description="Order ID")
107
+ order_description: Optional[str] = Field(None, description="Order description")
108
+ invoice_url: Optional[str] = Field(None, description="Payment page URL")
109
+ success_url: Optional[str] = Field(None, description="Success URL")
110
+ cancel_url: Optional[str] = Field(None, description="Cancel URL")
111
+ created_at: str = Field(..., description="Creation timestamp")
112
+ updated_at: str = Field(..., description="Update timestamp")
113
+
114
+
115
+ class NowPaymentsWebhook(BaseModel):
116
+ """NowPayments webhook/IPN data."""
117
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
118
+
119
+ payment_id: str = Field(..., description="Payment ID")
120
+ payment_status: str = Field(..., description="Payment status")
121
+ pay_address: str = Field(..., description="Payment address")
122
+ price_amount: float = Field(..., description="Price amount")
123
+ price_currency: str = Field(..., description="Price currency")
124
+ pay_amount: float = Field(..., description="Payment amount")
125
+ pay_currency: str = Field(..., description="Payment currency")
126
+ order_id: str = Field(..., description="Order ID")
127
+ order_description: Optional[str] = Field(None, description="Order description")
128
+ outcome_amount: Optional[float] = Field(None, description="Outcome amount")
129
+ outcome_currency: Optional[str] = Field(None, description="Outcome currency")
130
+ actually_paid: Optional[float] = Field(None, description="Actually paid amount")
131
+ txid: Optional[str] = Field(None, description="Transaction ID")
132
+ created_at: str = Field(..., description="Creation timestamp")
133
+ updated_at: str = Field(..., description="Update timestamp")
134
+
135
+
136
+ class NowPaymentsStatusResponse(BaseModel):
137
+ """NowPayments /v1/status response schema for health checks."""
138
+ model_config = ConfigDict(validate_assignment=True, extra="forbid")
139
+
140
+ message: str = Field(..., description="Status message")
141
+
142
+ @field_validator('message')
143
+ @classmethod
144
+ def validate_message_ok(cls, v):
145
+ """Validate that message is OK."""
146
+ if v.upper() != 'OK':
147
+ raise ValueError(f"Expected message 'OK', got '{v}'")
148
+ return v
149
+
150
+