django-cfg 1.2.31__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 -10
- 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 +526 -222
- django_cfg/apps/payments/admin/filters.py +306 -199
- django_cfg/apps/payments/admin/payments_admin.py +465 -70
- 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 +303 -151
- django_cfg/apps/payments/management/commands/manage_providers.py +333 -160
- 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 +342 -152
- django_cfg/apps/payments/middleware/usage_tracking.py +249 -240
- django_cfg/apps/payments/migrations/0001_initial.py +708 -536
- django_cfg/apps/payments/models/__init__.py +13 -18
- 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 +172 -148
- 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 -285
- 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 +346 -467
- django_cfg/apps/payments/services/core/subscription_service.py +425 -481
- 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 +234 -174
- django_cfg/apps/payments/services/providers/nowpayments.py +478 -0
- django_cfg/apps/payments/services/providers/registry.py +367 -301
- 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 +210 -129
- django_cfg/apps/payments/signals/balance_signals.py +174 -0
- django_cfg/apps/payments/signals/payment_signals.py +128 -103
- django_cfg/apps/payments/signals/subscription_signals.py +194 -142
- 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 +45 -48
- django_cfg/apps/payments/urls_admin.py +33 -42
- 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/config.py +1 -1
- django_cfg/core/config.py +40 -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 -492
- django_cfg/modules/django_logger.py +160 -146
- django_cfg/modules/django_unfold/dashboard.py +64 -16
- django_cfg/registry/core.py +1 -0
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/utils/smart_defaults.py +222 -571
- django_cfg/utils/toolkit.py +51 -11
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/METADATA +4 -1
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/RECORD +153 -185
- 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 -146
- django_cfg/apps/payments/management/commands/currency_stats.py +0 -304
- django_cfg/apps/payments/managers/__init__.py +0 -23
- 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 -306
- django_cfg/apps/payments/managers/payment_manager.py +0 -192
- django_cfg/apps/payments/managers/subscription_manager.py +0 -37
- django_cfg/apps/payments/managers/tariff_manager.py +0 -29
- django_cfg/apps/payments/migrations/0002_network_providercurrency_and_more.py +0 -241
- django_cfg/apps/payments/migrations/0003_add_usd_rate_cache.py +0 -30
- django_cfg/apps/payments/models/events.py +0 -73
- django_cfg/apps/payments/serializers/__init__.py +0 -57
- 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 -63
- 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 -461
- 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 -76
- django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
- django_cfg/apps/payments/services/providers/cryptapi/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/cryptapi/config.py +0 -8
- django_cfg/apps/payments/services/providers/cryptapi/models.py +0 -192
- django_cfg/apps/payments/services/providers/cryptapi/provider.py +0 -439
- django_cfg/apps/payments/services/providers/cryptomus/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/cryptomus/models.py +0 -176
- django_cfg/apps/payments/services/providers/cryptomus/provider.py +0 -429
- django_cfg/apps/payments/services/providers/cryptomus/provider_v2.py +0 -564
- django_cfg/apps/payments/services/providers/models/__init__.py +0 -34
- django_cfg/apps/payments/services/providers/models/currencies.py +0 -190
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/nowpayments/models.py +0 -196
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +0 -380
- django_cfg/apps/payments/services/providers/stripe/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/stripe/models.py +0 -184
- django_cfg/apps/payments/services/providers/stripe/provider.py +0 -109
- django_cfg/apps/payments/services/security/__init__.py +0 -34
- django_cfg/apps/payments/services/security/error_handler.py +0 -635
- django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
- django_cfg/apps/payments/services/security/webhook_validator.py +0 -474
- 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/admin/payments/currency/change_list.html +0 -50
- 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 -43
- django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
- django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -34
- django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -148
- django_cfg/apps/payments/templates/payments/dashboard.html +0 -258
- django_cfg/apps/payments/templates/payments/dashboard_simple_test.html +0 -35
- django_cfg/apps/payments/templates/payments/payment_create.html +0 -579
- django_cfg/apps/payments/templates/payments/payment_detail.html +0 -373
- django_cfg/apps/payments/templates/payments/payment_list.html +0 -354
- django_cfg/apps/payments/templates/payments/stats.html +0 -261
- django_cfg/apps/payments/templates/payments/test.html +0 -213
- django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
- django_cfg/apps/payments/utils/__init__.py +0 -43
- django_cfg/apps/payments/utils/billing_utils.py +0 -342
- django_cfg/apps/payments/utils/config_utils.py +0 -239
- 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 -63
- 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 -122
- 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 -451
- django_cfg/apps/payments/views/templates/base.py +0 -212
- 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 -158
- django_cfg/apps/payments/views/templates/qr_code.py +0 -174
- django_cfg/apps/payments/views/templates/stats.py +0 -244
- 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 -66
- django_cfg/core/integration.py +0 -160
- 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.31.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,213 +0,0 @@
|
|
1
|
-
{% extends 'payments/base.html' %}
|
2
|
-
{% load static %}
|
3
|
-
{% load payments_tags %}
|
4
|
-
|
5
|
-
{% block header_title %}Payment Testing{% endblock %}
|
6
|
-
{% block header_subtitle %}Test payment integrations and webhooks{% endblock %}
|
7
|
-
|
8
|
-
{% block content %}
|
9
|
-
<div class="space-y-6">
|
10
|
-
<!-- Test Environment Status -->
|
11
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
12
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
13
|
-
<h2 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Test Environment Status</h2>
|
14
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Current configuration and provider status</p>
|
15
|
-
</div>
|
16
|
-
<div class="p-6">
|
17
|
-
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
18
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
19
|
-
<div class="flex items-center">
|
20
|
-
<span class="material-icons text-green-600 dark:text-green-400 text-xl mr-3">check_circle</span>
|
21
|
-
<div>
|
22
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">Test Mode</h3>
|
23
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Enabled</p>
|
24
|
-
</div>
|
25
|
-
</div>
|
26
|
-
</div>
|
27
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
28
|
-
<div class="flex items-center">
|
29
|
-
<span class="material-icons text-blue-600 dark:text-blue-400 text-xl mr-3">webhook</span>
|
30
|
-
<div>
|
31
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">Webhooks</h3>
|
32
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Active</p>
|
33
|
-
</div>
|
34
|
-
</div>
|
35
|
-
</div>
|
36
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
37
|
-
<div class="flex items-center">
|
38
|
-
<span class="material-icons text-orange-600 dark:text-orange-400 text-xl mr-3">security</span>
|
39
|
-
<div>
|
40
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">Security</h3>
|
41
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Validated</p>
|
42
|
-
</div>
|
43
|
-
</div>
|
44
|
-
</div>
|
45
|
-
</div>
|
46
|
-
</div>
|
47
|
-
</div>
|
48
|
-
|
49
|
-
<!-- Provider Testing -->
|
50
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
51
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
52
|
-
<h2 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Provider Testing</h2>
|
53
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Test individual payment providers</p>
|
54
|
-
</div>
|
55
|
-
<div class="p-6">
|
56
|
-
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
57
|
-
<!-- CryptAPI Test -->
|
58
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
59
|
-
<div class="flex items-center justify-between mb-3">
|
60
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">CryptAPI</h3>
|
61
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200">
|
62
|
-
Active
|
63
|
-
</span>
|
64
|
-
</div>
|
65
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-4">Test Bitcoin payments</p>
|
66
|
-
<button class="w-full bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
67
|
-
Test CryptAPI
|
68
|
-
</button>
|
69
|
-
</div>
|
70
|
-
|
71
|
-
<!-- Cryptomus Test -->
|
72
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
73
|
-
<div class="flex items-center justify-between mb-3">
|
74
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">Cryptomus</h3>
|
75
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200">
|
76
|
-
Active
|
77
|
-
</span>
|
78
|
-
</div>
|
79
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-4">Test multi-crypto payments</p>
|
80
|
-
<button class="w-full bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
81
|
-
Test Cryptomus
|
82
|
-
</button>
|
83
|
-
</div>
|
84
|
-
|
85
|
-
<!-- Stripe Test -->
|
86
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
87
|
-
<div class="flex items-center justify-between mb-3">
|
88
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark">Stripe</h3>
|
89
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200">
|
90
|
-
Configured
|
91
|
-
</span>
|
92
|
-
</div>
|
93
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-4">Test card payments</p>
|
94
|
-
<button class="w-full bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
95
|
-
Test Stripe
|
96
|
-
</button>
|
97
|
-
</div>
|
98
|
-
</div>
|
99
|
-
</div>
|
100
|
-
</div>
|
101
|
-
|
102
|
-
<!-- Webhook Testing -->
|
103
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
104
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
105
|
-
<h2 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Webhook Testing</h2>
|
106
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Test webhook endpoints and processing</p>
|
107
|
-
</div>
|
108
|
-
<div class="p-6">
|
109
|
-
<div class="space-y-4">
|
110
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
111
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Ngrok Integration</h3>
|
112
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-3">
|
113
|
-
Automatic tunnel creation for webhook testing
|
114
|
-
</p>
|
115
|
-
<div class="flex items-center space-x-3">
|
116
|
-
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
117
|
-
Start Ngrok
|
118
|
-
</button>
|
119
|
-
<button class="bg-gray-600 hover:bg-gray-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
120
|
-
View Logs
|
121
|
-
</button>
|
122
|
-
<span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">
|
123
|
-
Status: <span class="text-green-600 dark:text-green-400 font-medium">Ready</span>
|
124
|
-
</span>
|
125
|
-
</div>
|
126
|
-
</div>
|
127
|
-
|
128
|
-
<div class="bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700">
|
129
|
-
<h3 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Webhook Simulation</h3>
|
130
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-3">
|
131
|
-
Send test webhooks to validate processing
|
132
|
-
</p>
|
133
|
-
<div class="flex items-center space-x-3">
|
134
|
-
<button class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
135
|
-
Send Test Payment
|
136
|
-
</button>
|
137
|
-
<button class="bg-orange-600 hover:bg-orange-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
138
|
-
Send Test Failure
|
139
|
-
</button>
|
140
|
-
<button class="bg-purple-600 hover:bg-purple-700 text-white px-4 py-2 rounded-default text-sm font-medium transition-colors duration-200">
|
141
|
-
Send Test Confirmation
|
142
|
-
</button>
|
143
|
-
</div>
|
144
|
-
</div>
|
145
|
-
</div>
|
146
|
-
</div>
|
147
|
-
</div>
|
148
|
-
|
149
|
-
<!-- Test Results -->
|
150
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
151
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
152
|
-
<h2 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Recent Test Results</h2>
|
153
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Latest testing activity</p>
|
154
|
-
</div>
|
155
|
-
<div class="p-6">
|
156
|
-
<div class="space-y-3">
|
157
|
-
<div class="flex items-center justify-between p-3 bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700">
|
158
|
-
<div class="flex items-center">
|
159
|
-
<span class="material-icons text-green-600 dark:text-green-400 text-sm mr-3">check_circle</span>
|
160
|
-
<div>
|
161
|
-
<p class="text-sm font-medium text-font-important-light dark:text-font-important-dark">CryptAPI Payment Test</p>
|
162
|
-
<p class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Webhook received successfully</p>
|
163
|
-
</div>
|
164
|
-
</div>
|
165
|
-
<span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">2 minutes ago</span>
|
166
|
-
</div>
|
167
|
-
|
168
|
-
<div class="flex items-center justify-between p-3 bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700">
|
169
|
-
<div class="flex items-center">
|
170
|
-
<span class="material-icons text-blue-600 dark:text-blue-400 text-sm mr-3">info</span>
|
171
|
-
<div>
|
172
|
-
<p class="text-sm font-medium text-font-important-light dark:text-font-important-dark">Ngrok Tunnel</p>
|
173
|
-
<p class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Started on https://abc123.ngrok.io</p>
|
174
|
-
</div>
|
175
|
-
</div>
|
176
|
-
<span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">5 minutes ago</span>
|
177
|
-
</div>
|
178
|
-
|
179
|
-
<div class="flex items-center justify-between p-3 bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700">
|
180
|
-
<div class="flex items-center">
|
181
|
-
<span class="material-icons text-orange-600 dark:text-orange-400 text-sm mr-3">warning</span>
|
182
|
-
<div>
|
183
|
-
<p class="text-sm font-medium text-font-important-light dark:text-font-important-dark">Cryptomus Configuration</p>
|
184
|
-
<p class="text-xs text-font-subtle-light dark:text-font-subtle-dark">API key validation required</p>
|
185
|
-
</div>
|
186
|
-
</div>
|
187
|
-
<span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">10 minutes ago</span>
|
188
|
-
</div>
|
189
|
-
</div>
|
190
|
-
</div>
|
191
|
-
</div>
|
192
|
-
</div>
|
193
|
-
{% endblock %}
|
194
|
-
|
195
|
-
{% block extra_js %}
|
196
|
-
{{ block.super }}
|
197
|
-
<script>
|
198
|
-
// Testing functionality would be implemented here
|
199
|
-
document.addEventListener('DOMContentLoaded', function() {
|
200
|
-
console.log('Payment testing interface loaded');
|
201
|
-
|
202
|
-
// Add click handlers for test buttons
|
203
|
-
document.querySelectorAll('button').forEach(button => {
|
204
|
-
button.addEventListener('click', function() {
|
205
|
-
if (this.textContent.includes('Test')) {
|
206
|
-
console.log('Test initiated:', this.textContent);
|
207
|
-
// Actual testing logic would go here
|
208
|
-
}
|
209
|
-
});
|
210
|
-
});
|
211
|
-
});
|
212
|
-
</script>
|
213
|
-
{% endblock %}
|
@@ -1,315 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Payment Template Tags
|
3
|
-
|
4
|
-
Custom template tags for payment functionality, status badges, progress bars,
|
5
|
-
and real-time payment tracking components.
|
6
|
-
"""
|
7
|
-
|
8
|
-
from django import template
|
9
|
-
from django.utils.safestring import mark_safe
|
10
|
-
from django.utils.html import format_html
|
11
|
-
from django.db.models import Count, Sum, Q
|
12
|
-
from decimal import Decimal
|
13
|
-
import json
|
14
|
-
|
15
|
-
register = template.Library()
|
16
|
-
|
17
|
-
|
18
|
-
@register.simple_tag
|
19
|
-
def payment_status_badge(payment):
|
20
|
-
"""Render payment status badge with icon and color."""
|
21
|
-
status_config = {
|
22
|
-
'pending': {'color': 'yellow', 'icon': 'pending', 'animate': True},
|
23
|
-
'confirming': {'color': 'blue', 'icon': 'sync', 'animate': True},
|
24
|
-
'confirmed': {'color': 'green', 'icon': 'check_circle', 'animate': False},
|
25
|
-
'completed': {'color': 'green', 'icon': 'verified', 'animate': False},
|
26
|
-
'failed': {'color': 'red', 'icon': 'error', 'animate': False},
|
27
|
-
'expired': {'color': 'gray', 'icon': 'schedule', 'animate': False},
|
28
|
-
'cancelled': {'color': 'gray', 'icon': 'cancel', 'animate': False},
|
29
|
-
'refunded': {'color': 'purple', 'icon': 'undo', 'animate': False},
|
30
|
-
}
|
31
|
-
|
32
|
-
config = status_config.get(payment.status, {'color': 'gray', 'icon': 'help', 'animate': False})
|
33
|
-
animate_class = 'animate-pulse' if config['animate'] else ''
|
34
|
-
|
35
|
-
return format_html(
|
36
|
-
'<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{}-100 text-{}-800 dark:bg-{}-900 dark:text-{}-200">'
|
37
|
-
'<span class="material-icons text-sm mr-1 {}">{}</span>'
|
38
|
-
'<span class="status-text">{}</span>'
|
39
|
-
'</span>',
|
40
|
-
config['color'], config['color'], config['color'], config['color'],
|
41
|
-
animate_class,
|
42
|
-
config['icon'],
|
43
|
-
payment.get_status_display()
|
44
|
-
)
|
45
|
-
|
46
|
-
|
47
|
-
@register.filter
|
48
|
-
def payment_progress_percentage(payment):
|
49
|
-
"""Calculate payment progress percentage."""
|
50
|
-
progress_map = {
|
51
|
-
'pending': 10,
|
52
|
-
'confirming': 40,
|
53
|
-
'confirmed': 70,
|
54
|
-
'completed': 100,
|
55
|
-
'failed': 0,
|
56
|
-
'expired': 0,
|
57
|
-
'cancelled': 0,
|
58
|
-
'refunded': 50, # Partial progress for refunds
|
59
|
-
}
|
60
|
-
return progress_map.get(payment.status, 0)
|
61
|
-
|
62
|
-
|
63
|
-
@register.filter
|
64
|
-
def payment_progress_steps(payment):
|
65
|
-
"""Get payment progress steps with status."""
|
66
|
-
steps = [
|
67
|
-
{'label': 'Created', 'key': 'created'},
|
68
|
-
{'label': 'Processing', 'key': 'processing'},
|
69
|
-
{'label': 'Confirming', 'key': 'confirming'},
|
70
|
-
{'label': 'Completed', 'key': 'completed'},
|
71
|
-
]
|
72
|
-
|
73
|
-
status_order = ['pending', 'confirming', 'confirmed', 'completed']
|
74
|
-
current_index = status_order.index(payment.status) if payment.status in status_order else -1
|
75
|
-
|
76
|
-
for i, step in enumerate(steps):
|
77
|
-
step['completed'] = i < current_index
|
78
|
-
step['active'] = i == current_index
|
79
|
-
|
80
|
-
return steps
|
81
|
-
|
82
|
-
|
83
|
-
@register.inclusion_tag('payments/components/payment_card.html')
|
84
|
-
def payment_card(payment, show_actions=True, compact=False):
|
85
|
-
"""Render payment card component."""
|
86
|
-
return {
|
87
|
-
'payment': payment,
|
88
|
-
'show_actions': show_actions,
|
89
|
-
'compact': compact
|
90
|
-
}
|
91
|
-
|
92
|
-
|
93
|
-
@register.inclusion_tag('payments/components/status_badge.html')
|
94
|
-
def render_payment_status(payment):
|
95
|
-
"""Render payment status badge component."""
|
96
|
-
return {'payment': payment}
|
97
|
-
|
98
|
-
|
99
|
-
@register.inclusion_tag('payments/components/progress_bar.html')
|
100
|
-
def payment_progress_bar(payment):
|
101
|
-
"""Render payment progress bar component."""
|
102
|
-
return {
|
103
|
-
'payment': payment,
|
104
|
-
'percentage': payment_progress_percentage(payment),
|
105
|
-
'steps': payment_progress_steps(payment)
|
106
|
-
}
|
107
|
-
|
108
|
-
|
109
|
-
@register.inclusion_tag('payments/components/payment_tracker.html', takes_context=True)
|
110
|
-
def payment_tracker(context, payment_id):
|
111
|
-
"""Render real-time payment tracker."""
|
112
|
-
try:
|
113
|
-
from ..models import UniversalPayment
|
114
|
-
payment = UniversalPayment.objects.get(id=payment_id)
|
115
|
-
return {
|
116
|
-
'payment': payment,
|
117
|
-
'request': context.get('request'),
|
118
|
-
'user': context.get('user'),
|
119
|
-
'websocket_url': f"/ws/payments/{payment_id}/"
|
120
|
-
}
|
121
|
-
except UniversalPayment.DoesNotExist:
|
122
|
-
return {'payment': None}
|
123
|
-
|
124
|
-
|
125
|
-
@register.simple_tag
|
126
|
-
def payment_websocket_url(payment_id):
|
127
|
-
"""Get WebSocket URL for real-time payment updates."""
|
128
|
-
return f"/ws/payments/{payment_id}/"
|
129
|
-
|
130
|
-
|
131
|
-
@register.filter
|
132
|
-
def format_crypto_amount(amount, currency_code):
|
133
|
-
"""Format cryptocurrency amount with proper decimals."""
|
134
|
-
if not amount:
|
135
|
-
return "0"
|
136
|
-
|
137
|
-
# Different currencies have different decimal places
|
138
|
-
decimal_places = {
|
139
|
-
'BTC': 8,
|
140
|
-
'ETH': 6,
|
141
|
-
'LTC': 8,
|
142
|
-
'USDT': 6,
|
143
|
-
'USDC': 6,
|
144
|
-
'USD': 2,
|
145
|
-
'EUR': 2,
|
146
|
-
}
|
147
|
-
|
148
|
-
places = decimal_places.get(currency_code.upper(), 6)
|
149
|
-
formatted = f"{float(amount):.{places}f}".rstrip('0').rstrip('.')
|
150
|
-
return formatted if formatted else "0"
|
151
|
-
|
152
|
-
|
153
|
-
@register.simple_tag
|
154
|
-
def get_payment_stats():
|
155
|
-
"""Get payment statistics for dashboard."""
|
156
|
-
try:
|
157
|
-
from ..models import UniversalPayment
|
158
|
-
|
159
|
-
stats = UniversalPayment.objects.aggregate(
|
160
|
-
total_count=Count('id'),
|
161
|
-
pending_count=Count('id', filter=Q(status='pending')),
|
162
|
-
confirming_count=Count('id', filter=Q(status='confirming')),
|
163
|
-
completed_count=Count('id', filter=Q(status='completed')),
|
164
|
-
failed_count=Count('id', filter=Q(status='failed')),
|
165
|
-
total_volume=Sum('amount_usd')
|
166
|
-
)
|
167
|
-
|
168
|
-
return {
|
169
|
-
'total_payments_count': stats['total_count'] or 0,
|
170
|
-
'pending_payments_count': stats['pending_count'] or 0,
|
171
|
-
'confirming_payments_count': stats['confirming_count'] or 0,
|
172
|
-
'completed_payments_count': stats['completed_count'] or 0,
|
173
|
-
'failed_payments_count': stats['failed_count'] or 0,
|
174
|
-
'total_volume': float(stats['total_volume'] or 0),
|
175
|
-
}
|
176
|
-
except Exception:
|
177
|
-
# Return default values if there's any error
|
178
|
-
return {
|
179
|
-
'total_payments_count': 0,
|
180
|
-
'pending_payments_count': 0,
|
181
|
-
'confirming_payments_count': 0,
|
182
|
-
'completed_payments_count': 0,
|
183
|
-
'failed_payments_count': 0,
|
184
|
-
'total_volume': 0.0,
|
185
|
-
}
|
186
|
-
|
187
|
-
|
188
|
-
@register.inclusion_tag('payments/components/provider_stats.html')
|
189
|
-
def provider_statistics():
|
190
|
-
"""Render provider statistics."""
|
191
|
-
try:
|
192
|
-
from ..models import UniversalPayment
|
193
|
-
from django.db.models import Avg
|
194
|
-
|
195
|
-
stats = UniversalPayment.objects.values('provider').annotate(
|
196
|
-
count=Count('id'),
|
197
|
-
volume=Sum('amount_usd'),
|
198
|
-
avg_amount=Avg('amount_usd'),
|
199
|
-
completed_count=Count('id', filter=Q(status='completed')),
|
200
|
-
).order_by('-volume')
|
201
|
-
|
202
|
-
# Calculate success rate
|
203
|
-
for stat in stats:
|
204
|
-
if stat['count'] > 0:
|
205
|
-
stat['success_rate'] = (stat['completed_count'] / stat['count']) * 100
|
206
|
-
else:
|
207
|
-
stat['success_rate'] = 0
|
208
|
-
|
209
|
-
return {'provider_stats': stats}
|
210
|
-
except Exception:
|
211
|
-
return {'provider_stats': []}
|
212
|
-
|
213
|
-
|
214
|
-
@register.simple_tag
|
215
|
-
def payment_status_distribution():
|
216
|
-
"""Get payment status distribution for charts."""
|
217
|
-
try:
|
218
|
-
from ..models import UniversalPayment
|
219
|
-
|
220
|
-
distribution = UniversalPayment.objects.values('status').annotate(
|
221
|
-
count=Count('id')
|
222
|
-
).order_by('-count')
|
223
|
-
|
224
|
-
return {item['status']: item['count'] for item in distribution}
|
225
|
-
except Exception:
|
226
|
-
return {}
|
227
|
-
|
228
|
-
|
229
|
-
@register.filter
|
230
|
-
def provider_display_name(provider_key):
|
231
|
-
"""Get display name for provider."""
|
232
|
-
provider_names = {
|
233
|
-
'nowpayments': 'NowPayments',
|
234
|
-
'cryptapi': 'CryptAPI',
|
235
|
-
'cryptomus': 'Cryptomus',
|
236
|
-
'stripe': 'Stripe',
|
237
|
-
'internal': 'Internal',
|
238
|
-
}
|
239
|
-
return provider_names.get(provider_key, provider_key.title())
|
240
|
-
|
241
|
-
|
242
|
-
@register.filter
|
243
|
-
def payment_method_icon(provider):
|
244
|
-
"""Get icon for payment method."""
|
245
|
-
icons = {
|
246
|
-
'nowpayments': 'currency_bitcoin',
|
247
|
-
'cryptapi': 'currency_bitcoin',
|
248
|
-
'cryptomus': 'currency_bitcoin',
|
249
|
-
'stripe': 'credit_card',
|
250
|
-
'internal': 'account_balance',
|
251
|
-
}
|
252
|
-
return icons.get(provider, 'payment')
|
253
|
-
|
254
|
-
|
255
|
-
@register.simple_tag
|
256
|
-
def payment_json_data(payment):
|
257
|
-
"""Convert payment to JSON for JavaScript use."""
|
258
|
-
try:
|
259
|
-
data = {
|
260
|
-
'id': str(payment.id),
|
261
|
-
'status': payment.status,
|
262
|
-
'amount_usd': float(payment.amount_usd),
|
263
|
-
'currency_code': payment.currency_code,
|
264
|
-
'provider': payment.provider,
|
265
|
-
'created_at': payment.created_at.isoformat(),
|
266
|
-
'progress_percentage': payment_progress_percentage(payment),
|
267
|
-
}
|
268
|
-
return mark_safe(json.dumps(data))
|
269
|
-
except Exception:
|
270
|
-
return mark_safe('{}')
|
271
|
-
|
272
|
-
|
273
|
-
@register.filter
|
274
|
-
def time_since_created(payment):
|
275
|
-
"""Get human-readable time since payment was created."""
|
276
|
-
from django.utils import timezone
|
277
|
-
from django.utils.timesince import timesince
|
278
|
-
|
279
|
-
if payment.created_at:
|
280
|
-
return timesince(payment.created_at, timezone.now())
|
281
|
-
return "Unknown"
|
282
|
-
|
283
|
-
|
284
|
-
@register.filter
|
285
|
-
def is_crypto_payment(payment):
|
286
|
-
"""Check if payment is cryptocurrency-based."""
|
287
|
-
crypto_providers = ['nowpayments', 'cryptapi', 'cryptomus']
|
288
|
-
return payment.provider in crypto_providers
|
289
|
-
|
290
|
-
|
291
|
-
@register.filter
|
292
|
-
def can_cancel_payment(payment):
|
293
|
-
"""Check if payment can be cancelled."""
|
294
|
-
cancellable_statuses = ['pending', 'confirming']
|
295
|
-
return payment.status in cancellable_statuses
|
296
|
-
|
297
|
-
|
298
|
-
@register.filter
|
299
|
-
def payment_qr_code_data(payment):
|
300
|
-
"""Get QR code data for payment."""
|
301
|
-
if hasattr(payment, 'pay_address') and payment.pay_address:
|
302
|
-
# For crypto payments, use address:amount format
|
303
|
-
if payment.pay_amount:
|
304
|
-
return f"{payment.pay_address}?amount={payment.pay_amount}"
|
305
|
-
return payment.pay_address
|
306
|
-
return None
|
307
|
-
|
308
|
-
|
309
|
-
@register.inclusion_tag('payments/components/payment_qr_code.html')
|
310
|
-
def payment_qr_code(payment):
|
311
|
-
"""Render QR code for payment."""
|
312
|
-
return {
|
313
|
-
'payment': payment,
|
314
|
-
'qr_data': payment_qr_code_data(payment)
|
315
|
-
}
|
@@ -1,43 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Utilities for universal payments.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from .middleware_utils import get_client_ip, is_api_request, extract_api_key
|
6
|
-
from .billing_utils import calculate_usage_cost, create_billing_transaction, calculate_subscription_refund, process_subscription_billing, get_billing_summary
|
7
|
-
from .validation_utils import validate_api_key, check_subscription_access
|
8
|
-
|
9
|
-
# Configuration utilities
|
10
|
-
from .config_utils import (
|
11
|
-
PaymentsConfigUtil,
|
12
|
-
RedisConfigHelper,
|
13
|
-
CacheConfigHelper,
|
14
|
-
ProviderConfigHelper,
|
15
|
-
get_payments_config,
|
16
|
-
is_payments_enabled
|
17
|
-
)
|
18
|
-
|
19
|
-
__all__ = [
|
20
|
-
# Middleware utilities
|
21
|
-
'get_client_ip',
|
22
|
-
'is_api_request',
|
23
|
-
'extract_api_key',
|
24
|
-
|
25
|
-
# Billing utilities
|
26
|
-
'calculate_usage_cost',
|
27
|
-
'create_billing_transaction',
|
28
|
-
'calculate_subscription_refund',
|
29
|
-
'process_subscription_billing',
|
30
|
-
'get_billing_summary',
|
31
|
-
|
32
|
-
# Validation utilities
|
33
|
-
'validate_api_key',
|
34
|
-
'check_subscription_access',
|
35
|
-
|
36
|
-
# Configuration utilities
|
37
|
-
'PaymentsConfigUtil',
|
38
|
-
'RedisConfigHelper',
|
39
|
-
'CacheConfigHelper',
|
40
|
-
'ProviderConfigHelper',
|
41
|
-
'get_payments_config',
|
42
|
-
'is_payments_enabled',
|
43
|
-
]
|