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,373 +0,0 @@
|
|
1
|
-
{% extends 'payments/base.html' %}
|
2
|
-
{% load static %}
|
3
|
-
{% load payments_tags %}
|
4
|
-
|
5
|
-
{% block header_title %}Payment Details{% endblock %}
|
6
|
-
{% block header_subtitle %}Payment {{ payment.internal_payment_id }}{% endblock %}
|
7
|
-
|
8
|
-
{% block content %}
|
9
|
-
<div class="space-y-6">
|
10
|
-
<!-- Payment Overview -->
|
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
|
-
<div class="flex items-center justify-between">
|
14
|
-
<div>
|
15
|
-
<h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Payment Overview</h3>
|
16
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Complete payment information</p>
|
17
|
-
</div>
|
18
|
-
<div class="flex items-center space-x-3">
|
19
|
-
{% payment_status_badge payment %}
|
20
|
-
{% if payment.pay_address and payment.pay_amount %}
|
21
|
-
<a href="{% url 'payments_dashboard:qr_code' payment.pk %}"
|
22
|
-
class="inline-flex items-center px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
|
23
|
-
<span class="material-icons text-sm mr-2">qr_code</span>
|
24
|
-
QR Code
|
25
|
-
</a>
|
26
|
-
{% endif %}
|
27
|
-
</div>
|
28
|
-
</div>
|
29
|
-
</div>
|
30
|
-
|
31
|
-
<div class="p-6">
|
32
|
-
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
33
|
-
<!-- Payment Information -->
|
34
|
-
<div>
|
35
|
-
<h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Payment Information</h4>
|
36
|
-
<dl class="space-y-3">
|
37
|
-
<div class="flex justify-between">
|
38
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Internal ID:</dt>
|
39
|
-
<dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.internal_payment_id }}</dd>
|
40
|
-
</div>
|
41
|
-
<div class="flex justify-between">
|
42
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Provider ID:</dt>
|
43
|
-
<dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.provider_payment_id|default:"N/A" }}</dd>
|
44
|
-
</div>
|
45
|
-
<div class="flex justify-between">
|
46
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Amount:</dt>
|
47
|
-
<dd class="text-sm font-semibold text-font-important-light dark:text-font-important-dark">${{ payment.amount_usd|floatformat:2 }}</dd>
|
48
|
-
</div>
|
49
|
-
<div class="flex justify-between">
|
50
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Currency:</dt>
|
51
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.currency_code }}</dd>
|
52
|
-
</div>
|
53
|
-
<div class="flex justify-between">
|
54
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Provider:</dt>
|
55
|
-
<dd class="text-sm">
|
56
|
-
<div class="flex items-center">
|
57
|
-
<div class="w-2 h-2 rounded-full mr-2
|
58
|
-
{% if payment.provider == 'cryptapi' %}bg-orange-500
|
59
|
-
{% elif payment.provider == 'cryptomus' %}bg-blue-500
|
60
|
-
{% elif payment.provider == 'stripe' %}bg-purple-500
|
61
|
-
{% elif payment.provider == 'nowpayments' %}bg-green-500
|
62
|
-
{% else %}bg-gray-500{% endif %}">
|
63
|
-
</div>
|
64
|
-
<span class="text-font-default-light dark:text-font-default-dark capitalize">{{ payment.provider }}</span>
|
65
|
-
</div>
|
66
|
-
</dd>
|
67
|
-
</div>
|
68
|
-
</dl>
|
69
|
-
</div>
|
70
|
-
|
71
|
-
<!-- User Information -->
|
72
|
-
<div>
|
73
|
-
<h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">User Information</h4>
|
74
|
-
<dl class="space-y-3">
|
75
|
-
<div class="flex justify-between">
|
76
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Name:</dt>
|
77
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.user.get_full_name|default:"N/A" }}</dd>
|
78
|
-
</div>
|
79
|
-
<div class="flex justify-between">
|
80
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Email:</dt>
|
81
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.user.email }}</dd>
|
82
|
-
</div>
|
83
|
-
<div class="flex justify-between">
|
84
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">User ID:</dt>
|
85
|
-
<dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.user.id }}</dd>
|
86
|
-
</div>
|
87
|
-
</dl>
|
88
|
-
</div>
|
89
|
-
</div>
|
90
|
-
</div>
|
91
|
-
</div>
|
92
|
-
|
93
|
-
<!-- Crypto Details (if applicable) -->
|
94
|
-
{% if payment.is_crypto_provider_payment %}
|
95
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
96
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
97
|
-
<h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Cryptocurrency Details</h3>
|
98
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Blockchain transaction information</p>
|
99
|
-
</div>
|
100
|
-
|
101
|
-
<div class="p-6">
|
102
|
-
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
103
|
-
<!-- Payment Addresses -->
|
104
|
-
<div>
|
105
|
-
<h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Payment Addresses</h4>
|
106
|
-
<dl class="space-y-3">
|
107
|
-
<div>
|
108
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Pay Address:</dt>
|
109
|
-
<dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
|
110
|
-
{{ payment.pay_address|default:"N/A" }}
|
111
|
-
</dd>
|
112
|
-
</div>
|
113
|
-
<div>
|
114
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Sender Address:</dt>
|
115
|
-
<dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
|
116
|
-
{{ payment.sender_address|default:"N/A" }}
|
117
|
-
</dd>
|
118
|
-
</div>
|
119
|
-
<div>
|
120
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Receiver Address:</dt>
|
121
|
-
<dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
|
122
|
-
{{ payment.receiver_address|default:"N/A" }}
|
123
|
-
</dd>
|
124
|
-
</div>
|
125
|
-
</dl>
|
126
|
-
</div>
|
127
|
-
|
128
|
-
<!-- Transaction Details -->
|
129
|
-
<div>
|
130
|
-
<h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Transaction Details</h4>
|
131
|
-
<dl class="space-y-3">
|
132
|
-
<div class="flex justify-between">
|
133
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Crypto Amount:</dt>
|
134
|
-
<dd class="text-sm font-semibold text-font-important-light dark:text-font-important-dark">
|
135
|
-
{{ payment.crypto_amount|default:"N/A"|floatformat:8 }}
|
136
|
-
</dd>
|
137
|
-
</div>
|
138
|
-
<div class="flex justify-between">
|
139
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Pay Amount:</dt>
|
140
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.pay_amount|default:"N/A"|floatformat:8 }}</dd>
|
141
|
-
</div>
|
142
|
-
<div class="flex justify-between">
|
143
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Network:</dt>
|
144
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.network|default:"N/A" }}</dd>
|
145
|
-
</div>
|
146
|
-
<div class="flex justify-between">
|
147
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Confirmations:</dt>
|
148
|
-
<dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.confirmations_count|default:"0" }}</dd>
|
149
|
-
</div>
|
150
|
-
<div>
|
151
|
-
<dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Transaction Hash:</dt>
|
152
|
-
<dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
|
153
|
-
{{ payment.transaction_hash|default:"N/A" }}
|
154
|
-
</dd>
|
155
|
-
</div>
|
156
|
-
</dl>
|
157
|
-
</div>
|
158
|
-
</div>
|
159
|
-
</div>
|
160
|
-
</div>
|
161
|
-
{% endif %}
|
162
|
-
|
163
|
-
<!-- Timestamps -->
|
164
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
165
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
166
|
-
<h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Timeline</h3>
|
167
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Payment lifecycle timestamps</p>
|
168
|
-
</div>
|
169
|
-
|
170
|
-
<div class="p-6">
|
171
|
-
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
172
|
-
<div class="text-center">
|
173
|
-
<div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Created</div>
|
174
|
-
<div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.created_at|date:"M d, Y" }}</div>
|
175
|
-
<div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.created_at|time:"H:i:s" }}</div>
|
176
|
-
</div>
|
177
|
-
<div class="text-center">
|
178
|
-
<div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Updated</div>
|
179
|
-
<div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.updated_at|date:"M d, Y" }}</div>
|
180
|
-
<div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.updated_at|time:"H:i:s" }}</div>
|
181
|
-
</div>
|
182
|
-
<div class="text-center">
|
183
|
-
<div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Processed</div>
|
184
|
-
{% if payment.processed_at %}
|
185
|
-
<div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.processed_at|date:"M d, Y" }}</div>
|
186
|
-
<div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.processed_at|time:"H:i:s" }}</div>
|
187
|
-
{% else %}
|
188
|
-
<div class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Not processed</div>
|
189
|
-
{% endif %}
|
190
|
-
</div>
|
191
|
-
</div>
|
192
|
-
</div>
|
193
|
-
</div>
|
194
|
-
|
195
|
-
<!-- Payment Events -->
|
196
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
197
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
198
|
-
<div class="flex items-center justify-between">
|
199
|
-
<div>
|
200
|
-
<h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Payment Events</h3>
|
201
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Event history and logs</p>
|
202
|
-
</div>
|
203
|
-
<button id="refresh-events" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 text-sm font-medium">
|
204
|
-
<span class="material-icons text-sm mr-1">refresh</span>
|
205
|
-
Refresh
|
206
|
-
</button>
|
207
|
-
</div>
|
208
|
-
</div>
|
209
|
-
|
210
|
-
<div class="p-6">
|
211
|
-
<div id="events-container" class="space-y-3">
|
212
|
-
{% for event in payment.events.all %}
|
213
|
-
<div class="flex items-start space-x-3 p-3 bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700">
|
214
|
-
<div class="flex-shrink-0">
|
215
|
-
<span class="material-icons text-sm
|
216
|
-
{% if event.event_type == 'created' %}text-blue-600 dark:text-blue-400
|
217
|
-
{% elif event.event_type == 'confirmed' %}text-green-600 dark:text-green-400
|
218
|
-
{% elif event.event_type == 'failed' %}text-red-600 dark:text-red-400
|
219
|
-
{% else %}text-gray-600 dark:text-gray-400{% endif %}">
|
220
|
-
{% if event.event_type == 'created' %}add_circle
|
221
|
-
{% elif event.event_type == 'confirmed' %}check_circle
|
222
|
-
{% elif event.event_type == 'failed' %}error
|
223
|
-
{% else %}info{% endif %}
|
224
|
-
</span>
|
225
|
-
</div>
|
226
|
-
<div class="flex-1">
|
227
|
-
<div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ event.event_type|title }}</div>
|
228
|
-
<div class="text-sm text-font-default-light dark:text-font-default-dark">{{ event.message }}</div>
|
229
|
-
<div class="text-xs text-font-subtle-light dark:text-font-subtle-dark mt-1">{{ event.timestamp|date:"M d, Y H:i:s" }}</div>
|
230
|
-
</div>
|
231
|
-
</div>
|
232
|
-
{% empty %}
|
233
|
-
<p class="text-font-subtle-light dark:text-font-subtle-dark text-center py-4">No events recorded</p>
|
234
|
-
{% endfor %}
|
235
|
-
</div>
|
236
|
-
</div>
|
237
|
-
</div>
|
238
|
-
|
239
|
-
<!-- Metadata (if available) -->
|
240
|
-
{% if payment.metadata %}
|
241
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
242
|
-
<div class="p-6 border-b border-base-200 dark:border-base-700">
|
243
|
-
<h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Metadata</h3>
|
244
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Additional payment information</p>
|
245
|
-
</div>
|
246
|
-
|
247
|
-
<div class="p-6">
|
248
|
-
<pre class="text-sm font-mono bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700 overflow-x-auto">{{ payment.metadata|pprint }}</pre>
|
249
|
-
</div>
|
250
|
-
</div>
|
251
|
-
{% endif %}
|
252
|
-
|
253
|
-
<!-- Actions -->
|
254
|
-
<div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
|
255
|
-
<div class="p-6">
|
256
|
-
<div class="flex flex-wrap gap-3">
|
257
|
-
<a href="{% url 'payments_dashboard:list' %}"
|
258
|
-
class="inline-flex items-center px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
|
259
|
-
<span class="material-icons text-sm mr-2">arrow_back</span>
|
260
|
-
Back to List
|
261
|
-
</a>
|
262
|
-
|
263
|
-
{% if payment.status == 'pending' %}
|
264
|
-
<button id="check-status" data-payment-id="{{ payment.pk }}"
|
265
|
-
class="inline-flex items-center px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
|
266
|
-
<span class="material-icons text-sm mr-2">refresh</span>
|
267
|
-
Check Status
|
268
|
-
</button>
|
269
|
-
{% endif %}
|
270
|
-
|
271
|
-
{% if payment.pay_address and payment.pay_amount %}
|
272
|
-
<a href="{% url 'payments_dashboard:qr_code' payment.pk %}"
|
273
|
-
class="inline-flex items-center px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
|
274
|
-
<span class="material-icons text-sm mr-2">qr_code</span>
|
275
|
-
View QR Code
|
276
|
-
</a>
|
277
|
-
{% endif %}
|
278
|
-
|
279
|
-
<button id="export-details"
|
280
|
-
class="inline-flex items-center px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
|
281
|
-
<span class="material-icons text-sm mr-2">file_download</span>
|
282
|
-
Export Details
|
283
|
-
</button>
|
284
|
-
</div>
|
285
|
-
</div>
|
286
|
-
</div>
|
287
|
-
</div>
|
288
|
-
{% endblock %}
|
289
|
-
|
290
|
-
{% block extra_js %}
|
291
|
-
{{ block.super }}
|
292
|
-
<script>
|
293
|
-
document.addEventListener('DOMContentLoaded', function() {
|
294
|
-
console.log('Payment detail loaded');
|
295
|
-
|
296
|
-
// Elements
|
297
|
-
const checkStatusBtn = document.getElementById('check-status');
|
298
|
-
const refreshEventsBtn = document.getElementById('refresh-events');
|
299
|
-
const exportBtn = document.getElementById('export-details');
|
300
|
-
|
301
|
-
// Check payment status
|
302
|
-
checkStatusBtn?.addEventListener('click', function() {
|
303
|
-
const paymentId = this.dataset.paymentId;
|
304
|
-
const originalText = this.innerHTML;
|
305
|
-
|
306
|
-
// Show loading state
|
307
|
-
this.innerHTML = '<span class="material-icons text-sm mr-2 animate-spin">refresh</span>Checking...';
|
308
|
-
this.disabled = true;
|
309
|
-
|
310
|
-
// Simulate API call
|
311
|
-
setTimeout(() => {
|
312
|
-
console.log('Status checked for payment:', paymentId);
|
313
|
-
this.innerHTML = originalText;
|
314
|
-
this.disabled = false;
|
315
|
-
|
316
|
-
// Refresh the page to show updated status
|
317
|
-
window.location.reload();
|
318
|
-
}, 2000);
|
319
|
-
});
|
320
|
-
|
321
|
-
// Refresh events
|
322
|
-
refreshEventsBtn?.addEventListener('click', function() {
|
323
|
-
console.log('Refreshing events...');
|
324
|
-
|
325
|
-
// In a real implementation, this would fetch events via AJAX
|
326
|
-
const eventsContainer = document.getElementById('events-container');
|
327
|
-
eventsContainer.style.opacity = '0.5';
|
328
|
-
|
329
|
-
setTimeout(() => {
|
330
|
-
eventsContainer.style.opacity = '1';
|
331
|
-
console.log('Events refreshed');
|
332
|
-
}, 1000);
|
333
|
-
});
|
334
|
-
|
335
|
-
// Export payment details
|
336
|
-
exportBtn?.addEventListener('click', function() {
|
337
|
-
console.log('Exporting payment details...');
|
338
|
-
|
339
|
-
// Create export data
|
340
|
-
const paymentData = {
|
341
|
-
internal_id: '{{ payment.internal_payment_id }}',
|
342
|
-
provider_id: '{{ payment.provider_payment_id|default:"N/A" }}',
|
343
|
-
amount: '{{ payment.amount_usd }}',
|
344
|
-
currency: '{{ payment.currency_code }}',
|
345
|
-
provider: '{{ payment.provider }}',
|
346
|
-
status: '{{ payment.status }}',
|
347
|
-
user_email: '{{ payment.user.email }}',
|
348
|
-
created_at: '{{ payment.created_at|date:"Y-m-d H:i:s" }}'
|
349
|
-
};
|
350
|
-
|
351
|
-
// Download as JSON
|
352
|
-
const dataStr = JSON.stringify(paymentData, null, 2);
|
353
|
-
const dataBlob = new Blob([dataStr], {type: 'application/json'});
|
354
|
-
const url = URL.createObjectURL(dataBlob);
|
355
|
-
|
356
|
-
const link = document.createElement('a');
|
357
|
-
link.href = url;
|
358
|
-
link.download = `payment_{{ payment.internal_payment_id }}.json`;
|
359
|
-
link.click();
|
360
|
-
|
361
|
-
URL.revokeObjectURL(url);
|
362
|
-
});
|
363
|
-
|
364
|
-
// Auto-refresh for pending payments
|
365
|
-
{% if payment.status == 'pending' %}
|
366
|
-
setInterval(() => {
|
367
|
-
console.log('Auto-checking payment status...');
|
368
|
-
// In a real implementation, check status via AJAX
|
369
|
-
}, 30000); // Check every 30 seconds
|
370
|
-
{% endif %}
|
371
|
-
});
|
372
|
-
</script>
|
373
|
-
{% endblock %}
|