django-cfg 1.3.7__py3-none-any.whl → 1.3.9__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 +258 -0
- django_cfg/apps/payments/admin/payments_admin.py +171 -461
- 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 +105 -34
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
- django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
- 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/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -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/services/core/currency_service.py +35 -28
- django_cfg/apps/payments/services/core/payment_service.py +1 -1
- django_cfg/apps/payments/services/providers/__init__.py +3 -0
- django_cfg/apps/payments/services/providers/base.py +95 -39
- django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
- django_cfg/apps/payments/services/providers/models/base.py +122 -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.py → nowpayments/provider.py} +240 -209
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
- django_cfg/apps/payments/services/providers/registry.py +4 -32
- django_cfg/apps/payments/services/providers/sync_service.py +277 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
- django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
- 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/urls_admin.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +5 -5
- django_cfg/apps/payments/views/overview/services.py +2 -2
- django_cfg/apps/payments/views/serializers/currencies.py +4 -3
- 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/config.py +1 -1
- django_cfg/core/config.py +10 -5
- django_cfg/core/generation.py +1 -1
- django_cfg/management/commands/__init__.py +13 -1
- django_cfg/management/commands/app_agent_diagnose.py +470 -0
- django_cfg/management/commands/app_agent_generate.py +342 -0
- django_cfg/management/commands/app_agent_info.py +308 -0
- 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/middleware/__init__.py +0 -2
- django_cfg/models/api_keys.py +115 -0
- 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_app_agent/__init__.py +87 -0
- django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
- django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
- django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
- django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
- django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
- django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
- django_cfg/modules/django_app_agent/core/__init__.py +33 -0
- django_cfg/modules/django_app_agent/core/config.py +300 -0
- django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
- django_cfg/modules/django_app_agent/models/__init__.py +71 -0
- django_cfg/modules/django_app_agent/models/base.py +283 -0
- django_cfg/modules/django_app_agent/models/context.py +496 -0
- django_cfg/modules/django_app_agent/models/enums.py +481 -0
- django_cfg/modules/django_app_agent/models/requests.py +500 -0
- django_cfg/modules/django_app_agent/models/responses.py +585 -0
- django_cfg/modules/django_app_agent/pytest.ini +6 -0
- django_cfg/modules/django_app_agent/services/__init__.py +42 -0
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
- django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
- django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
- django_cfg/modules/django_app_agent/services/base.py +437 -0
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
- django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
- django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
- django_cfg/modules/django_app_agent/services/report_service.py +332 -0
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
- django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
- django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
- django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
- django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
- django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
- django_cfg/modules/django_app_agent/ui/cli.py +419 -0
- django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
- django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
- django_cfg/modules/django_app_agent/utils/logging.py +360 -0
- django_cfg/modules/django_app_agent/utils/validation.py +417 -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_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 +3 -0
- 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.9.dist-info}/METADATA +2 -1
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/RECORD +223 -117
- 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/tasks/admin.py +0 -320
- 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.9.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.7.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -5,48 +5,11 @@ Abstract base class for all payment providers with unified interface.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from abc import ABC, abstractmethod
|
8
|
-
from typing import Dict, Any, Optional
|
8
|
+
from typing import Dict, Any, Optional
|
9
9
|
from decimal import Decimal
|
10
|
-
from pydantic import BaseModel, Field
|
11
10
|
from django_cfg.modules.django_logger import get_logger
|
12
11
|
from ..types import ProviderResponse, ServiceOperationResult
|
13
|
-
|
14
|
-
|
15
|
-
class ProviderConfig(BaseModel):
|
16
|
-
"""
|
17
|
-
Base provider configuration.
|
18
|
-
|
19
|
-
Common configuration fields for all payment providers.
|
20
|
-
"""
|
21
|
-
|
22
|
-
provider_name: str = Field(description="Provider name")
|
23
|
-
api_key: str = Field(description="Provider API key")
|
24
|
-
api_url: str = Field(description="Provider API URL")
|
25
|
-
sandbox: bool = Field(default=False, description="Sandbox mode")
|
26
|
-
timeout: int = Field(default=30, description="Request timeout in seconds")
|
27
|
-
retry_attempts: int = Field(default=3, description="Number of retry attempts")
|
28
|
-
retry_delay: int = Field(default=5, description="Delay between retries in seconds")
|
29
|
-
min_amount_usd: float = Field(default=1.0, description="Minimum amount in USD")
|
30
|
-
max_amount_usd: float = Field(default=50000.0, description="Maximum amount in USD")
|
31
|
-
supported_currencies: List[str] = Field(default_factory=list, description="Supported currencies")
|
32
|
-
webhook_secret: Optional[str] = Field(None, description="Webhook secret for validation")
|
33
|
-
|
34
|
-
|
35
|
-
class PaymentRequest(BaseModel):
|
36
|
-
"""
|
37
|
-
Universal payment request for providers.
|
38
|
-
|
39
|
-
Standardized payment creation request across all providers.
|
40
|
-
"""
|
41
|
-
|
42
|
-
amount_usd: float = Field(gt=0, description="Amount in USD")
|
43
|
-
currency_code: str = Field(description="Cryptocurrency code")
|
44
|
-
order_id: str = Field(description="Internal order/payment ID")
|
45
|
-
callback_url: Optional[str] = Field(None, description="Success callback URL")
|
46
|
-
cancel_url: Optional[str] = Field(None, description="Cancel URL")
|
47
|
-
description: Optional[str] = Field(None, description="Payment description")
|
48
|
-
customer_email: Optional[str] = Field(None, description="Customer email")
|
49
|
-
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
12
|
+
from .models import ProviderConfig, PaymentRequest
|
50
13
|
|
51
14
|
|
52
15
|
class BaseProvider(ABC):
|
@@ -77,6 +40,89 @@ class BaseProvider(ABC):
|
|
77
40
|
"""Check if provider is in sandbox mode."""
|
78
41
|
return self.config.sandbox
|
79
42
|
|
43
|
+
# Provider configuration methods (to be overridden by specific providers)
|
44
|
+
def get_fee_percentage(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
45
|
+
"""
|
46
|
+
Get fee percentage for currency.
|
47
|
+
|
48
|
+
Args:
|
49
|
+
currency_code: Currency code (e.g., 'BTC', 'ETH')
|
50
|
+
currency_type: Currency type ('fiat', 'crypto')
|
51
|
+
|
52
|
+
Returns:
|
53
|
+
Fee percentage as decimal (0.005 = 0.5%)
|
54
|
+
"""
|
55
|
+
return Decimal('0.005') # Default 0.5%
|
56
|
+
|
57
|
+
def get_fixed_fee_usd(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
58
|
+
"""
|
59
|
+
Get fixed fee in USD for currency.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
currency_code: Currency code (e.g., 'BTC', 'ETH')
|
63
|
+
currency_type: Currency type ('fiat', 'crypto')
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
Fixed fee in USD
|
67
|
+
"""
|
68
|
+
return Decimal('0.0') # Default no fixed fee
|
69
|
+
|
70
|
+
def get_min_amount_usd(self, currency_code: str = None, currency_type: str = None, is_stable: bool = False) -> Decimal:
|
71
|
+
"""
|
72
|
+
Get minimum amount in USD for currency.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
currency_code: Currency code (e.g., 'BTC', 'ETH')
|
76
|
+
currency_type: Currency type ('fiat', 'crypto')
|
77
|
+
is_stable: Whether currency is a stablecoin
|
78
|
+
|
79
|
+
Returns:
|
80
|
+
Minimum amount in USD
|
81
|
+
"""
|
82
|
+
if currency_type == 'fiat':
|
83
|
+
return Decimal('1.0')
|
84
|
+
elif is_stable:
|
85
|
+
return Decimal('0.01')
|
86
|
+
else:
|
87
|
+
return Decimal('0.000001')
|
88
|
+
|
89
|
+
def get_max_amount_usd(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
90
|
+
"""
|
91
|
+
Get maximum amount in USD for currency.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
currency_code: Currency code (e.g., 'BTC', 'ETH')
|
95
|
+
currency_type: Currency type ('fiat', 'crypto')
|
96
|
+
|
97
|
+
Returns:
|
98
|
+
Maximum amount in USD
|
99
|
+
"""
|
100
|
+
return Decimal('1000000.0') # Default 1M USD
|
101
|
+
|
102
|
+
def get_confirmation_blocks(self, network_code: str) -> int:
|
103
|
+
"""
|
104
|
+
Get confirmation blocks for network.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
network_code: Network code (e.g., 'btc', 'eth')
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
Number of confirmation blocks
|
111
|
+
"""
|
112
|
+
return 1 # Default 1 confirmation
|
113
|
+
|
114
|
+
def get_network_name(self, network_code: str) -> str:
|
115
|
+
"""
|
116
|
+
Get human-readable network name.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
network_code: Network code (e.g., 'btc', 'eth')
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
Human-readable network name
|
123
|
+
"""
|
124
|
+
return network_code.upper() if network_code else 'Unknown'
|
125
|
+
|
80
126
|
@abstractmethod
|
81
127
|
def create_payment(self, request: PaymentRequest) -> ProviderResponse:
|
82
128
|
"""
|
@@ -113,6 +159,16 @@ class BaseProvider(ABC):
|
|
113
159
|
"""
|
114
160
|
pass
|
115
161
|
|
162
|
+
@abstractmethod
|
163
|
+
def sync_currencies_to_db(self):
|
164
|
+
"""
|
165
|
+
Sync currencies from provider API to database.
|
166
|
+
|
167
|
+
Returns:
|
168
|
+
CurrencySyncResult: Synchronization result
|
169
|
+
"""
|
170
|
+
pass
|
171
|
+
|
116
172
|
@abstractmethod
|
117
173
|
def validate_webhook(self, payload: Dict[str, Any], signature: str = None) -> ServiceOperationResult:
|
118
174
|
"""
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""
|
2
|
+
Universal provider models for Universal Payment System v2.0.
|
3
|
+
|
4
|
+
Common models used across all payment providers.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .base import (
|
8
|
+
ProviderConfig,
|
9
|
+
PaymentRequest,
|
10
|
+
ProviderMetadata,
|
11
|
+
ProviderType,
|
12
|
+
ProviderStatus
|
13
|
+
)
|
14
|
+
from .universal import (
|
15
|
+
UniversalCurrency,
|
16
|
+
UniversalCurrenciesResponse,
|
17
|
+
CurrencySyncResult
|
18
|
+
)
|
19
|
+
from .providers import (
|
20
|
+
ProviderEnum,
|
21
|
+
PROVIDER_METADATA
|
22
|
+
)
|
23
|
+
|
24
|
+
__all__ = [
|
25
|
+
# Base models
|
26
|
+
'ProviderConfig',
|
27
|
+
'PaymentRequest',
|
28
|
+
'ProviderMetadata',
|
29
|
+
'ProviderType',
|
30
|
+
'ProviderStatus',
|
31
|
+
|
32
|
+
# Universal models
|
33
|
+
'UniversalCurrency',
|
34
|
+
'UniversalCurrenciesResponse',
|
35
|
+
'CurrencySyncResult',
|
36
|
+
|
37
|
+
# Provider definitions
|
38
|
+
'ProviderEnum',
|
39
|
+
'PROVIDER_METADATA'
|
40
|
+
]
|
@@ -0,0 +1,122 @@
|
|
1
|
+
"""
|
2
|
+
Base provider models for Universal Payment System v2.0.
|
3
|
+
|
4
|
+
Core Pydantic models for provider configuration and requests.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Dict, Any, Optional, List
|
8
|
+
from decimal import Decimal
|
9
|
+
from pydantic import BaseModel, Field, ConfigDict
|
10
|
+
from enum import Enum
|
11
|
+
|
12
|
+
|
13
|
+
class ProviderType(str, Enum):
|
14
|
+
"""Provider type classification."""
|
15
|
+
|
16
|
+
CRYPTO = "crypto"
|
17
|
+
FIAT = "fiat"
|
18
|
+
HYBRID = "hybrid" # Supports both fiat and crypto
|
19
|
+
|
20
|
+
|
21
|
+
class ProviderStatus(str, Enum):
|
22
|
+
"""Provider operational status."""
|
23
|
+
|
24
|
+
ACTIVE = "active"
|
25
|
+
MAINTENANCE = "maintenance"
|
26
|
+
DEPRECATED = "deprecated"
|
27
|
+
DISABLED = "disabled"
|
28
|
+
|
29
|
+
|
30
|
+
class ProviderConfig(BaseModel):
|
31
|
+
"""
|
32
|
+
Base provider configuration with Pydantic v2.
|
33
|
+
|
34
|
+
Common configuration fields for all payment providers.
|
35
|
+
"""
|
36
|
+
model_config = ConfigDict(
|
37
|
+
validate_assignment=True,
|
38
|
+
extra="forbid",
|
39
|
+
str_strip_whitespace=True,
|
40
|
+
frozen=False
|
41
|
+
)
|
42
|
+
|
43
|
+
provider_name: str = Field(..., description="Provider name")
|
44
|
+
api_key: str = Field(..., description="Provider API key")
|
45
|
+
api_url: str = Field(..., description="Provider API URL")
|
46
|
+
enabled: bool = Field(default=True, description="Whether provider is enabled")
|
47
|
+
sandbox: bool = Field(default=False, description="Sandbox mode")
|
48
|
+
sandbox_mode: bool = Field(default=False, description="Sandbox mode (alias for sandbox)")
|
49
|
+
timeout: int = Field(default=30, ge=5, le=300, description="Request timeout in seconds")
|
50
|
+
retry_attempts: int = Field(default=3, ge=0, le=10, description="Number of retry attempts")
|
51
|
+
retry_delay: int = Field(default=5, ge=1, le=60, description="Delay between retries in seconds")
|
52
|
+
min_amount_usd: float = Field(default=1.0, ge=0.01, description="Minimum amount in USD")
|
53
|
+
max_amount_usd: float = Field(default=50000.0, ge=1.0, description="Maximum amount in USD")
|
54
|
+
supported_currencies: List[str] = Field(default_factory=list, description="Supported currencies")
|
55
|
+
webhook_secret: Optional[str] = Field(None, description="Webhook secret for validation")
|
56
|
+
|
57
|
+
|
58
|
+
class PaymentRequest(BaseModel):
|
59
|
+
"""
|
60
|
+
Universal payment request for providers with Pydantic v2.
|
61
|
+
|
62
|
+
Standardized payment creation request across all providers.
|
63
|
+
"""
|
64
|
+
model_config = ConfigDict(
|
65
|
+
validate_assignment=True,
|
66
|
+
extra="forbid",
|
67
|
+
str_strip_whitespace=True
|
68
|
+
)
|
69
|
+
|
70
|
+
amount_usd: float = Field(..., gt=0, description="Amount in USD")
|
71
|
+
currency_code: str = Field(..., min_length=3, max_length=10, description="Currency code")
|
72
|
+
order_id: str = Field(..., min_length=1, max_length=100, description="Internal order/payment ID")
|
73
|
+
callback_url: Optional[str] = Field(None, description="Success callback URL")
|
74
|
+
cancel_url: Optional[str] = Field(None, description="Cancel URL")
|
75
|
+
description: Optional[str] = Field(None, max_length=500, description="Payment description")
|
76
|
+
customer_email: Optional[str] = Field(None, description="Customer email")
|
77
|
+
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
78
|
+
|
79
|
+
|
80
|
+
class ProviderMetadata(BaseModel):
|
81
|
+
"""
|
82
|
+
Provider metadata with classification and features.
|
83
|
+
|
84
|
+
Contains provider-specific information for routing and display.
|
85
|
+
"""
|
86
|
+
model_config = ConfigDict(
|
87
|
+
validate_assignment=True,
|
88
|
+
extra="forbid",
|
89
|
+
frozen=True # Metadata should be immutable
|
90
|
+
)
|
91
|
+
|
92
|
+
name: str = Field(..., description="Human-readable provider name")
|
93
|
+
provider_type: ProviderType = Field(..., description="Provider type (crypto/fiat/hybrid)")
|
94
|
+
status: ProviderStatus = Field(default=ProviderStatus.ACTIVE, description="Provider status")
|
95
|
+
priority: int = Field(default=100, ge=0, le=1000, description="Provider priority (lower = higher priority)")
|
96
|
+
|
97
|
+
# Feature flags
|
98
|
+
supports_fiat: bool = Field(default=False, description="Supports fiat currencies")
|
99
|
+
supports_crypto: bool = Field(default=True, description="Supports cryptocurrencies")
|
100
|
+
supports_webhooks: bool = Field(default=True, description="Supports webhook notifications")
|
101
|
+
supports_refunds: bool = Field(default=False, description="Supports payment refunds")
|
102
|
+
supports_partial_payments: bool = Field(default=False, description="Supports partial payments")
|
103
|
+
|
104
|
+
# Limits and fees
|
105
|
+
min_amount_usd: float = Field(default=1.0, ge=0.01, description="Minimum payment amount in USD")
|
106
|
+
max_amount_usd: float = Field(default=50000.0, ge=1.0, description="Maximum payment amount in USD")
|
107
|
+
fee_percentage: float = Field(default=0.0, ge=0.0, le=100.0, description="Fee percentage")
|
108
|
+
fixed_fee_usd: float = Field(default=0.0, ge=0.0, description="Fixed fee in USD")
|
109
|
+
|
110
|
+
# Geographic and regulatory
|
111
|
+
supported_countries: List[str] = Field(default_factory=list, description="Supported country codes")
|
112
|
+
restricted_countries: List[str] = Field(default_factory=list, description="Restricted country codes")
|
113
|
+
requires_kyc: bool = Field(default=False, description="Requires KYC verification")
|
114
|
+
|
115
|
+
# Technical details
|
116
|
+
api_version: str = Field(default="v1", description="API version")
|
117
|
+
documentation_url: Optional[str] = Field(None, description="API documentation URL")
|
118
|
+
status_page_url: Optional[str] = Field(None, description="Provider status page URL")
|
119
|
+
|
120
|
+
# Additional metadata
|
121
|
+
tags: List[str] = Field(default_factory=list, description="Provider tags for categorization")
|
122
|
+
description: Optional[str] = Field(None, max_length=500, description="Provider description")
|
@@ -0,0 +1,87 @@
|
|
1
|
+
"""
|
2
|
+
Provider enums and metadata for Universal Payment System v2.0.
|
3
|
+
|
4
|
+
Provider definitions with comprehensive metadata.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from enum import Enum
|
8
|
+
from typing import List, Dict
|
9
|
+
from .base import ProviderMetadata, ProviderType, ProviderStatus
|
10
|
+
|
11
|
+
|
12
|
+
class ProviderEnum(Enum):
|
13
|
+
"""Enumeration of supported payment providers."""
|
14
|
+
|
15
|
+
NOWPAYMENTS = "nowpayments"
|
16
|
+
|
17
|
+
@classmethod
|
18
|
+
def get_all_providers(cls) -> List[str]:
|
19
|
+
"""Get list of all provider values."""
|
20
|
+
return [provider.value for provider in cls]
|
21
|
+
|
22
|
+
@classmethod
|
23
|
+
def is_valid_provider(cls, provider_name: str) -> bool:
|
24
|
+
"""Check if provider name is valid."""
|
25
|
+
return provider_name in cls.get_all_providers()
|
26
|
+
|
27
|
+
@classmethod
|
28
|
+
def get_crypto_providers(cls) -> List[str]:
|
29
|
+
"""Get list of crypto-supporting providers."""
|
30
|
+
return [
|
31
|
+
provider.value for provider in cls
|
32
|
+
if PROVIDER_METADATA[provider.value].supports_crypto
|
33
|
+
]
|
34
|
+
|
35
|
+
@classmethod
|
36
|
+
def get_fiat_providers(cls) -> List[str]:
|
37
|
+
"""Get list of fiat-supporting providers."""
|
38
|
+
return [
|
39
|
+
provider.value for provider in cls
|
40
|
+
if PROVIDER_METADATA[provider.value].supports_fiat
|
41
|
+
]
|
42
|
+
|
43
|
+
@classmethod
|
44
|
+
def get_active_providers(cls) -> List[str]:
|
45
|
+
"""Get list of active providers."""
|
46
|
+
return [
|
47
|
+
provider.value for provider in cls
|
48
|
+
if PROVIDER_METADATA[provider.value].status == ProviderStatus.ACTIVE
|
49
|
+
]
|
50
|
+
|
51
|
+
|
52
|
+
# Provider metadata registry
|
53
|
+
PROVIDER_METADATA: Dict[str, ProviderMetadata] = {
|
54
|
+
ProviderEnum.NOWPAYMENTS.value: ProviderMetadata(
|
55
|
+
name="NowPayments",
|
56
|
+
provider_type=ProviderType.CRYPTO,
|
57
|
+
status=ProviderStatus.ACTIVE,
|
58
|
+
priority=10, # High priority
|
59
|
+
|
60
|
+
# Features
|
61
|
+
supports_fiat=False,
|
62
|
+
supports_crypto=True,
|
63
|
+
supports_webhooks=True,
|
64
|
+
supports_refunds=False,
|
65
|
+
supports_partial_payments=False,
|
66
|
+
|
67
|
+
# Limits and fees
|
68
|
+
min_amount_usd=1.0,
|
69
|
+
max_amount_usd=50000.0,
|
70
|
+
fee_percentage=0.5, # 0.5% fee
|
71
|
+
fixed_fee_usd=0.0,
|
72
|
+
|
73
|
+
# Geographic
|
74
|
+
supported_countries=[], # Global support
|
75
|
+
restricted_countries=["US"], # Example restriction
|
76
|
+
requires_kyc=False,
|
77
|
+
|
78
|
+
# Technical
|
79
|
+
api_version="v1",
|
80
|
+
documentation_url="https://documenter.getpostman.com/view/7907941/S1a32n38",
|
81
|
+
status_page_url="https://status.nowpayments.io/",
|
82
|
+
|
83
|
+
# Additional
|
84
|
+
tags=["crypto", "bitcoin", "ethereum", "altcoins", "instant"],
|
85
|
+
description="Cryptocurrency payment processor supporting 300+ cryptocurrencies with instant settlements"
|
86
|
+
)
|
87
|
+
}
|
@@ -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
|