django-cfg 1.3.5__py3-none-any.whl → 1.3.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +258 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +171 -461
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
  48. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  49. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
  50. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  51. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  52. django_cfg/apps/payments/middleware/api_access.py +32 -6
  53. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
  54. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
  55. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
  56. django_cfg/apps/payments/models/balance.py +12 -0
  57. django_cfg/apps/payments/models/currencies.py +106 -32
  58. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  59. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  60. django_cfg/apps/payments/services/core/payment_service.py +1 -1
  61. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  62. django_cfg/apps/payments/services/providers/base.py +95 -39
  63. django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
  64. django_cfg/apps/payments/services/providers/models/base.py +122 -0
  65. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  66. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  67. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  68. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  69. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  70. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  71. django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
  72. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  73. django_cfg/apps/payments/services/providers/registry.py +4 -32
  74. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  75. django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
  76. django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
  77. django_cfg/apps/payments/tasks/__init__.py +39 -0
  78. django_cfg/apps/payments/tasks/types.py +73 -0
  79. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  80. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  81. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  82. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  83. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  84. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  85. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  86. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  87. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  88. django_cfg/apps/payments/urls_admin.py +1 -1
  89. django_cfg/apps/payments/views/api/currencies.py +5 -5
  90. django_cfg/apps/payments/views/overview/services.py +2 -2
  91. django_cfg/apps/payments/views/serializers/currencies.py +4 -3
  92. django_cfg/apps/support/admin/__init__.py +10 -1
  93. django_cfg/apps/support/admin/support_admin.py +338 -141
  94. django_cfg/apps/tasks/admin/__init__.py +11 -0
  95. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  96. django_cfg/apps/urls.py +1 -2
  97. django_cfg/config.py +1 -1
  98. django_cfg/core/config.py +10 -5
  99. django_cfg/core/generation.py +1 -1
  100. django_cfg/management/commands/__init__.py +13 -1
  101. django_cfg/management/commands/app_agent_diagnose.py +470 -0
  102. django_cfg/management/commands/app_agent_generate.py +342 -0
  103. django_cfg/management/commands/app_agent_info.py +308 -0
  104. django_cfg/management/commands/migrate_all.py +9 -3
  105. django_cfg/management/commands/migrator.py +11 -6
  106. django_cfg/management/commands/rundramatiq.py +3 -2
  107. django_cfg/middleware/__init__.py +0 -2
  108. django_cfg/models/api_keys.py +115 -0
  109. django_cfg/modules/django_admin/__init__.py +64 -0
  110. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  111. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  112. django_cfg/modules/django_admin/decorators/display.py +106 -0
  113. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  114. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  115. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  116. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  117. django_cfg/modules/django_admin/models/__init__.py +20 -0
  118. django_cfg/modules/django_admin/models/action_models.py +33 -0
  119. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  120. django_cfg/modules/django_admin/models/base.py +26 -0
  121. django_cfg/modules/django_admin/models/display_models.py +31 -0
  122. django_cfg/modules/django_admin/utils/badges.py +159 -0
  123. django_cfg/modules/django_admin/utils/displays.py +247 -0
  124. django_cfg/modules/django_app_agent/__init__.py +87 -0
  125. django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
  126. django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
  127. django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
  128. django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
  129. django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
  130. django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
  131. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
  132. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
  133. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
  134. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
  135. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
  136. django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
  137. django_cfg/modules/django_app_agent/core/__init__.py +33 -0
  138. django_cfg/modules/django_app_agent/core/config.py +300 -0
  139. django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
  140. django_cfg/modules/django_app_agent/models/__init__.py +71 -0
  141. django_cfg/modules/django_app_agent/models/base.py +283 -0
  142. django_cfg/modules/django_app_agent/models/context.py +496 -0
  143. django_cfg/modules/django_app_agent/models/enums.py +481 -0
  144. django_cfg/modules/django_app_agent/models/requests.py +500 -0
  145. django_cfg/modules/django_app_agent/models/responses.py +585 -0
  146. django_cfg/modules/django_app_agent/pytest.ini +6 -0
  147. django_cfg/modules/django_app_agent/services/__init__.py +42 -0
  148. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
  149. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
  150. django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
  151. django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
  152. django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
  153. django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
  154. django_cfg/modules/django_app_agent/services/base.py +437 -0
  155. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
  156. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
  157. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
  158. django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
  159. django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
  160. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
  161. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
  162. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
  163. django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
  164. django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
  165. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
  166. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
  167. django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
  168. django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
  169. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
  170. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
  171. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
  172. django_cfg/modules/django_app_agent/services/report_service.py +332 -0
  173. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
  174. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
  175. django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
  176. django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
  177. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
  178. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
  179. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
  180. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
  181. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
  182. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
  183. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
  184. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
  185. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
  186. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
  187. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
  188. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
  189. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
  190. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
  191. django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
  192. django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
  193. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
  194. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
  195. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
  196. django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
  197. django_cfg/modules/django_app_agent/ui/cli.py +419 -0
  198. django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
  199. django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
  200. django_cfg/modules/django_app_agent/utils/logging.py +360 -0
  201. django_cfg/modules/django_app_agent/utils/validation.py +417 -0
  202. django_cfg/modules/django_currency/__init__.py +2 -2
  203. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  204. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  205. django_cfg/modules/django_currency/core/converter.py +12 -12
  206. django_cfg/modules/django_currency/database/__init__.py +2 -2
  207. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  208. django_cfg/modules/django_llm/llm/client.py +10 -2
  209. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  210. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  211. django_cfg/modules/django_unfold/dashboard.py +14 -13
  212. django_cfg/modules/django_unfold/models/config.py +1 -1
  213. django_cfg/registry/core.py +3 -0
  214. django_cfg/registry/third_party.py +2 -2
  215. django_cfg/template_archive/django_sample.zip +0 -0
  216. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
  217. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/RECORD +224 -118
  218. django_cfg/apps/accounts/admin/activity.py +0 -96
  219. django_cfg/apps/accounts/admin/group.py +0 -17
  220. django_cfg/apps/accounts/admin/otp.py +0 -59
  221. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  222. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  223. django_cfg/apps/accounts/admin/user.py +0 -300
  224. django_cfg/apps/agents/core/agent.py +0 -281
  225. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  226. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  227. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  228. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  229. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  230. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  231. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  232. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  233. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  234. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  235. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  236. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  237. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  238. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  239. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  240. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  241. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  242. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  243. django_cfg/apps/tasks/admin.py +0 -320
  244. django_cfg/middleware/static_nocache.py +0 -55
  245. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  246. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  247. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  248. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  249. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  250. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
  251. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
  252. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -1,500 +0,0 @@
