django-cfg 1.2.29__py3-none-any.whl → 1.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/api/health/views.py +4 -2
- django_cfg/apps/knowbase/config/settings.py +16 -15
- django_cfg/apps/payments/README.md +326 -0
- django_cfg/apps/payments/admin/__init__.py +20 -9
- django_cfg/apps/payments/admin/api_keys_admin.py +521 -237
- django_cfg/apps/payments/admin/balance_admin.py +592 -297
- django_cfg/apps/payments/admin/currencies_admin.py +600 -108
- django_cfg/apps/payments/admin/filters.py +306 -199
- django_cfg/apps/payments/admin/payments_admin.py +470 -64
- django_cfg/apps/payments/admin/subscriptions_admin.py +578 -128
- django_cfg/apps/payments/admin_interface/__init__.py +18 -0
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +162 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +38 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/loading_spinner.html +16 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/notification.html +27 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_card.html +86 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +39 -0
- django_cfg/apps/payments/admin_interface/templates/payments/currency_converter.html +382 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +300 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +303 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +382 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_status.html +500 -0
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +594 -0
- django_cfg/apps/payments/admin_interface/views/__init__.py +23 -0
- django_cfg/apps/payments/admin_interface/views/payment_views.py +259 -0
- django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +37 -0
- django_cfg/apps/payments/apps.py +34 -9
- django_cfg/apps/payments/config/__init__.py +28 -51
- django_cfg/apps/payments/config/constance/__init__.py +22 -0
- django_cfg/apps/payments/config/constance/config_service.py +123 -0
- django_cfg/apps/payments/config/constance/fields.py +69 -0
- django_cfg/apps/payments/config/constance/settings.py +160 -0
- django_cfg/apps/payments/config/django_cfg_integration.py +202 -0
- django_cfg/apps/payments/config/helpers.py +130 -0
- django_cfg/apps/payments/management/__init__.py +1 -3
- django_cfg/apps/payments/management/commands/__init__.py +1 -3
- django_cfg/apps/payments/management/commands/manage_currencies.py +381 -0
- django_cfg/apps/payments/management/commands/manage_providers.py +408 -0
- django_cfg/apps/payments/middleware/__init__.py +3 -1
- django_cfg/apps/payments/middleware/api_access.py +329 -222
- django_cfg/apps/payments/middleware/rate_limiting.py +343 -163
- django_cfg/apps/payments/middleware/usage_tracking.py +250 -238
- django_cfg/apps/payments/migrations/0001_initial.py +708 -536
- django_cfg/apps/payments/models/__init__.py +16 -20
- django_cfg/apps/payments/models/api_keys.py +121 -43
- django_cfg/apps/payments/models/balance.py +150 -115
- django_cfg/apps/payments/models/base.py +68 -15
- django_cfg/apps/payments/models/currencies.py +207 -67
- django_cfg/apps/payments/models/managers/__init__.py +44 -0
- django_cfg/apps/payments/models/managers/api_key_managers.py +329 -0
- django_cfg/apps/payments/models/managers/balance_managers.py +599 -0
- django_cfg/apps/payments/models/managers/currency_managers.py +385 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +511 -0
- django_cfg/apps/payments/models/managers/subscription_managers.py +641 -0
- django_cfg/apps/payments/models/payments.py +235 -284
- django_cfg/apps/payments/models/subscriptions.py +257 -177
- django_cfg/apps/payments/models/tariffs.py +147 -40
- django_cfg/apps/payments/services/__init__.py +209 -56
- django_cfg/apps/payments/services/cache/__init__.py +6 -6
- django_cfg/apps/payments/services/cache/{simple_cache.py → cache_service.py} +112 -12
- django_cfg/apps/payments/services/core/__init__.py +10 -6
- django_cfg/apps/payments/services/core/balance_service.py +435 -360
- django_cfg/apps/payments/services/core/base.py +166 -0
- django_cfg/apps/payments/services/core/currency_service.py +478 -0
- django_cfg/apps/payments/services/core/payment_service.py +344 -468
- django_cfg/apps/payments/services/core/subscription_service.py +425 -484
- django_cfg/apps/payments/services/core/webhook_service.py +410 -0
- django_cfg/apps/payments/services/integrations/__init__.py +29 -0
- django_cfg/apps/payments/services/integrations/ngrok_service.py +47 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +107 -0
- django_cfg/apps/payments/services/providers/__init__.py +9 -14
- django_cfg/apps/payments/services/providers/base.py +232 -71
- django_cfg/apps/payments/services/providers/nowpayments.py +404 -219
- django_cfg/apps/payments/services/providers/registry.py +429 -80
- django_cfg/apps/payments/services/types/__init__.py +78 -0
- django_cfg/apps/payments/services/types/data.py +177 -0
- django_cfg/apps/payments/services/types/requests.py +150 -0
- django_cfg/apps/payments/services/types/responses.py +156 -0
- django_cfg/apps/payments/services/types/webhooks.py +232 -0
- django_cfg/apps/payments/signals/__init__.py +33 -8
- django_cfg/apps/payments/signals/api_key_signals.py +211 -130
- django_cfg/apps/payments/signals/balance_signals.py +174 -0
- django_cfg/apps/payments/signals/payment_signals.py +129 -98
- django_cfg/apps/payments/signals/subscription_signals.py +195 -143
- django_cfg/apps/payments/static/payments/css/components.css +380 -0
- django_cfg/apps/payments/static/payments/css/dashboard.css +188 -0
- django_cfg/apps/payments/static/payments/js/components.js +545 -0
- django_cfg/apps/payments/static/payments/js/utils.js +412 -0
- django_cfg/apps/payments/templatetags/__init__.py +1 -1
- django_cfg/apps/payments/templatetags/payment_tags.py +466 -0
- django_cfg/apps/payments/urls.py +46 -47
- django_cfg/apps/payments/urls_admin.py +49 -0
- django_cfg/apps/payments/views/api/__init__.py +101 -0
- django_cfg/apps/payments/views/api/api_keys.py +387 -0
- django_cfg/apps/payments/views/api/balances.py +381 -0
- django_cfg/apps/payments/views/api/base.py +298 -0
- django_cfg/apps/payments/views/api/currencies.py +402 -0
- django_cfg/apps/payments/views/api/payments.py +415 -0
- django_cfg/apps/payments/views/api/subscriptions.py +475 -0
- django_cfg/apps/payments/views/api/webhooks.py +476 -0
- django_cfg/apps/payments/views/serializers/__init__.py +99 -0
- django_cfg/apps/payments/views/serializers/api_keys.py +424 -0
- django_cfg/apps/payments/views/serializers/balances.py +300 -0
- django_cfg/apps/payments/views/serializers/currencies.py +335 -0
- django_cfg/apps/payments/views/serializers/payments.py +387 -0
- django_cfg/apps/payments/views/serializers/subscriptions.py +429 -0
- django_cfg/apps/payments/views/serializers/webhooks.py +137 -0
- django_cfg/apps/tasks/urls.py +0 -2
- django_cfg/apps/tasks/urls_admin.py +14 -0
- django_cfg/apps/urls.py +4 -4
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +75 -4
- django_cfg/core/generation.py +25 -4
- django_cfg/core/integration/README.md +363 -0
- django_cfg/core/integration/__init__.py +47 -0
- django_cfg/core/integration/commands_collector.py +239 -0
- django_cfg/core/integration/display/__init__.py +15 -0
- django_cfg/core/integration/display/base.py +157 -0
- django_cfg/core/integration/display/ngrok.py +164 -0
- django_cfg/core/integration/display/startup.py +815 -0
- django_cfg/core/integration/url_integration.py +123 -0
- django_cfg/core/integration/version_checker.py +160 -0
- django_cfg/management/commands/auto_generate.py +4 -0
- django_cfg/management/commands/check_settings.py +6 -0
- django_cfg/management/commands/clear_constance.py +5 -2
- django_cfg/management/commands/create_token.py +6 -0
- django_cfg/management/commands/list_urls.py +6 -0
- django_cfg/management/commands/migrate_all.py +6 -0
- django_cfg/management/commands/migrator.py +3 -0
- django_cfg/management/commands/rundramatiq.py +6 -0
- django_cfg/management/commands/runserver_ngrok.py +51 -29
- django_cfg/management/commands/script.py +6 -0
- django_cfg/management/commands/show_config.py +12 -2
- django_cfg/management/commands/show_urls.py +4 -0
- django_cfg/management/commands/superuser.py +6 -0
- django_cfg/management/commands/task_clear.py +4 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -0
- django_cfg/management/commands/test_telegram.py +6 -0
- django_cfg/management/commands/test_twilio.py +6 -0
- django_cfg/management/commands/tree.py +6 -0
- django_cfg/management/commands/validate_config.py +155 -149
- django_cfg/models/constance.py +31 -11
- django_cfg/models/payments.py +175 -498
- django_cfg/modules/django_currency/__init__.py +16 -11
- django_cfg/modules/django_currency/clients/__init__.py +4 -4
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +289 -0
- django_cfg/modules/django_currency/clients/yahoo_client.py +157 -0
- django_cfg/modules/django_currency/core/__init__.py +1 -7
- django_cfg/modules/django_currency/core/converter.py +18 -23
- django_cfg/modules/django_currency/core/models.py +122 -11
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +190 -309
- django_cfg/modules/django_logger.py +160 -146
- django_cfg/modules/django_unfold/dashboard.py +65 -12
- django_cfg/registry/core.py +1 -0
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/admin/components/action_grid.html +9 -9
- django_cfg/templates/admin/components/metric_card.html +5 -5
- django_cfg/templates/admin/components/status_badge.html +2 -2
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +152 -24
- django_cfg/templates/admin/snippets/components/quick_actions.html +3 -3
- django_cfg/templates/admin/snippets/components/system_health.html +1 -1
- django_cfg/templates/admin/snippets/tabs/overview_tab.html +49 -52
- django_cfg/utils/smart_defaults.py +222 -571
- django_cfg/utils/toolkit.py +51 -11
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/METADATA +5 -4
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/RECORD +172 -182
- django_cfg/apps/payments/__init__.py +0 -8
- django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
- django_cfg/apps/payments/config/module.py +0 -70
- django_cfg/apps/payments/config/providers.py +0 -105
- django_cfg/apps/payments/config/settings.py +0 -96
- django_cfg/apps/payments/config/utils.py +0 -52
- django_cfg/apps/payments/decorators.py +0 -291
- django_cfg/apps/payments/management/commands/README.md +0 -178
- django_cfg/apps/payments/management/commands/currency_stats.py +0 -323
- django_cfg/apps/payments/management/commands/populate_currencies.py +0 -246
- django_cfg/apps/payments/management/commands/update_currencies.py +0 -336
- django_cfg/apps/payments/managers/__init__.py +0 -22
- django_cfg/apps/payments/managers/api_key_manager.py +0 -35
- django_cfg/apps/payments/managers/balance_manager.py +0 -361
- django_cfg/apps/payments/managers/currency_manager.py +0 -83
- django_cfg/apps/payments/managers/payment_manager.py +0 -44
- django_cfg/apps/payments/managers/subscription_manager.py +0 -37
- django_cfg/apps/payments/managers/tariff_manager.py +0 -29
- django_cfg/apps/payments/models/events.py +0 -73
- django_cfg/apps/payments/serializers/__init__.py +0 -56
- django_cfg/apps/payments/serializers/api_keys.py +0 -51
- django_cfg/apps/payments/serializers/balance.py +0 -59
- django_cfg/apps/payments/serializers/currencies.py +0 -55
- django_cfg/apps/payments/serializers/payments.py +0 -62
- django_cfg/apps/payments/serializers/subscriptions.py +0 -71
- django_cfg/apps/payments/serializers/tariffs.py +0 -56
- django_cfg/apps/payments/services/billing/__init__.py +0 -8
- django_cfg/apps/payments/services/cache/base.py +0 -30
- django_cfg/apps/payments/services/core/fallback_service.py +0 -432
- django_cfg/apps/payments/services/internal_types.py +0 -297
- django_cfg/apps/payments/services/middleware/__init__.py +0 -8
- django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
- django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -222
- django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
- django_cfg/apps/payments/services/providers/cryptapi.py +0 -273
- django_cfg/apps/payments/services/providers/cryptomus.py +0 -311
- django_cfg/apps/payments/services/security/__init__.py +0 -34
- django_cfg/apps/payments/services/security/error_handler.py +0 -637
- django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
- django_cfg/apps/payments/services/security/webhook_validator.py +0 -475
- django_cfg/apps/payments/services/validators/__init__.py +0 -8
- django_cfg/apps/payments/static/payments/css/payments.css +0 -340
- django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
- django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
- django_cfg/apps/payments/static/payments/js/theme.js +0 -86
- django_cfg/apps/payments/tasks/__init__.py +0 -12
- django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
- django_cfg/apps/payments/templates/payments/base.html +0 -182
- django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
- django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
- django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -36
- django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
- django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -27
- django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -144
- django_cfg/apps/payments/templates/payments/dashboard.html +0 -346
- django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
- django_cfg/apps/payments/urls_templates.py +0 -52
- django_cfg/apps/payments/utils/__init__.py +0 -45
- django_cfg/apps/payments/utils/billing_utils.py +0 -342
- django_cfg/apps/payments/utils/config_utils.py +0 -245
- django_cfg/apps/payments/utils/middleware_utils.py +0 -228
- django_cfg/apps/payments/utils/validation_utils.py +0 -94
- django_cfg/apps/payments/views/__init__.py +0 -62
- django_cfg/apps/payments/views/api_key_views.py +0 -164
- django_cfg/apps/payments/views/balance_views.py +0 -75
- django_cfg/apps/payments/views/currency_views.py +0 -111
- django_cfg/apps/payments/views/payment_views.py +0 -149
- django_cfg/apps/payments/views/subscription_views.py +0 -135
- django_cfg/apps/payments/views/tariff_views.py +0 -131
- django_cfg/apps/payments/views/templates/__init__.py +0 -25
- django_cfg/apps/payments/views/templates/ajax.py +0 -312
- django_cfg/apps/payments/views/templates/base.py +0 -204
- django_cfg/apps/payments/views/templates/dashboard.py +0 -60
- django_cfg/apps/payments/views/templates/payment_detail.py +0 -102
- django_cfg/apps/payments/views/templates/payment_management.py +0 -164
- django_cfg/apps/payments/views/templates/qr_code.py +0 -174
- django_cfg/apps/payments/views/templates/stats.py +0 -240
- django_cfg/apps/payments/views/templates/utils.py +0 -181
- django_cfg/apps/payments/views/webhook_views.py +0 -266
- django_cfg/apps/payments/viewsets.py +0 -65
- django_cfg/core/integration.py +0 -160
- django_cfg/modules/django_currency/clients/coingecko_client.py +0 -257
- django_cfg/modules/django_currency/clients/yfinance_client.py +0 -246
- django_cfg/template_archive/.gitignore +0 -1
- django_cfg/template_archive/__init__.py +0 -0
- django_cfg/urls.py +0 -33
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py
CHANGED
@@ -17,6 +17,8 @@ from django.core.cache import cache
|
|
17
17
|
from django.conf import settings
|
18
18
|
from django.utils import timezone
|
19
19
|
|
20
|
+
from django_cfg.core.integration import get_current_version
|
21
|
+
|
20
22
|
|
21
23
|
class HealthCheckView(View):
|
22
24
|
"""
|
@@ -40,7 +42,7 @@ class HealthCheckView(View):
|
|
40
42
|
"status": "healthy",
|
41
43
|
"timestamp": timezone.now().isoformat(),
|
42
44
|
"service": config.project_name if config else "Django CFG",
|
43
|
-
"version":
|
45
|
+
"version": get_current_version(),
|
44
46
|
"checks": {}
|
45
47
|
}
|
46
48
|
except Exception:
|
@@ -48,7 +50,7 @@ class HealthCheckView(View):
|
|
48
50
|
"status": "healthy",
|
49
51
|
"timestamp": timezone.now().isoformat(),
|
50
52
|
"service": "Django CFG",
|
51
|
-
"version":
|
53
|
+
"version": get_current_version(),
|
52
54
|
"checks": {}
|
53
55
|
}
|
54
56
|
|
@@ -71,22 +71,23 @@ class EmbeddingConfig(BaseModel):
|
|
71
71
|
description="Maximum number of items in memory cache"
|
72
72
|
)
|
73
73
|
|
74
|
-
#
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
74
|
+
# >> Old variant, should be imported from CfgConfig
|
75
|
+
# # API Keys from environment
|
76
|
+
# @property
|
77
|
+
# def openai_api_key(self) -> Optional[str]:
|
78
|
+
# """Get OpenAI API key from environment configuration."""
|
79
|
+
# try:
|
80
|
+
# return settings.api_keys.openai
|
81
|
+
# except AttributeError:
|
82
|
+
# return os.getenv("OPENAI_API_KEY")
|
82
83
|
|
83
|
-
@property
|
84
|
-
def openrouter_api_key(self) -> Optional[str]:
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
84
|
+
# @property
|
85
|
+
# def openrouter_api_key(self) -> Optional[str]:
|
86
|
+
# """Get OpenRouter API key from environment configuration."""
|
87
|
+
# try:
|
88
|
+
# return settings.api_keys.openrouter
|
89
|
+
# except AttributeError:
|
90
|
+
# return os.getenv("OPENROUTER_API_KEY")
|
90
91
|
|
91
92
|
|
92
93
|
class ChunkingConfig(BaseModel):
|
@@ -0,0 +1,326 @@
|
|
1
|
+
# Universal Payment System v2.0
|
2
|
+
|
3
|
+
🚀 **Complete payment system with webhook support, provider management, and modern dashboard.**
|
4
|
+
|
5
|
+
## 🏗️ Architecture Overview
|
6
|
+
|
7
|
+
Built using **Skyscraper Architecture** - 8 levels from foundation to integration:
|
8
|
+
|
9
|
+
```
|
10
|
+
Level 7: Integration Layer │ ✅ Webhooks, Templates, URLs
|
11
|
+
Level 6: Interface Layer │ ✅ Admin, Management, Dashboard
|
12
|
+
Level 5: API Layer │ ✅ REST API, ViewSets, Serializers
|
13
|
+
Level 4: Service Layer │ ✅ PaymentService, ProviderRegistry
|
14
|
+
Level 3: Business Logic │ ✅ Signals, Middleware, Managers
|
15
|
+
Level 2: Data Layer │ ✅ Models, Migrations, Relationships
|
16
|
+
Level 1: Infrastructure │ ✅ Cache, Config, Ready Modules
|
17
|
+
Level 0: Foundation │ ✅ Django, PostgreSQL, Redis, Python
|
18
|
+
```
|
19
|
+
|
20
|
+
## 🚀 Quick Start
|
21
|
+
|
22
|
+
### 1. Installation
|
23
|
+
|
24
|
+
```bash
|
25
|
+
# Add to INSTALLED_APPS
|
26
|
+
INSTALLED_APPS = [
|
27
|
+
# ...
|
28
|
+
'django_cfg.apps.payments',
|
29
|
+
# ...
|
30
|
+
]
|
31
|
+
|
32
|
+
# Include URLs
|
33
|
+
urlpatterns = [
|
34
|
+
# External API (requires API keys)
|
35
|
+
path('payments/api/', include('django_cfg.apps.payments.urls_api')),
|
36
|
+
|
37
|
+
# Internal admin (requires staff access)
|
38
|
+
path('payments/admin/', include('django_cfg.apps.payments.urls_admin')),
|
39
|
+
]
|
40
|
+
```
|
41
|
+
|
42
|
+
### 2. Development with Ngrok
|
43
|
+
|
44
|
+
```bash
|
45
|
+
# Start development server with ngrok tunnel
|
46
|
+
python manage.py runserver_ngrok
|
47
|
+
|
48
|
+
# Access webhook dashboard
|
49
|
+
http://localhost:8000/payments/admin/webhooks/
|
50
|
+
```
|
51
|
+
|
52
|
+
### 3. Provider Configuration
|
53
|
+
|
54
|
+
The system automatically detects providers from `ProviderRegistry`. No hardcoded providers!
|
55
|
+
|
56
|
+
```python
|
57
|
+
# Providers are loaded dynamically from registry
|
58
|
+
from django_cfg.apps.payments.services.providers.registry import get_provider_registry
|
59
|
+
|
60
|
+
registry = get_provider_registry()
|
61
|
+
providers = registry.list_available_providers() # ['nowpayments', ...]
|
62
|
+
```
|
63
|
+
|
64
|
+
## 📡 Webhook System
|
65
|
+
|
66
|
+
### Universal Webhook Handler
|
67
|
+
|
68
|
+
```python
|
69
|
+
# Supports any provider dynamically
|
70
|
+
POST /payments/api/webhooks/{provider}/
|
71
|
+
|
72
|
+
# Examples:
|
73
|
+
POST /payments/api/webhooks/nowpayments/
|
74
|
+
POST /payments/api/webhooks/stripe/
|
75
|
+
POST /payments/api/webhooks/new_provider/ # Automatically supported!
|
76
|
+
```
|
77
|
+
|
78
|
+
### Provider Management
|
79
|
+
|
80
|
+
```python
|
81
|
+
# Get webhook URLs for all providers
|
82
|
+
GET /payments/api/webhooks/providers/
|
83
|
+
|
84
|
+
# Response:
|
85
|
+
{
|
86
|
+
"success": true,
|
87
|
+
"providers": [
|
88
|
+
{
|
89
|
+
"name": "nowpayments",
|
90
|
+
"display_name": "NowPayments",
|
91
|
+
"webhook_url": "https://abc123.ngrok.io/payments/api/webhooks/nowpayments/",
|
92
|
+
"signature_header": "x-nowpayments-sig",
|
93
|
+
"signature_algorithm": "HMAC-SHA512",
|
94
|
+
"icon": "💎"
|
95
|
+
}
|
96
|
+
]
|
97
|
+
}
|
98
|
+
```
|
99
|
+
|
100
|
+
### Security Features
|
101
|
+
|
102
|
+
- ✅ **Signature Validation** - Provider-specific HMAC verification
|
103
|
+
- ✅ **Replay Protection** - Request ID tracking and deduplication
|
104
|
+
- ✅ **Rate Limiting** - Configurable per-provider limits
|
105
|
+
- ✅ **IP Filtering** - Optional whitelist support
|
106
|
+
- ✅ **Audit Logging** - Complete request/response logging
|
107
|
+
|
108
|
+
## 🎨 Dashboard Features
|
109
|
+
|
110
|
+
### Modern UI Components
|
111
|
+
|
112
|
+
- 🌙 **Dark Mode Support** - Automatic theme switching
|
113
|
+
- 📱 **Responsive Design** - Works on all devices
|
114
|
+
- ⚡ **Real-time Updates** - Auto-refresh every 30 seconds
|
115
|
+
- 🔄 **Interactive Elements** - Copy URLs, test webhooks
|
116
|
+
- 📊 **Live Statistics** - Provider health, success rates
|
117
|
+
|
118
|
+
### Template Components
|
119
|
+
|
120
|
+
Reusable, dynamic components:
|
121
|
+
|
122
|
+
```django
|
123
|
+
<!-- Status Card -->
|
124
|
+
{% include 'payments/components/status_card.html' with title="Ngrok Status" icon="🌐" %}
|
125
|
+
|
126
|
+
<!-- Provider Card (dynamic) -->
|
127
|
+
{% include 'payments/components/provider_card.html' with provider=provider_data %}
|
128
|
+
|
129
|
+
<!-- Loading Spinner -->
|
130
|
+
{% include 'payments/components/loading_spinner.html' with size="large" %}
|
131
|
+
```
|
132
|
+
|
133
|
+
## 🔧 Configuration
|
134
|
+
|
135
|
+
### Provider Registration
|
136
|
+
|
137
|
+
```python
|
138
|
+
# Add new provider (no code changes needed!)
|
139
|
+
from django_cfg.apps.payments.services.integrations.providers_config import WEBHOOK_METADATA
|
140
|
+
|
141
|
+
# Just add to WEBHOOK_METADATA
|
142
|
+
WEBHOOK_METADATA['new_provider'] = WebhookProviderInfo(
|
143
|
+
name='new_provider',
|
144
|
+
display_name='New Provider',
|
145
|
+
signature_header='x-new-provider-sig',
|
146
|
+
signature_algorithm='HMAC-SHA256',
|
147
|
+
icon='🆕'
|
148
|
+
)
|
149
|
+
```
|
150
|
+
|
151
|
+
### Ngrok Integration
|
152
|
+
|
153
|
+
```python
|
154
|
+
# Automatic ngrok support via django-cfg
|
155
|
+
# No configuration needed - just run:
|
156
|
+
python manage.py runserver_ngrok
|
157
|
+
```
|
158
|
+
|
159
|
+
### Environment Variables
|
160
|
+
|
161
|
+
```bash
|
162
|
+
# Ngrok authentication
|
163
|
+
NGROK_AUTHTOKEN=your_token_here
|
164
|
+
|
165
|
+
# Provider secrets (via Constance)
|
166
|
+
NOWPAYMENTS_API_KEY=your_api_key
|
167
|
+
NOWPAYMENTS_IPN_SECRET=your_secret
|
168
|
+
```
|
169
|
+
|
170
|
+
## 📊 API Endpoints
|
171
|
+
|
172
|
+
### External API (requires API keys)
|
173
|
+
|
174
|
+
```
|
175
|
+
# Payment Management
|
176
|
+
GET /payments/api/payments/
|
177
|
+
POST /payments/api/payments/
|
178
|
+
GET /payments/api/payments/{id}/
|
179
|
+
|
180
|
+
# Webhook Endpoints
|
181
|
+
POST /payments/api/webhooks/{provider}/
|
182
|
+
GET /payments/api/webhooks/providers/
|
183
|
+
GET /payments/api/webhooks/health/
|
184
|
+
GET /payments/api/webhooks/stats/
|
185
|
+
|
186
|
+
# Currency & Rates
|
187
|
+
GET /payments/api/currencies/
|
188
|
+
GET /payments/api/currencies/rates/
|
189
|
+
POST /payments/api/currencies/convert/
|
190
|
+
```
|
191
|
+
|
192
|
+
### Internal Admin (requires staff access)
|
193
|
+
|
194
|
+
```
|
195
|
+
# Dashboard
|
196
|
+
GET /payments/admin/
|
197
|
+
GET /payments/admin/webhooks/
|
198
|
+
|
199
|
+
# Management Tools
|
200
|
+
GET /payments/admin/ajax/webhooks/status/
|
201
|
+
GET /payments/admin/ajax/webhooks/stats/
|
202
|
+
```
|
203
|
+
|
204
|
+
## 🧪 Testing
|
205
|
+
|
206
|
+
### Webhook Testing
|
207
|
+
|
208
|
+
```bash
|
209
|
+
# Test webhook endpoint
|
210
|
+
curl -X POST https://abc123.ngrok.io/payments/api/webhooks/nowpayments/ \
|
211
|
+
-H "Content-Type: application/json" \
|
212
|
+
-H "x-nowpayments-sig: test_signature" \
|
213
|
+
-d '{"payment_id": "test", "payment_status": "finished"}'
|
214
|
+
```
|
215
|
+
|
216
|
+
### Health Checks
|
217
|
+
|
218
|
+
```bash
|
219
|
+
# Check system health
|
220
|
+
curl /payments/api/webhooks/health/
|
221
|
+
|
222
|
+
# Get statistics
|
223
|
+
curl /payments/api/webhooks/stats/?days=7
|
224
|
+
```
|
225
|
+
|
226
|
+
## 🔄 Adding New Providers
|
227
|
+
|
228
|
+
### 1. Register Provider Class
|
229
|
+
|
230
|
+
```python
|
231
|
+
# In your provider module
|
232
|
+
class NewProvider(BaseProvider):
|
233
|
+
def validate_webhook(self, payload, signature):
|
234
|
+
# Provider-specific validation
|
235
|
+
pass
|
236
|
+
|
237
|
+
# Register with system
|
238
|
+
registry.register_provider_class('new_provider', NewProvider, NewProviderConfig)
|
239
|
+
```
|
240
|
+
|
241
|
+
### 2. Add Webhook Metadata
|
242
|
+
|
243
|
+
```python
|
244
|
+
# In providers_config.py
|
245
|
+
WEBHOOK_METADATA['new_provider'] = WebhookProviderInfo(
|
246
|
+
name='new_provider',
|
247
|
+
display_name='New Provider',
|
248
|
+
signature_header='x-new-provider-sig',
|
249
|
+
signature_algorithm='HMAC-SHA256',
|
250
|
+
icon='🆕'
|
251
|
+
)
|
252
|
+
```
|
253
|
+
|
254
|
+
### 3. That's it!
|
255
|
+
|
256
|
+
The system automatically:
|
257
|
+
- ✅ Creates webhook endpoint: `/webhooks/new_provider/`
|
258
|
+
- ✅ Adds to dashboard UI with icon
|
259
|
+
- ✅ Includes in provider list API
|
260
|
+
- ✅ Handles signature validation
|
261
|
+
- ✅ Provides ngrok URLs
|
262
|
+
|
263
|
+
## 📈 Performance & Scalability
|
264
|
+
|
265
|
+
- **Lazy Loading** - Providers loaded on-demand
|
266
|
+
- **Caching** - Redis-backed provider and rate limit caching
|
267
|
+
- **Async Support** - Ready for async webhook processing
|
268
|
+
- **Health Monitoring** - Automatic provider health checks
|
269
|
+
- **Fallback Mechanisms** - Graceful degradation when providers fail
|
270
|
+
|
271
|
+
## 🛡️ Security Best Practices
|
272
|
+
|
273
|
+
1. **Always validate signatures** - Never trust unsigned webhooks
|
274
|
+
2. **Use HTTPS in production** - Ngrok is for development only
|
275
|
+
3. **Implement rate limiting** - Prevent abuse and DoS attacks
|
276
|
+
4. **Monitor webhook activity** - Set up alerts for failures
|
277
|
+
5. **Rotate secrets regularly** - Update provider secrets periodically
|
278
|
+
|
279
|
+
## 📚 Documentation
|
280
|
+
|
281
|
+
- [Webhook Integration Guide](/@docs_new/integration/webhooks-ngrok.md)
|
282
|
+
- [Provider Configuration](/@docs_new/models/config.md)
|
283
|
+
- [Service Layer Documentation](/@docs_new/services/index.md)
|
284
|
+
- [Architecture Overview](/@docs_new/architecture.md)
|
285
|
+
|
286
|
+
## 🎯 Production Deployment
|
287
|
+
|
288
|
+
### Requirements
|
289
|
+
|
290
|
+
- Python 3.11+
|
291
|
+
- Django 4.2+
|
292
|
+
- PostgreSQL 12+
|
293
|
+
- Redis 6+
|
294
|
+
- Nginx (for static files)
|
295
|
+
|
296
|
+
### Environment Setup
|
297
|
+
|
298
|
+
```bash
|
299
|
+
# Production settings
|
300
|
+
DEBUG=False
|
301
|
+
ALLOWED_HOSTS=your-domain.com
|
302
|
+
DATABASE_URL=postgresql://...
|
303
|
+
REDIS_URL=redis://...
|
304
|
+
|
305
|
+
# Provider configuration
|
306
|
+
NOWPAYMENTS_API_KEY=prod_key
|
307
|
+
NOWPAYMENTS_IPN_SECRET=prod_secret
|
308
|
+
```
|
309
|
+
|
310
|
+
### Nginx Configuration
|
311
|
+
|
312
|
+
```nginx
|
313
|
+
location /payments/api/webhooks/ {
|
314
|
+
proxy_pass http://django;
|
315
|
+
proxy_set_header Host $host;
|
316
|
+
proxy_set_header X-Real-IP $remote_addr;
|
317
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
318
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
319
|
+
}
|
320
|
+
```
|
321
|
+
|
322
|
+
---
|
323
|
+
|
324
|
+
## 🎉 **Universal Payment System v2.0 - Ready for Production!**
|
325
|
+
|
326
|
+
**Built with ❤️ using Django-CFG framework**
|
@@ -1,23 +1,34 @@
|
|
1
1
|
"""
|
2
|
-
Admin interfaces for
|
2
|
+
Admin interfaces for Universal Payment System v2.0.
|
3
|
+
|
4
|
+
Unfold-powered admin with modern UI/UX and advanced functionality.
|
3
5
|
"""
|
4
6
|
|
5
|
-
from .
|
7
|
+
from .currencies_admin import CurrencyAdmin, NetworkAdmin, ProviderCurrencyAdmin
|
6
8
|
from .payments_admin import UniversalPaymentAdmin
|
7
|
-
from .
|
9
|
+
from .balance_admin import UserBalanceAdmin, TransactionAdmin
|
10
|
+
from .subscriptions_admin import SubscriptionAdmin, EndpointGroupAdmin, TariffAdmin, TariffEndpointGroupAdmin
|
8
11
|
from .api_keys_admin import APIKeyAdmin
|
9
|
-
from .currencies_admin import CurrencyAdmin, CurrencyNetworkAdmin
|
10
|
-
from .tariffs_admin import TariffAdmin, TariffEndpointGroupAdmin
|
11
12
|
|
12
13
|
__all__ = [
|
14
|
+
# Currency admins
|
15
|
+
'CurrencyAdmin',
|
16
|
+
'NetworkAdmin',
|
17
|
+
'ProviderCurrencyAdmin',
|
18
|
+
|
19
|
+
# Payment admins
|
20
|
+
'UniversalPaymentAdmin',
|
21
|
+
|
22
|
+
# Balance admins
|
13
23
|
'UserBalanceAdmin',
|
14
24
|
'TransactionAdmin',
|
15
|
-
|
25
|
+
|
26
|
+
# Subscription admins
|
16
27
|
'SubscriptionAdmin',
|
17
28
|
'EndpointGroupAdmin',
|
18
|
-
'APIKeyAdmin',
|
19
|
-
'CurrencyAdmin',
|
20
|
-
'CurrencyNetworkAdmin',
|
21
29
|
'TariffAdmin',
|
22
30
|
'TariffEndpointGroupAdmin',
|
31
|
+
|
32
|
+
# API Key admins
|
33
|
+
'APIKeyAdmin',
|
23
34
|
]
|