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
@@ -1,144 +0,0 @@
|
|
1
|
-
{% load payments_tags %}
|
2
|
-
|
3
|
-
<!-- Status Overview Cards -->
|
4
|
-
{% get_payment_stats as stats %}
|
5
|
-
|
6
|
-
<div class="status-overview">
|
7
|
-
<!-- Total Payments -->
|
8
|
-
<div class="status-card">
|
9
|
-
<div class="flex items-center">
|
10
|
-
<div class="flex-shrink-0">
|
11
|
-
<span class="material-icons text-blue-600 dark:text-blue-400 text-3xl">payments</span>
|
12
|
-
</div>
|
13
|
-
<div class="ml-4">
|
14
|
-
<p class="text-sm font-medium text-gray-500 dark:text-gray-400">Total Payments</p>
|
15
|
-
<p class="text-2xl font-bold text-gray-900 dark:text-white">
|
16
|
-
{{ stats.total_payments_count|default:0 }}
|
17
|
-
</p>
|
18
|
-
</div>
|
19
|
-
</div>
|
20
|
-
</div>
|
21
|
-
|
22
|
-
<!-- Pending Payments -->
|
23
|
-
<div class="status-card">
|
24
|
-
<div class="flex items-center">
|
25
|
-
<div class="flex-shrink-0">
|
26
|
-
<span class="material-icons text-yellow-600 dark:text-yellow-400 text-3xl">pending</span>
|
27
|
-
</div>
|
28
|
-
<div class="ml-4">
|
29
|
-
<p class="text-sm font-medium text-gray-500 dark:text-gray-400">Pending</p>
|
30
|
-
<p class="text-2xl font-bold text-gray-900 dark:text-white">
|
31
|
-
{{ stats.pending_payments_count|default:0 }}
|
32
|
-
</p>
|
33
|
-
{% if stats.confirming_payments_count %}
|
34
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">
|
35
|
-
+{{ stats.confirming_payments_count }} confirming
|
36
|
-
</p>
|
37
|
-
{% endif %}
|
38
|
-
</div>
|
39
|
-
</div>
|
40
|
-
</div>
|
41
|
-
|
42
|
-
<!-- Completed Payments -->
|
43
|
-
<div class="status-card">
|
44
|
-
<div class="flex items-center">
|
45
|
-
<div class="flex-shrink-0">
|
46
|
-
<span class="material-icons text-green-600 dark:text-green-400 text-3xl">check_circle</span>
|
47
|
-
</div>
|
48
|
-
<div class="ml-4">
|
49
|
-
<p class="text-sm font-medium text-gray-500 dark:text-gray-400">Completed</p>
|
50
|
-
<p class="text-2xl font-bold text-gray-900 dark:text-white">
|
51
|
-
{{ stats.completed_payments_count|default:0 }}
|
52
|
-
</p>
|
53
|
-
{% if stats.total_payments_count > 0 %}
|
54
|
-
<p class="text-xs text-green-600 dark:text-green-400">
|
55
|
-
{{ stats.completed_payments_count|floatformat:0 }}/{{ stats.total_payments_count }} success
|
56
|
-
</p>
|
57
|
-
{% endif %}
|
58
|
-
</div>
|
59
|
-
</div>
|
60
|
-
</div>
|
61
|
-
|
62
|
-
<!-- Total Volume -->
|
63
|
-
<div class="status-card">
|
64
|
-
<div class="flex items-center">
|
65
|
-
<div class="flex-shrink-0">
|
66
|
-
<span class="material-icons text-purple-600 dark:text-purple-400 text-3xl">account_balance</span>
|
67
|
-
</div>
|
68
|
-
<div class="ml-4">
|
69
|
-
<p class="text-sm font-medium text-gray-500 dark:text-gray-400">Total Volume</p>
|
70
|
-
<p class="text-2xl font-bold text-gray-900 dark:text-white">
|
71
|
-
${{ stats.total_volume|floatformat:2|default:"0.00" }}
|
72
|
-
</p>
|
73
|
-
{% if stats.failed_payments_count %}
|
74
|
-
<p class="text-xs text-red-500 dark:text-red-400">
|
75
|
-
{{ stats.failed_payments_count }} failed
|
76
|
-
</p>
|
77
|
-
{% endif %}
|
78
|
-
</div>
|
79
|
-
</div>
|
80
|
-
</div>
|
81
|
-
</div>
|
82
|
-
|
83
|
-
<!-- Quick Actions Bar -->
|
84
|
-
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 mb-6">
|
85
|
-
<div class="flex items-center justify-between">
|
86
|
-
<div class="flex items-center space-x-4">
|
87
|
-
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Quick Actions:</span>
|
88
|
-
<div class="flex space-x-2">
|
89
|
-
<button class="btn btn-primary btn-sm" onclick="createNewPayment()">
|
90
|
-
<span class="material-icons text-sm mr-1">add</span>
|
91
|
-
New Payment
|
92
|
-
</button>
|
93
|
-
<button class="btn btn-outline btn-sm" onclick="refreshPayments()">
|
94
|
-
<span class="material-icons text-sm mr-1">refresh</span>
|
95
|
-
Refresh
|
96
|
-
</button>
|
97
|
-
<button class="btn btn-outline btn-sm" onclick="exportPayments()">
|
98
|
-
<span class="material-icons text-sm mr-1">download</span>
|
99
|
-
Export
|
100
|
-
</button>
|
101
|
-
</div>
|
102
|
-
</div>
|
103
|
-
|
104
|
-
<!-- Live Status Indicator -->
|
105
|
-
<div class="flex items-center space-x-2">
|
106
|
-
<div class="payment-live-indicator">
|
107
|
-
Live Updates
|
108
|
-
</div>
|
109
|
-
<span class="text-xs text-gray-500 dark:text-gray-400">
|
110
|
-
Last update: <span id="stats-last-update">{% now "H:i:s" %}</span>
|
111
|
-
</span>
|
112
|
-
</div>
|
113
|
-
</div>
|
114
|
-
</div>
|
115
|
-
|
116
|
-
<script>
|
117
|
-
// Quick actions implementation
|
118
|
-
function createNewPayment() {
|
119
|
-
window.location.href = '{% url "payments_dashboard:create" %}';
|
120
|
-
}
|
121
|
-
|
122
|
-
function refreshPayments() {
|
123
|
-
location.reload();
|
124
|
-
}
|
125
|
-
|
126
|
-
function exportPayments() {
|
127
|
-
// Implement export functionality
|
128
|
-
if (window.notificationManager) {
|
129
|
-
window.notificationManager.info('Export functionality coming soon');
|
130
|
-
}
|
131
|
-
}
|
132
|
-
|
133
|
-
// Auto-refresh stats every 30 seconds
|
134
|
-
setInterval(() => {
|
135
|
-
updateStatsLastUpdate();
|
136
|
-
}, 30000);
|
137
|
-
|
138
|
-
function updateStatsLastUpdate() {
|
139
|
-
const element = document.getElementById('stats-last-update');
|
140
|
-
if (element) {
|
141
|
-
element.textContent = new Date().toLocaleTimeString();
|
142
|
-
}
|
143
|
-
}
|
144
|
-
</script>
|
@@ -1,346 +0,0 @@
|
|
1
|
-
{% extends 'payments/base.html' %}
|
2
|
-
{% load payments_tags %}
|
3
|
-
{% load static %}
|
4
|
-
|
5
|
-
{% block title %}Payment Dashboard - Django CFG{% endblock %}
|
6
|
-
|
7
|
-
{% block header_title %}Payment Dashboard{% endblock %}
|
8
|
-
{% block header_subtitle %}Monitor and manage payment transactions in real-time{% endblock %}
|
9
|
-
|
10
|
-
{% block extra_head %}
|
11
|
-
<!-- Dashboard-specific styles -->
|
12
|
-
<style>
|
13
|
-
.dashboard-grid {
|
14
|
-
display: grid;
|
15
|
-
grid-template-columns: 1fr;
|
16
|
-
gap: 1.5rem;
|
17
|
-
}
|
18
|
-
|
19
|
-
@media (min-width: 1024px) {
|
20
|
-
.dashboard-grid {
|
21
|
-
grid-template-columns: 2fr 1fr;
|
22
|
-
}
|
23
|
-
}
|
24
|
-
</style>
|
25
|
-
{% endblock %}
|
26
|
-
|
27
|
-
{% block content %}
|
28
|
-
<div class="payment-dashboard">
|
29
|
-
<!-- Status Overview -->
|
30
|
-
{% include 'payments/components/status_overview.html' %}
|
31
|
-
|
32
|
-
<!-- Main Dashboard Grid -->
|
33
|
-
<div class="dashboard-grid">
|
34
|
-
<!-- Left Column: Recent Payments -->
|
35
|
-
<div class="space-y-6">
|
36
|
-
<!-- Filter Controls -->
|
37
|
-
<div class="payment-filters">
|
38
|
-
<div class="flex items-center justify-between mb-4">
|
39
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white">Recent Payments</h3>
|
40
|
-
<div class="flex items-center space-x-2">
|
41
|
-
<select class="filter-select" id="status-filter" onchange="filterPayments()">
|
42
|
-
<option value="">All Statuses</option>
|
43
|
-
<option value="pending">Pending</option>
|
44
|
-
<option value="confirming">Confirming</option>
|
45
|
-
<option value="completed">Completed</option>
|
46
|
-
<option value="failed">Failed</option>
|
47
|
-
</select>
|
48
|
-
<select class="filter-select" id="provider-filter" onchange="filterPayments()">
|
49
|
-
<option value="">All Providers</option>
|
50
|
-
<option value="nowpayments">NowPayments</option>
|
51
|
-
<option value="cryptapi">CryptAPI</option>
|
52
|
-
<option value="cryptomus">Cryptomus</option>
|
53
|
-
<option value="stripe">Stripe</option>
|
54
|
-
</select>
|
55
|
-
</div>
|
56
|
-
</div>
|
57
|
-
|
58
|
-
<div class="filter-group">
|
59
|
-
<input type="text"
|
60
|
-
class="filter-input"
|
61
|
-
placeholder="Search by payment ID or amount..."
|
62
|
-
id="search-input"
|
63
|
-
onkeyup="searchPayments(event)">
|
64
|
-
<input type="date"
|
65
|
-
class="filter-input"
|
66
|
-
id="date-filter"
|
67
|
-
onchange="filterPayments()">
|
68
|
-
<button class="btn btn-outline btn-sm" onclick="clearFilters()">
|
69
|
-
<span class="material-icons text-sm mr-1">clear</span>
|
70
|
-
Clear
|
71
|
-
</button>
|
72
|
-
</div>
|
73
|
-
</div>
|
74
|
-
|
75
|
-
<!-- Payment Cards Grid -->
|
76
|
-
<div id="payments-grid" class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
77
|
-
{% if payments %}
|
78
|
-
{% for payment in payments %}
|
79
|
-
{% payment_card payment %}
|
80
|
-
{% endfor %}
|
81
|
-
{% else %}
|
82
|
-
<!-- Empty State -->
|
83
|
-
<div class="col-span-full">
|
84
|
-
<div class="text-center py-12">
|
85
|
-
<span class="material-icons text-gray-400 text-6xl mb-4">payment</span>
|
86
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-2">No payments found</h3>
|
87
|
-
<p class="text-gray-500 dark:text-gray-400 mb-4">Get started by creating your first payment.</p>
|
88
|
-
<button class="btn btn-primary" onclick="createNewPayment()">
|
89
|
-
<span class="material-icons text-sm mr-2">add</span>
|
90
|
-
Create Payment
|
91
|
-
</button>
|
92
|
-
</div>
|
93
|
-
</div>
|
94
|
-
{% endif %}
|
95
|
-
</div>
|
96
|
-
|
97
|
-
<!-- Load More Button -->
|
98
|
-
{% if has_more_payments %}
|
99
|
-
<div class="text-center">
|
100
|
-
<button class="btn btn-outline" id="load-more-btn" onclick="loadMorePayments()">
|
101
|
-
<span class="material-icons text-sm mr-2">expand_more</span>
|
102
|
-
Load More Payments
|
103
|
-
</button>
|
104
|
-
</div>
|
105
|
-
{% endif %}
|
106
|
-
</div>
|
107
|
-
|
108
|
-
<!-- Right Column: Analytics & Quick Info -->
|
109
|
-
<div class="space-y-6">
|
110
|
-
<!-- Provider Statistics -->
|
111
|
-
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6">
|
112
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-4">Provider Performance</h3>
|
113
|
-
{% provider_statistics %}
|
114
|
-
</div>
|
115
|
-
|
116
|
-
<!-- Recent Activity -->
|
117
|
-
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6">
|
118
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-4">Recent Activity</h3>
|
119
|
-
<div class="space-y-3">
|
120
|
-
{% for event in recent_events|slice:":5" %}
|
121
|
-
<div class="flex items-center space-x-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700">
|
122
|
-
<div class="flex-shrink-0">
|
123
|
-
{% if event.event_type == 'created' %}
|
124
|
-
<span class="material-icons text-blue-500">add_circle</span>
|
125
|
-
{% elif event.event_type == 'completed' %}
|
126
|
-
<span class="material-icons text-green-500">check_circle</span>
|
127
|
-
{% elif event.event_type == 'failed' %}
|
128
|
-
<span class="material-icons text-red-500">error</span>
|
129
|
-
{% else %}
|
130
|
-
<span class="material-icons text-gray-500">circle</span>
|
131
|
-
{% endif %}
|
132
|
-
</div>
|
133
|
-
<div class="flex-1 min-w-0">
|
134
|
-
<p class="text-sm font-medium text-gray-900 dark:text-white">
|
135
|
-
Payment {{ event.event_type }}
|
136
|
-
</p>
|
137
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">
|
138
|
-
#{{ event.payment.internal_payment_id|default:event.payment.id|truncatechars:8 }}
|
139
|
-
• {{ event.created_at|timesince }} ago
|
140
|
-
</p>
|
141
|
-
</div>
|
142
|
-
<div class="text-sm font-medium text-gray-900 dark:text-white">
|
143
|
-
${{ event.payment.amount_usd|floatformat:2 }}
|
144
|
-
</div>
|
145
|
-
</div>
|
146
|
-
{% empty %}
|
147
|
-
<p class="text-sm text-gray-500 dark:text-gray-400 text-center py-4">
|
148
|
-
No recent activity
|
149
|
-
</p>
|
150
|
-
{% endfor %}
|
151
|
-
</div>
|
152
|
-
</div>
|
153
|
-
|
154
|
-
<!-- System Status -->
|
155
|
-
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6">
|
156
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-4">System Status</h3>
|
157
|
-
<div class="space-y-3">
|
158
|
-
<div class="flex items-center justify-between">
|
159
|
-
<span class="text-sm text-gray-500 dark:text-gray-400">API Status</span>
|
160
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">
|
161
|
-
<span class="w-2 h-2 bg-green-500 rounded-full mr-1"></span>
|
162
|
-
Online
|
163
|
-
</span>
|
164
|
-
</div>
|
165
|
-
<div class="flex items-center justify-between">
|
166
|
-
<span class="text-sm text-gray-500 dark:text-gray-400">Webhook Queue</span>
|
167
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">
|
168
|
-
Processing
|
169
|
-
</span>
|
170
|
-
</div>
|
171
|
-
<div class="flex items-center justify-between">
|
172
|
-
<span class="text-sm text-gray-500 dark:text-gray-400">Database</span>
|
173
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">
|
174
|
-
Connected
|
175
|
-
</span>
|
176
|
-
</div>
|
177
|
-
<div class="flex items-center justify-between">
|
178
|
-
<span class="text-sm text-gray-500 dark:text-gray-400">Redis Cache</span>
|
179
|
-
<span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800">
|
180
|
-
Active
|
181
|
-
</span>
|
182
|
-
</div>
|
183
|
-
</div>
|
184
|
-
</div>
|
185
|
-
</div>
|
186
|
-
</div>
|
187
|
-
</div>
|
188
|
-
{% endblock %}
|
189
|
-
|
190
|
-
{% block extra_js %}
|
191
|
-
<script>
|
192
|
-
// Dashboard JavaScript functionality
|
193
|
-
let currentFilters = {
|
194
|
-
status: '',
|
195
|
-
provider: '',
|
196
|
-
search: '',
|
197
|
-
date: ''
|
198
|
-
};
|
199
|
-
|
200
|
-
let currentPage = 1;
|
201
|
-
const PAYMENTS_PER_PAGE = 10;
|
202
|
-
|
203
|
-
// Filter functions
|
204
|
-
function filterPayments() {
|
205
|
-
currentFilters.status = document.getElementById('status-filter').value;
|
206
|
-
currentFilters.provider = document.getElementById('provider-filter').value;
|
207
|
-
currentFilters.date = document.getElementById('date-filter').value;
|
208
|
-
|
209
|
-
currentPage = 1;
|
210
|
-
loadPayments();
|
211
|
-
}
|
212
|
-
|
213
|
-
function searchPayments(event) {
|
214
|
-
// Debounce search input
|
215
|
-
clearTimeout(window.searchTimeout);
|
216
|
-
window.searchTimeout = setTimeout(() => {
|
217
|
-
currentFilters.search = event.target.value;
|
218
|
-
currentPage = 1;
|
219
|
-
loadPayments();
|
220
|
-
}, 500);
|
221
|
-
}
|
222
|
-
|
223
|
-
function clearFilters() {
|
224
|
-
document.getElementById('status-filter').value = '';
|
225
|
-
document.getElementById('provider-filter').value = '';
|
226
|
-
document.getElementById('search-input').value = '';
|
227
|
-
document.getElementById('date-filter').value = '';
|
228
|
-
|
229
|
-
currentFilters = { status: '', provider: '', search: '', date: '' };
|
230
|
-
currentPage = 1;
|
231
|
-
loadPayments();
|
232
|
-
}
|
233
|
-
|
234
|
-
function loadPayments() {
|
235
|
-
const grid = document.getElementById('payments-grid');
|
236
|
-
|
237
|
-
// Show loading state
|
238
|
-
if (currentPage === 1) {
|
239
|
-
grid.innerHTML = '<div class="col-span-full text-center py-8"><div class="skeleton h-32 w-full"></div></div>';
|
240
|
-
}
|
241
|
-
|
242
|
-
// Build query parameters
|
243
|
-
const params = new URLSearchParams({
|
244
|
-
page: currentPage,
|
245
|
-
page_size: PAYMENTS_PER_PAGE,
|
246
|
-
...currentFilters
|
247
|
-
});
|
248
|
-
|
249
|
-
// Remove empty parameters
|
250
|
-
for (const [key, value] of params.entries()) {
|
251
|
-
if (!value) {
|
252
|
-
params.delete(key);
|
253
|
-
}
|
254
|
-
}
|
255
|
-
|
256
|
-
fetch(`/api/payments/list/?${params}`)
|
257
|
-
.then(response => response.json())
|
258
|
-
.then(data => {
|
259
|
-
if (currentPage === 1) {
|
260
|
-
grid.innerHTML = '';
|
261
|
-
}
|
262
|
-
|
263
|
-
if (data.results && data.results.length > 0) {
|
264
|
-
data.results.forEach(payment => {
|
265
|
-
const cardHtml = renderPaymentCard(payment);
|
266
|
-
grid.insertAdjacentHTML('beforeend', cardHtml);
|
267
|
-
});
|
268
|
-
|
269
|
-
// Update load more button
|
270
|
-
const loadMoreBtn = document.getElementById('load-more-btn');
|
271
|
-
if (loadMoreBtn) {
|
272
|
-
loadMoreBtn.style.display = data.has_next ? 'block' : 'none';
|
273
|
-
}
|
274
|
-
} else if (currentPage === 1) {
|
275
|
-
// Show empty state
|
276
|
-
grid.innerHTML = `
|
277
|
-
<div class="col-span-full text-center py-12">
|
278
|
-
<span class="material-icons text-gray-400 text-6xl mb-4">search_off</span>
|
279
|
-
<h3 class="text-lg font-medium text-gray-900 dark:text-white mb-2">No payments found</h3>
|
280
|
-
<p class="text-gray-500 dark:text-gray-400">Try adjusting your filters.</p>
|
281
|
-
</div>
|
282
|
-
`;
|
283
|
-
}
|
284
|
-
})
|
285
|
-
.catch(error => {
|
286
|
-
console.error('Failed to load payments:', error);
|
287
|
-
if (window.notificationManager) {
|
288
|
-
window.notificationManager.error('Failed to load payments');
|
289
|
-
}
|
290
|
-
});
|
291
|
-
}
|
292
|
-
|
293
|
-
function loadMorePayments() {
|
294
|
-
currentPage++;
|
295
|
-
loadPayments();
|
296
|
-
}
|
297
|
-
|
298
|
-
function renderPaymentCard(payment) {
|
299
|
-
// This would be a simplified version of the payment card template
|
300
|
-
// In a real implementation, you'd want to render this server-side or use a template engine
|
301
|
-
return `
|
302
|
-
<div class="payment-card" data-payment-id="${payment.id}">
|
303
|
-
<!-- Simplified payment card HTML -->
|
304
|
-
<div class="p-4 bg-white dark:bg-gray-800 rounded-lg border">
|
305
|
-
<div class="flex justify-between items-start mb-2">
|
306
|
-
<span class="font-medium">#${payment.internal_payment_id || payment.id.substring(0, 8)}</span>
|
307
|
-
<span class="px-2 py-1 text-xs rounded-full payment-status-${payment.status}">
|
308
|
-
${payment.status}
|
309
|
-
</span>
|
310
|
-
</div>
|
311
|
-
<div class="text-xl font-bold mb-2">$${parseFloat(payment.amount_usd).toFixed(2)}</div>
|
312
|
-
<div class="text-sm text-gray-500">${payment.provider} • ${new Date(payment.created_at).toLocaleDateString()}</div>
|
313
|
-
</div>
|
314
|
-
</div>
|
315
|
-
`;
|
316
|
-
}
|
317
|
-
|
318
|
-
// Auto-refresh dashboard every 30 seconds
|
319
|
-
setInterval(() => {
|
320
|
-
if (document.visibilityState === 'visible') {
|
321
|
-
loadPayments();
|
322
|
-
}
|
323
|
-
}, 30000);
|
324
|
-
|
325
|
-
// Initialize dashboard
|
326
|
-
document.addEventListener('DOMContentLoaded', () => {
|
327
|
-
// Update URL parameters on filter change
|
328
|
-
window.addEventListener('popstate', () => {
|
329
|
-
// Handle browser back/forward
|
330
|
-
const urlParams = new URLSearchParams(window.location.search);
|
331
|
-
currentFilters.status = urlParams.get('status') || '';
|
332
|
-
currentFilters.provider = urlParams.get('provider') || '';
|
333
|
-
currentFilters.search = urlParams.get('search') || '';
|
334
|
-
currentFilters.date = urlParams.get('date') || '';
|
335
|
-
|
336
|
-
// Update form values
|
337
|
-
document.getElementById('status-filter').value = currentFilters.status;
|
338
|
-
document.getElementById('provider-filter').value = currentFilters.provider;
|
339
|
-
document.getElementById('search-input').value = currentFilters.search;
|
340
|
-
document.getElementById('date-filter').value = currentFilters.date;
|
341
|
-
|
342
|
-
loadPayments();
|
343
|
-
});
|
344
|
-
});
|
345
|
-
</script>
|
346
|
-
{% endblock %}
|