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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/__init__.py +24 -8
- django_cfg/apps/accounts/admin/activity_admin.py +146 -0
- django_cfg/apps/accounts/admin/filters.py +98 -22
- django_cfg/apps/accounts/admin/group_admin.py +86 -0
- django_cfg/apps/accounts/admin/inlines.py +42 -13
- django_cfg/apps/accounts/admin/otp_admin.py +115 -0
- django_cfg/apps/accounts/admin/registration_admin.py +173 -0
- django_cfg/apps/accounts/admin/resources.py +123 -19
- django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
- django_cfg/apps/accounts/admin/user_admin.py +362 -0
- django_cfg/apps/agents/admin/__init__.py +17 -4
- django_cfg/apps/agents/admin/execution_admin.py +204 -183
- django_cfg/apps/agents/admin/registry_admin.py +230 -255
- django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
- django_cfg/apps/agents/core/__init__.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +221 -0
- django_cfg/apps/agents/core/exceptions.py +14 -0
- django_cfg/apps/agents/core/orchestrator.py +18 -3
- django_cfg/apps/knowbase/admin/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
- django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
- django_cfg/apps/knowbase/admin/document_admin.py +269 -262
- django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
- django_cfg/apps/knowbase/config/settings.py +21 -4
- django_cfg/apps/knowbase/views/chat_views.py +3 -0
- django_cfg/apps/leads/admin/__init__.py +3 -1
- django_cfg/apps/leads/admin/leads_admin.py +235 -35
- django_cfg/apps/maintenance/admin/__init__.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
- django_cfg/apps/maintenance/admin/log_admin.py +143 -61
- django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
- django_cfg/apps/maintenance/admin/site_admin.py +213 -352
- django_cfg/apps/newsletter/admin/__init__.py +29 -2
- django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
- django_cfg/apps/payments/admin/__init__.py +18 -27
- django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
- django_cfg/apps/payments/admin/balance_admin.py +166 -632
- django_cfg/apps/payments/admin/currencies_admin.py +235 -607
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
- django_cfg/apps/payments/admin/filters.py +83 -3
- django_cfg/apps/payments/admin/networks_admin.py +269 -0
- django_cfg/apps/payments/admin/payments_admin.py +183 -460
- django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
- django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +153 -34
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +43 -17
- django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
- django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +109 -63
- django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
- django_cfg/apps/payments/config/__init__.py +14 -15
- django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
- django_cfg/apps/payments/config/helpers.py +8 -13
- django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
- django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
- django_cfg/apps/payments/middleware/api_access.py +32 -6
- django_cfg/apps/payments/migrations/0001_initial.py +33 -46
- django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
- django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
- django_cfg/apps/payments/models/balance.py +12 -0
- django_cfg/apps/payments/models/currencies.py +106 -32
- django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
- django_cfg/apps/payments/models/payments.py +94 -0
- django_cfg/apps/payments/services/core/base.py +4 -4
- django_cfg/apps/payments/services/core/currency_service.py +35 -28
- django_cfg/apps/payments/services/core/payment_service.py +266 -39
- django_cfg/apps/payments/services/providers/__init__.py +3 -0
- django_cfg/apps/payments/services/providers/base.py +303 -41
- django_cfg/apps/payments/services/providers/models/__init__.py +42 -0
- django_cfg/apps/payments/services/providers/models/base.py +145 -0
- django_cfg/apps/payments/services/providers/models/providers.py +87 -0
- django_cfg/apps/payments/services/providers/models/universal.py +48 -0
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
- django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
- django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +557 -0
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
- django_cfg/apps/payments/services/providers/registry.py +9 -37
- django_cfg/apps/payments/services/providers/sync_service.py +277 -0
- django_cfg/apps/payments/services/types/requests.py +19 -7
- django_cfg/apps/payments/signals/payment_signals.py +31 -2
- django_cfg/apps/payments/static/payments/js/api-client.js +29 -6
- django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +98 -32
- django_cfg/apps/payments/tasks/__init__.py +39 -0
- django_cfg/apps/payments/tasks/types.py +73 -0
- django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
- django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
- django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
- django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
- django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
- django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
- django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
- django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
- django_cfg/apps/payments/urls.py +3 -2
- django_cfg/apps/payments/urls_admin.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +8 -5
- django_cfg/apps/payments/views/overview/services.py +2 -2
- django_cfg/apps/payments/views/serializers/currencies.py +22 -8
- django_cfg/apps/support/admin/__init__.py +10 -1
- django_cfg/apps/support/admin/support_admin.py +338 -141
- django_cfg/apps/tasks/admin/__init__.py +11 -0
- django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
- django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
- django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
- django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
- django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
- django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
- django_cfg/apps/tasks/tasks/__init__.py +10 -0
- django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
- django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
- django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
- django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
- django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
- django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
- django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
- django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
- django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
- django_cfg/apps/tasks/urls.py +2 -2
- django_cfg/apps/tasks/urls_admin.py +2 -2
- django_cfg/apps/tasks/utils/__init__.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +356 -0
- django_cfg/apps/tasks/views/__init__.py +16 -0
- django_cfg/apps/tasks/views/api.py +569 -0
- django_cfg/apps/tasks/views/dashboard.py +58 -0
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +10 -5
- django_cfg/core/generation.py +1 -1
- django_cfg/core/integration/__init__.py +21 -0
- django_cfg/management/commands/__init__.py +13 -1
- django_cfg/management/commands/migrate_all.py +9 -3
- django_cfg/management/commands/migrator.py +11 -6
- django_cfg/management/commands/rundramatiq.py +3 -2
- django_cfg/management/commands/rundramatiq_simulator.py +430 -0
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/models/api_keys.py +115 -0
- django_cfg/models/constance.py +0 -11
- django_cfg/models/payments.py +137 -3
- django_cfg/modules/django_admin/__init__.py +64 -0
- django_cfg/modules/django_admin/decorators/__init__.py +13 -0
- django_cfg/modules/django_admin/decorators/actions.py +106 -0
- django_cfg/modules/django_admin/decorators/display.py +106 -0
- django_cfg/modules/django_admin/mixins/__init__.py +14 -0
- django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
- django_cfg/modules/django_admin/models/__init__.py +20 -0
- django_cfg/modules/django_admin/models/action_models.py +33 -0
- django_cfg/modules/django_admin/models/badge_models.py +20 -0
- django_cfg/modules/django_admin/models/base.py +26 -0
- django_cfg/modules/django_admin/models/display_models.py +31 -0
- django_cfg/modules/django_admin/utils/badges.py +159 -0
- django_cfg/modules/django_admin/utils/displays.py +247 -0
- django_cfg/modules/django_currency/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
- django_cfg/modules/django_currency/core/converter.py +12 -12
- django_cfg/modules/django_currency/database/__init__.py +2 -2
- django_cfg/modules/django_currency/database/database_loader.py +93 -42
- django_cfg/modules/django_llm/llm/client.py +10 -2
- django_cfg/modules/django_tasks.py +54 -21
- django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
- django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
- django_cfg/modules/django_unfold/dashboard.py +14 -13
- django_cfg/modules/django_unfold/models/config.py +1 -1
- django_cfg/registry/core.py +7 -9
- django_cfg/registry/third_party.py +2 -2
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -1
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/RECORD +198 -160
- django_cfg/apps/accounts/admin/activity.py +0 -96
- django_cfg/apps/accounts/admin/group.py +0 -17
- django_cfg/apps/accounts/admin/otp.py +0 -59
- django_cfg/apps/accounts/admin/registration_source.py +0 -97
- django_cfg/apps/accounts/admin/twilio_response.py +0 -227
- django_cfg/apps/accounts/admin/user.py +0 -300
- django_cfg/apps/agents/core/agent.py +0 -281
- django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
- django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
- django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
- django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
- django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
- django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
- django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
- django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
- django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
- django_cfg/apps/payments/config/constance/__init__.py +0 -22
- django_cfg/apps/payments/config/constance/config_service.py +0 -123
- django_cfg/apps/payments/config/constance/fields.py +0 -69
- django_cfg/apps/payments/config/constance/settings.py +0 -160
- django_cfg/apps/payments/services/providers/nowpayments.py +0 -478
- django_cfg/apps/tasks/admin.py +0 -320
- django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
- django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
- django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
- django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
- django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
- django_cfg/apps/tasks/templates/tasks/base.html +0 -96
- django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
- django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
- django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
- django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
- django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
- django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
- django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
- django_cfg/apps/tasks/views.py +0 -461
- django_cfg/management/commands/auto_generate.py +0 -486
- django_cfg/middleware/static_nocache.py +0 -55
- django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
- /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
- {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
|
+
|