1
- {% extends 'payments/base.html' %}
2
- {% load static %}
3
-
4
- {% block title %}Payment Status - Universal Payment System{% endblock %}
5
-
6
- {% block page_title %}Payment Status{% endblock %}
7
- {% block page_subtitle %}Track your payment progress in real-time{% endblock %}
8
-
9
- {% block extra_css %}
10
- <style>
11
- .status-timeline {
12
- position: relative;
13
- }
14
-
15
- .status-timeline::before {
16
- content: '';
17
- position: absolute;
18
- left: 16px;
19
- top: 0;
20
- bottom: 0;
21
- width: 2px;
22
- background: linear-gradient(to bottom, #3b82f6, #e5e7eb);
23
- }
24
-
25
- .timeline-item {
26
- position: relative;
27
- padding-left: 48px;
28
- padding-bottom: 24px;
29
- }
30
-
31
- .timeline-item:last-child {
32
- padding-bottom: 0;
33
- }
34
-
35
- .timeline-icon {
36
- position: absolute;
37
- left: 0;
38
- top: 0;
39
- width: 32px;
40
- height: 32px;
41
- border-radius: 50%;
42
- display: flex;
43
- align-items: center;
44
- justify-content: center;
45
- z-index: 1;
46
- }
47
-
48
- .timeline-icon.completed {
49
- background-color: #10b981;
50
- color: white;
51
- }
52
-
53
- .timeline-icon.current {
54
- background-color: #3b82f6;
55
- color: white;
56
- animation: pulse 2s infinite;
57
- }
58
-
59
- .timeline-icon.pending {
60
- background-color: #e5e7eb;
61
- color: #6b7280;
62
- }
63
-
64
- @keyframes pulse {
65
- 0%, 100% { transform: scale(1); }
66
- 50% { transform: scale(1.1); }
67
- }
68
-
69
- .payment-qr {
70
- max-width: 200px;
71
- margin: 0 auto;
72
- }
73
-
74
- .countdown {
75
- font-variant-numeric: tabular-nums;
76
- }
77
- </style>
78
- {% endblock %}
79
-
80
- {% block content %}
81
- <div x-data="paymentStatus('{{ payment.id }}')" x-init="init()" class="max-w-4xl mx-auto">
82
- <!-- Payment Header -->
83
- <div class="payment-card mb-8">
84
- <div class="flex items-center justify-between">
85
- <div class="flex items-center">
86
- <div class="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-4">
87
- <span class="material-icons-outlined text-blue-600 dark:text-blue-400">receipt_long</span>
88
- </div>
89
- <div>
90
- <h1 class="text-2xl font-bold text-gray-900 dark:text-white">Payment #{{ payment.external_id|default:payment.id|truncatechars:8 }}</h1>
91
- <p class="text-gray-600 dark:text-gray-400">Created {{ payment.created_at|date:"M d, Y H:i" }}</p>
92
- </div>
93
- </div>
94
-
95
- <div class="text-right">
96
- <div class="text-2xl font-bold text-gray-900 dark:text-white">
97
- ${{ payment.amount_usd|floatformat:2 }}
98
- </div>
99
- <div class="text-sm text-gray-600 dark:text-gray-400">
100
- {{ payment.currency.code }}
101
- </div>
102
- </div>
103
- </div>
104
- </div>
105
-
106
- <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
107
- <!-- Status Timeline -->
108
- <div class="lg:col-span-2">
109
- <div class="payment-card">
110
- <div class="payment-card-header">
111
- <h2 class="payment-card-title">
112
- <span class="material-icons-outlined">timeline</span>
113
- Payment Progress
114
- </h2>
115
- <div class="flex items-center">
116
- <span class="status-indicator" :class="getStatusIndicatorClass(payment.status)"></span>
117
- <span class="status-badge" :class="getStatusBadgeClass(payment.status)" x-text="payment.status_display"></span>
118
- </div>
119
- </div>
120
-
121
- <div class="payment-card-content">
122
- <div class="status-timeline">
123
- <!-- Created -->
124
- <div class="timeline-item">
125
- <div class="timeline-icon completed">
126
- <span class="material-icons-outlined text-sm">add_circle</span>
127
- </div>
128
- <div>
129
- <h3 class="font-medium text-gray-900 dark:text-white">Payment Created</h3>
130
- <p class="text-sm text-gray-600 dark:text-gray-400">
131
- Payment request initiated
132
- </p>
133
- <p class="text-xs text-gray-500 dark:text-gray-500 mt-1">
134
- {{ payment.created_at|date:"M d, Y H:i:s" }}
135
- </p>
136
- </div>
137
- </div>
138
-
139
- <!-- Processing -->
140
- <div class="timeline-item">
141
- <div class="timeline-icon" :class="payment.status === 'pending' || payment.status === 'processing' ? 'current' : (payment.status === 'completed' || payment.status === 'confirmed' ? 'completed' : 'pending')">
142
- <span class="material-icons-outlined text-sm">sync</span>
143
- </div>
144
- <div>
145
- <h3 class="font-medium text-gray-900 dark:text-white">Processing</h3>
146
- <p class="text-sm text-gray-600 dark:text-gray-400">
147
- <span x-show="payment.status === 'pending' || payment.status === 'processing'">
148
- Payment is being processed by {{ payment.provider|title }}
149
- </span>
150
- <span x-show="payment.status === 'completed' || payment.status === 'confirmed'">
151
- Payment processed successfully
152
- </span>
153
- <span x-show="payment.status === 'failed' || payment.status === 'cancelled'">
154
- Payment processing failed
155
- </span>
156
- </p>
157
- <p x-show="payment.updated_at" class="text-xs text-gray-500 dark:text-gray-500 mt-1" x-text="formatDate(payment.updated_at)"></p>
158
- </div>
159
- </div>
160
-
161
- <!-- Confirmation -->
162
- <div class="timeline-item">
163
- <div class="timeline-icon" :class="payment.status === 'completed' || payment.status === 'confirmed' ? 'completed' : 'pending'">
164
- <span class="material-icons-outlined text-sm">check_circle</span>
165
- </div>
166
- <div>
167
- <h3 class="font-medium text-gray-900 dark:text-white">Confirmation</h3>
168
- <p class="text-sm text-gray-600 dark:text-gray-400">
169
- <span x-show="payment.status === 'completed' || payment.status === 'confirmed'">
170
- Payment confirmed and completed
171
- </span>
172
- <span x-show="payment.status !== 'completed' && payment.status !== 'confirmed'">
173
- Waiting for confirmation
174
- </span>
175
- </p>
176
- <p x-show="payment.confirmed_at" class="text-xs text-gray-500 dark:text-gray-500 mt-1" x-text="formatDate(payment.confirmed_at)"></p>
177
- </div>
178
- </div>
179
- </div>
180
- </div>
181
- </div>
182
-
183
- <!-- Transaction Details -->
184
- <div class="payment-card mt-8">
185
- <div class="payment-card-header">
186
- <h2 class="payment-card-title">
187
- <span class="material-icons-outlined">info</span>
188
- Transaction Details
189
- </h2>
190
- </div>
191
-
192
- <div class="payment-card-content">
193
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
194
- <div>
195
- <h4 class="font-medium text-gray-900 dark:text-white mb-3">Payment Information</h4>
196
- <div class="space-y-2 text-sm">
197
- <div class="flex justify-between">
198
- <span class="text-gray-600 dark:text-gray-400">Payment ID:</span>
199
- <span class="font-mono" data-copy="{{ payment.id }}">{{ payment.id|truncatechars:12 }}</span>
200
- </div>
201
- <div class="flex justify-between">
202
- <span class="text-gray-600 dark:text-gray-400">External ID:</span>
203
- <span class="font-mono" x-text="payment.external_id || 'N/A'"></span>
204
- </div>
205
- <div class="flex justify-between">
206
- <span class="text-gray-600 dark:text-gray-400">Provider:</span>
207
- <span x-text="payment.provider"></span>
208
- </div>
209
- <div class="flex justify-between">
210
- <span class="text-gray-600 dark:text-gray-400">Network:</span>
211
- <span x-text="payment.network || 'N/A'"></span>
212
- </div>
213
- </div>
214
- </div>
215
-
216
- <div>
217
- <h4 class="font-medium text-gray-900 dark:text-white mb-3">Amount Details</h4>
218
- <div class="space-y-2 text-sm">
219
- <div class="flex justify-between">
220
- <span class="text-gray-600 dark:text-gray-400">USD Amount:</span>
221
- <span class="font-medium">${{ payment.amount_usd|floatformat:2 }}</span>
222
- </div>
223
- <div class="flex justify-between">
224
- <span class="text-gray-600 dark:text-gray-400">Crypto Amount:</span>
225
- <span class="font-mono" x-text="payment.amount_crypto || 'N/A'"></span>
226
- </div>
227
- <div class="flex justify-between">
228
- <span class="text-gray-600 dark:text-gray-400">Currency:</span>
229
- <span x-text="payment.currency_code"></span>
230
- </div>
231
- <div class="flex justify-between">
232
- <span class="text-gray-600 dark:text-gray-400">Exchange Rate:</span>
233
- <span x-text="payment.exchange_rate || 'N/A'"></span>
234
- </div>
235
- </div>
236
- </div>
237
- </div>
238
- </div>
239
- </div>
240
- </div>
241
-
242
- <!-- Payment Actions Sidebar -->
243
- <div class="space-y-6">
244
- <!-- Quick Actions -->
245
- <div class="payment-card">
246
- <div class="payment-card-header">
247
- <h3 class="payment-card-title">
248
- <span class="material-icons-outlined">bolt</span>
249
- Quick Actions
250
- </h3>
251
- </div>
252
-
253
- <div class="payment-card-content space-y-3">
254
- <button @click="refreshPayment()"
255
- :disabled="loading"
256
- class="btn-primary w-full">
257
- <span x-show="!loading" class="material-icons-outlined">refresh</span>
258
- <span x-show="loading" class="loading-spinner sm mr-2"></span>
259
- <span x-text="loading ? 'Refreshing...' : 'Refresh Status'"></span>
260
- </button>
261
-
262
- <button @click="copyPaymentUrl()" class="btn-outline w-full">
263
- <span class="material-icons-outlined">share</span>
264
- Share Payment
265
- </button>
266
-
267
- <button @click="downloadReceipt()"
268
- x-show="payment.status === 'completed' || payment.status === 'confirmed'"
269
- class="btn-outline w-full">
270
- <span class="material-icons-outlined">download</span>
271
- Download Receipt
272
- </button>
273
- </div>
274
- </div>
275
-
276
- <!-- Payment QR Code -->
277
- <div x-show="payment.qr_code_url || payment.payment_url" class="payment-card">
278
- <div class="payment-card-header">
279
- <h3 class="payment-card-title">
280
- <span class="material-icons-outlined">qr_code</span>
281
- Payment QR Code
282
- </h3>
283
- </div>
284
-
285
- <div class="payment-card-content text-center">
286
- <div class="payment-qr mb-4">
287
- <div x-show="payment.qr_code_url" class="bg-white p-4 rounded-lg inline-block">
288
- <img :src="payment.qr_code_url" alt="Payment QR Code" class="w-full h-auto">
289
- </div>
290
- <div x-show="!payment.qr_code_url" class="bg-gray-100 dark:bg-gray-700 p-8 rounded-lg">
291
- <span class="material-icons-outlined text-gray-400 text-4xl">qr_code</span>
292
- <p class="text-sm text-gray-500 mt-2">QR Code not available</p>
293
- </div>
294
- </div>
295
-
296
- <button x-show="payment.payment_url"
297
- @click="copyToClipboard(payment.payment_url)"
298
- class="btn-outline w-full text-sm">
299
- <span class="material-icons-outlined">content_copy</span>
300
- Copy Payment URL
301
- </button>
302
- </div>
303
- </div>
304
-
305
- <!-- Auto-refresh Settings -->
306
- <div class="payment-card">
307
- <div class="payment-card-header">
308
- <h3 class="payment-card-title">
309
- <span class="material-icons-outlined">settings</span>
310
- Auto-refresh
311
- </h3>
312
- </div>
313
-
314
- <div class="payment-card-content">
315
- <div class="flex items-center justify-between">
316
- <span class="text-sm text-gray-600 dark:text-gray-400">Enable auto-refresh</span>
317
- <label class="relative inline-flex items-center cursor-pointer">
318
- <input type="checkbox" x-model="autoRefresh" @change="toggleAutoRefresh()" class="sr-only peer">
319
- <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
320
- </label>
321
- </div>
322
-
323
- <div x-show="autoRefresh" class="mt-3">
324
- <div class="flex items-center justify-between text-sm">
325
- <span class="text-gray-600 dark:text-gray-400">Next refresh in:</span>
326
- <span class="countdown font-mono" x-text="formatCountdown(refreshCountdown)"></span>
327
- </div>
328
- <div class="w-full bg-gray-200 rounded-full h-1 mt-2">
329
- <div class="bg-blue-600 h-1 rounded-full transition-all duration-1000"
330
- :style="`width: ${(refreshCountdown / refreshInterval) * 100}%`"></div>
331
- </div>
332
- </div>
333
- </div>
334
- </div>
335
-
336
- <!-- Support -->
337
- <div class="payment-card">
338
- <div class="payment-card-header">
339
- <h3 class="payment-card-title">
340
- <span class="material-icons-outlined">support_agent</span>
341
- Need Help?
342
- </h3>
343
- </div>
344
-
345
- <div class="payment-card-content space-y-3">
346
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
347
- <span class="material-icons-outlined mr-2 text-sm">help</span>
348
- Payment FAQ
349
- </a>
350
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
351
- <span class="material-icons-outlined mr-2 text-sm">chat</span>
352
- Contact Support
353
- </a>
354
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
355
- <span class="material-icons-outlined mr-2 text-sm">bug_report</span>
356
- Report Issue
357
- </a>
358
- </div>
359
- </div>
360
- </div>
361
- </div>
362
- </div>
363
- {% endblock %}
364
-
365
- {% block extra_js %}
366
- <script>
367
- function paymentStatus(paymentId) {
368
- return {
369
- payment: {
370
- id: '{{ payment.id }}',
371
- external_id: '{{ payment.external_id|default:"" }}',
372
- status: '{{ payment.status }}',
373
- status_display: '{{ payment.get_status_display }}',
374
- amount_usd: {{ payment.amount_usd }},
375
- currency_code: '{{ payment.currency.code }}',
376
- provider: '{{ payment.provider }}',
377
- created_at: '{{ payment.created_at|date:"c" }}',
378
- updated_at: '{{ payment.updated_at|date:"c" }}',
379
- payment_url: '{{ payment.payment_url|default:"" }}',
380
- qr_code_url: '{{ payment.qr_code_url|default:"" }}'
381
- },
382
- loading: false,
383
- autoRefresh: false,
384
- refreshInterval: 30000, // 30 seconds
385
- refreshCountdown: 30,
386
- refreshTimer: null,
387
- countdownTimer: null,
388
-
389
- async init() {
390
- // Auto-enable refresh for pending payments
391
- if (this.payment.status === 'pending' || this.payment.status === 'processing') {
392
- this.autoRefresh = true;
393
- this.toggleAutoRefresh();
394
- }
395
- },
396
-
397
- async refreshPayment() {
398
- this.loading = true;
399
- try {
400
- const response = await fetch(`/payments/api/payments/${this.payment.id}/`);
401
- const data = await response.json();
402
-
403
- if (response.ok) {
404
- this.payment = { ...this.payment, ...data };
405
- PaymentSystem.Utils.showNotification('Payment status updated', 'success', 'refresh');
406
-
407
- // Disable auto-refresh if payment is completed
408
- if (this.payment.status === 'completed' || this.payment.status === 'failed') {
409
- this.autoRefresh = false;
410
- this.toggleAutoRefresh();
411
- }
412
- } else {
413
- throw new Error(data.error || 'Failed to refresh payment');
414
- }
415
- } catch (error) {
416
- console.error('Failed to refresh payment:', error);
417
- PaymentSystem.Utils.showNotification('Failed to refresh payment status', 'error', 'error');
418
- } finally {
419
- this.loading = false;
420
- }
421
- },
422
-
423
- toggleAutoRefresh() {
424
- if (this.autoRefresh) {
425
- this.startAutoRefresh();
426
- } else {
427
- this.stopAutoRefresh();
428
- }
429
- },
430
-
431
- startAutoRefresh() {
432
- this.refreshCountdown = this.refreshInterval / 1000;
433
-
434
- this.refreshTimer = setInterval(() => {
435
- this.refreshPayment();
436
- this.refreshCountdown = this.refreshInterval / 1000;
437
- }, this.refreshInterval);
438
-
439
- this.countdownTimer = setInterval(() => {
440
- this.refreshCountdown--;
441
- if (this.refreshCountdown <= 0) {
442
- this.refreshCountdown = this.refreshInterval / 1000;
443
- }
444
- }, 1000);
445
- },
446
-
447
- stopAutoRefresh() {
448
- if (this.refreshTimer) {
449
- clearInterval(this.refreshTimer);
450
- this.refreshTimer = null;
451
- }
452
- if (this.countdownTimer) {
453
- clearInterval(this.countdownTimer);
454
- this.countdownTimer = null;
455
- }
456
- },
457
-
458
- copyPaymentUrl() {
459
- const url = window.location.href;
460
- PaymentSystem.Utils.copyToClipboard(url, 'Payment URL copied to clipboard!');
461
- },
462
-
463
- copyToClipboard(text) {
464
- PaymentSystem.Utils.copyToClipboard(text);
465
- },
466
-
467
- downloadReceipt() {
468
- // This would generate and download a PDF receipt
469
- PaymentSystem.Utils.showNotification('Receipt download started', 'info', 'download');
470
- },
471
-
472
- getStatusIndicatorClass(status) {
473
- const statusMap = {
474
- 'completed': 'status-active',
475
- 'confirmed': 'status-active',
476
- 'pending': 'status-warning',
477
- 'processing': 'status-warning',
478
- 'failed': 'status-inactive',
479
- 'cancelled': 'status-inactive'
480
- };
481
- return statusMap[status] || 'status-warning';
482
- },
483
-
484
- getStatusBadgeClass(status) {
485
- return PaymentSystem.Utils.getStatusBadgeClass(status);
486
- },
487
-
488
- formatDate(dateString) {
489
- return PaymentSystem.Utils.formatDate(dateString);
490
- },
491
-
492
- formatCountdown(seconds) {
493
- const mins = Math.floor(seconds / 60);
494
- const secs = seconds % 60;
495
- return `${mins}:${secs.toString().padStart(2, '0')}`;
496
- }
497
- }
498
- }
499
- </script>
500
- {% endblock %}