django-cfg 1.3.7__py3-none-any.whl → 1.3.11__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 (246) 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 +269 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +183 -460
  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 +153 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  48. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  49. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  50. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  51. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  52. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  53. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  54. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +43 -17
  55. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  56. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  57. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +109 -63
  58. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  59. django_cfg/apps/payments/config/__init__.py +14 -15
  60. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  61. django_cfg/apps/payments/config/helpers.py +8 -13
  62. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  63. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  64. django_cfg/apps/payments/middleware/api_access.py +32 -6
  65. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  66. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  67. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  68. django_cfg/apps/payments/models/balance.py +12 -0
  69. django_cfg/apps/payments/models/currencies.py +106 -32
  70. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  71. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  72. django_cfg/apps/payments/models/payments.py +94 -0
  73. django_cfg/apps/payments/services/core/base.py +4 -4
  74. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  75. django_cfg/apps/payments/services/core/payment_service.py +266 -39
  76. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  77. django_cfg/apps/payments/services/providers/base.py +303 -41
  78. django_cfg/apps/payments/services/providers/models/__init__.py +42 -0
  79. django_cfg/apps/payments/services/providers/models/base.py +145 -0
  80. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  81. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  82. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  83. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  84. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  85. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  86. django_cfg/apps/payments/services/providers/nowpayments/provider.py +557 -0
  87. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  88. django_cfg/apps/payments/services/providers/registry.py +9 -37
  89. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  90. django_cfg/apps/payments/services/types/requests.py +19 -7
  91. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  92. django_cfg/apps/payments/static/payments/js/api-client.js +29 -6
  93. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  94. django_cfg/apps/payments/static/payments/js/payment-form.js +98 -32
  95. django_cfg/apps/payments/tasks/__init__.py +39 -0
  96. django_cfg/apps/payments/tasks/types.py +73 -0
  97. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  98. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  99. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  100. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  101. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  102. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  103. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  104. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  105. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  106. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  107. django_cfg/apps/payments/urls.py +3 -2
  108. django_cfg/apps/payments/urls_admin.py +1 -1
  109. django_cfg/apps/payments/views/api/currencies.py +8 -5
  110. django_cfg/apps/payments/views/overview/services.py +2 -2
  111. django_cfg/apps/payments/views/serializers/currencies.py +22 -8
  112. django_cfg/apps/support/admin/__init__.py +10 -1
  113. django_cfg/apps/support/admin/support_admin.py +338 -141
  114. django_cfg/apps/tasks/admin/__init__.py +11 -0
  115. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  116. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  117. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  118. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  119. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  120. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  121. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  122. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  123. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  124. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  125. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  126. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  127. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  128. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  129. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  130. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  131. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  132. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  133. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  134. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  135. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  136. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  137. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  138. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  139. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  140. django_cfg/apps/tasks/urls.py +2 -2
  141. django_cfg/apps/tasks/urls_admin.py +2 -2
  142. django_cfg/apps/tasks/utils/__init__.py +1 -0
  143. django_cfg/apps/tasks/utils/simulator.py +356 -0
  144. django_cfg/apps/tasks/views/__init__.py +16 -0
  145. django_cfg/apps/tasks/views/api.py +569 -0
  146. django_cfg/apps/tasks/views/dashboard.py +58 -0
  147. django_cfg/config.py +1 -1
  148. django_cfg/core/config.py +10 -5
  149. django_cfg/core/generation.py +1 -1
  150. django_cfg/core/integration/__init__.py +21 -0
  151. django_cfg/management/commands/__init__.py +13 -1
  152. django_cfg/management/commands/migrate_all.py +9 -3
  153. django_cfg/management/commands/migrator.py +11 -6
  154. django_cfg/management/commands/rundramatiq.py +3 -2
  155. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  156. django_cfg/middleware/__init__.py +0 -2
  157. django_cfg/models/api_keys.py +115 -0
  158. django_cfg/models/constance.py +0 -11
  159. django_cfg/models/payments.py +137 -3
  160. django_cfg/modules/django_admin/__init__.py +64 -0
  161. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  162. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  163. django_cfg/modules/django_admin/decorators/display.py +106 -0
  164. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  165. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  166. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  167. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  168. django_cfg/modules/django_admin/models/__init__.py +20 -0
  169. django_cfg/modules/django_admin/models/action_models.py +33 -0
  170. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  171. django_cfg/modules/django_admin/models/base.py +26 -0
  172. django_cfg/modules/django_admin/models/display_models.py +31 -0
  173. django_cfg/modules/django_admin/utils/badges.py +159 -0
  174. django_cfg/modules/django_admin/utils/displays.py +247 -0
  175. django_cfg/modules/django_currency/__init__.py +2 -2
  176. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  177. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  178. django_cfg/modules/django_currency/core/converter.py +12 -12
  179. django_cfg/modules/django_currency/database/__init__.py +2 -2
  180. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  181. django_cfg/modules/django_llm/llm/client.py +10 -2
  182. django_cfg/modules/django_tasks.py +54 -21
  183. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  184. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  185. django_cfg/modules/django_unfold/dashboard.py +14 -13
  186. django_cfg/modules/django_unfold/models/config.py +1 -1
  187. django_cfg/registry/core.py +7 -9
  188. django_cfg/registry/third_party.py +2 -2
  189. django_cfg/template_archive/django_sample.zip +0 -0
  190. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -1
  191. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/RECORD +198 -160
  192. django_cfg/apps/accounts/admin/activity.py +0 -96
  193. django_cfg/apps/accounts/admin/group.py +0 -17
  194. django_cfg/apps/accounts/admin/otp.py +0 -59
  195. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  196. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  197. django_cfg/apps/accounts/admin/user.py +0 -300
  198. django_cfg/apps/agents/core/agent.py +0 -281
  199. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  200. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  201. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  202. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  203. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  204. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  205. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  206. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  207. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  208. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  209. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  210. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  211. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  212. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  213. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  214. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  215. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  216. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  217. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  218. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  219. django_cfg/apps/payments/config/constance/fields.py +0 -69
  220. django_cfg/apps/payments/config/constance/settings.py +0 -160
  221. django_cfg/apps/payments/services/providers/nowpayments.py +0 -478
  222. django_cfg/apps/tasks/admin.py +0 -320
  223. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  224. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  225. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  226. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  227. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  228. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  229. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  230. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  231. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  232. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  233. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  234. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  235. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  236. django_cfg/apps/tasks/views.py +0 -461
  237. django_cfg/management/commands/auto_generate.py +0 -486
  238. django_cfg/middleware/static_nocache.py +0 -55
  239. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  240. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  241. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  242. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  243. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  244. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  245. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  246. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,95 @@
1
+ {% load payment_tags %}
2
+
3
+ <!-- Payment QR Code Component -->
4
+ <div class="flex flex-col items-center space-y-4 p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
5
+ {% if payment.pay_address %}
6
+ <!-- QR Code Image -->
7
+ <div class="w-48 h-48 bg-gray-100 dark:bg-gray-700 rounded flex items-center justify-center">
8
+ {% if payment.get_qr_code_url %}
9
+ <img src="{{ payment.get_qr_code_url }}"
10
+ alt="QR Code for {{ payment.pay_address }}"
11
+ class="w-48 h-48 rounded"
12
+ onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';">
13
+ <div class="hidden w-48 h-48 items-center justify-center">
14
+ <span class="material-icons text-gray-400 text-4xl">qr_code_off</span>
15
+ </div>
16
+ {% else %}
17
+ <span class="material-icons text-gray-400 text-4xl">qr_code_off</span>
18
+ {% endif %}
19
+ </div>
20
+
21
+ <!-- Payment Details -->
22
+ <div class="text-center space-y-2">
23
+ <p class="text-sm font-medium text-gray-900 dark:text-white">
24
+ Payment Address
25
+ </p>
26
+ <p class="text-xs font-mono text-gray-600 dark:text-gray-400 break-all max-w-xs">
27
+ {{ payment.pay_address }}
28
+ </p>
29
+ {% if payment.pay_amount %}
30
+ <p class="text-xs text-gray-500 dark:text-gray-500">
31
+ Amount: {{ payment.formatted_pay_amount }} {{ payment.currency.code }}
32
+ </p>
33
+ {% endif %}
34
+
35
+ <!-- QR Data Preview -->
36
+ {% if payment.qr_data != payment.pay_address %}
37
+ <p class="text-xs text-blue-600 dark:text-blue-400">
38
+ QR contains: {{ payment.qr_data|truncatechars:50 }}
39
+ </p>
40
+ {% endif %}
41
+ </div>
42
+
43
+ <!-- Action Buttons -->
44
+ <div class="flex space-x-2 pt-2">
45
+ <button class="flex-1 px-3 py-1.5 text-xs border border-gray-300 dark:border-gray-500 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-700 hover:bg-gray-50 dark:hover:bg-gray-600 rounded-md transition-colors duration-200"
46
+ onclick="copyToClipboard('{{ payment.pay_address }}', 'Address copied!')">
47
+ <span class="material-icons text-sm mr-1">content_copy</span>
48
+ Copy Address
49
+ </button>
50
+ {% if payment.pay_amount %}
51
+ <button class="flex-1 px-3 py-1.5 text-xs border border-gray-300 dark:border-gray-500 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-700 hover:bg-gray-50 dark:hover:bg-gray-600 rounded-md transition-colors duration-200"
52
+ onclick="copyToClipboard('{{ payment.pay_amount }}', 'Amount copied!')">
53
+ <span class="material-icons text-sm mr-1">content_copy</span>
54
+ Copy Amount
55
+ </button>
56
+ {% endif %}
57
+ {% if payment.qr_data %}
58
+ <button class="flex-1 px-3 py-1.5 text-xs border border-gray-300 dark:border-gray-500 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-700 hover:bg-gray-50 dark:hover:bg-gray-600 rounded-md transition-colors duration-200"
59
+ onclick="copyToClipboard('{{ payment.qr_data }}', 'QR data copied!')">
60
+ <span class="material-icons text-sm mr-1">qr_code</span>
61
+ Copy QR Data
62
+ </button>
63
+ {% endif %}
64
+ </div>
65
+
66
+
67
+ {% else %}
68
+ <div class="text-center py-8">
69
+ <span class="material-icons text-gray-400 text-4xl mb-2">qr_code_off</span>
70
+ <p class="text-sm text-gray-500 dark:text-gray-400">
71
+ QR code not available for this payment
72
+ </p>
73
+ </div>
74
+ {% endif %}
75
+ </div>
76
+
77
+ <!-- Copy to clipboard utility -->
78
+ <script>
79
+ function copyToClipboard(text, message) {
80
+ navigator.clipboard.writeText(text).then(function() {
81
+ // Show success message (you can customize this)
82
+ const toast = document.createElement('div');
83
+ toast.className = 'fixed top-4 right-4 bg-green-500 text-white px-4 py-2 rounded shadow-lg z-50';
84
+ toast.textContent = message || 'Copied to clipboard!';
85
+ document.body.appendChild(toast);
86
+
87
+ setTimeout(() => {
88
+ document.body.removeChild(toast);
89
+ }, 2000);
90
+ }).catch(function(err) {
91
+ console.error('Failed to copy: ', err);
92
+ alert('Failed to copy to clipboard');
93
+ });
94
+ }
95
+ </script>
@@ -0,0 +1,37 @@
1
+ {% comment %}
2
+ Payment Progress Bar Component
3
+
4
+ Usage:
5
+ {% include 'payments/components/progress_bar.html' with payment=payment %}
6
+
7
+ Parameters:
8
+ - payment: UniversalPayment object
9
+ {% endcomment %}
10
+
11
+ <div class="payment-progress">
12
+ <!-- Progress Bar -->
13
+ <div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
14
+ <div class="h-2 rounded-full transition-all duration-500 ease-out
15
+ {% if payment.status == 'completed' %}bg-green-600
16
+ {% elif payment.status == 'failed' %}bg-red-600
17
+ {% elif payment.status == 'pending' %}bg-yellow-600
18
+ {% elif payment.status == 'confirming' %}bg-blue-600
19
+ {% elif payment.status == 'cancelled' %}bg-gray-600
20
+ {% else %}bg-blue-600{% endif %}"
21
+ style="width: {% if payment.status == 'completed' %}100{% elif payment.status == 'failed' or payment.status == 'cancelled' %}100{% elif payment.status == 'confirming' %}75{% elif payment.status == 'pending' %}25{% else %}0{% endif %}%">
22
+ </div>
23
+ </div>
24
+
25
+ <!-- Progress Text -->
26
+ <div class="flex justify-between items-center mt-2 text-xs text-gray-500 dark:text-gray-400">
27
+ <span>
28
+ {% if payment.status == 'completed' %}100% Complete
29
+ {% elif payment.status == 'failed' %}Failed
30
+ {% elif payment.status == 'cancelled' %}Cancelled
31
+ {% elif payment.status == 'confirming' %}75% Confirming
32
+ {% elif payment.status == 'pending' %}25% Pending
33
+ {% else %}0% Initiated{% endif %}
34
+ </span>
35
+ <span>{{ payment.get_status_display }}</span>
36
+ </div>
37
+ </div>
@@ -0,0 +1,60 @@
1
+ {% comment %}
2
+ Provider Statistics Component
3
+
4
+ Usage:
5
+ {% include 'payments/components/provider_stats.html' with provider_stats=provider_stats %}
6
+
7
+ Parameters:
8
+ - provider_stats: List of provider statistics objects
9
+ {% endcomment %}
10
+
11
+ <div class="space-y-4">
12
+ {% for stat in provider_stats %}
13
+ <div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg border border-gray-200 dark:border-gray-600">
14
+ <div class="flex items-center space-x-3">
15
+ <!-- Provider Icon -->
16
+ <div class="w-8 h-8 rounded-full flex items-center justify-center
17
+ {% if stat.provider == 'cryptapi' %}bg-orange-500
18
+ {% elif stat.provider == 'cryptomus' %}bg-blue-500
19
+ {% elif stat.provider == 'stripe' %}bg-purple-500
20
+ {% elif stat.provider == 'nowpayments' %}bg-green-500
21
+ {% else %}bg-gray-500{% endif %}">
22
+ <span class="material-icons-outlined text-white text-sm">payment</span>
23
+ </div>
24
+
25
+ <!-- Provider Info -->
26
+ <div>
27
+ <p class="text-sm font-medium text-gray-900 dark:text-white capitalize">
28
+ {{ stat.provider }}
29
+ </p>
30
+ <p class="text-xs text-gray-500 dark:text-gray-400">
31
+ {{ stat.count }} payment{{ stat.count|pluralize }}
32
+ </p>
33
+ </div>
34
+ </div>
35
+
36
+ <!-- Statistics -->
37
+ <div class="text-right">
38
+ <p class="text-sm font-medium text-gray-900 dark:text-white">
39
+ ${{ stat.volume|floatformat:2|default:"0.00" }}
40
+ </p>
41
+ <div class="flex items-center space-x-2 mt-1">
42
+ <!-- Success Rate Bar -->
43
+ <div class="w-16 bg-gray-200 dark:bg-gray-600 rounded-full h-1.5">
44
+ <div class="bg-green-600 h-1.5 rounded-full transition-all duration-300"
45
+ style="width: {{ stat.success_rate|floatformat:0 }}%"></div>
46
+ </div>
47
+ <span class="text-xs text-gray-500 dark:text-gray-400">
48
+ {{ stat.success_rate|floatformat:0 }}%
49
+ </span>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ {% empty %}
54
+ <div class="text-center py-8">
55
+ <span class="material-icons-outlined text-gray-400 text-4xl mb-2">bar_chart</span>
56
+ <p class="text-sm font-medium text-gray-900 dark:text-white mb-1">No Provider Data</p>
57
+ <p class="text-xs text-gray-500 dark:text-gray-400">Provider statistics will appear here once payments are processed</p>
58
+ </div>
59
+ {% endfor %}
60
+ </div>
@@ -0,0 +1,41 @@
1
+ {% comment %}
2
+ Payment Status Badge Component
3
+
4
+ Usage:
5
+ {% include 'payments/components/status_badge.html' with payment=payment %}
6
+
7
+ Parameters:
8
+ - payment: UniversalPayment object
9
+ {% endcomment %}
10
+
11
+ <span class="payment-status-badge inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
12
+ {% if payment.status == 'pending' %}bg-yellow-100 text-yellow-800 dark:bg-yellow-900/20 dark:text-yellow-400
13
+ {% elif payment.status == 'confirming' %}bg-blue-100 text-blue-800 dark:bg-blue-900/20 dark:text-blue-400
14
+ {% elif payment.status == 'confirmed' or payment.status == 'completed' %}bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400
15
+ {% elif payment.status == 'failed' %}bg-red-100 text-red-800 dark:bg-red-900/20 dark:text-red-400
16
+ {% elif payment.status == 'expired' or payment.status == 'cancelled' %}bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400
17
+ {% elif payment.status == 'refunded' %}bg-purple-100 text-purple-800 dark:bg-purple-900/20 dark:text-purple-400
18
+ {% else %}bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400{% endif %}"
19
+ data-status="{{ payment.status }}">
20
+ {% if payment.status == 'pending' %}
21
+ <span class="material-icons-outlined text-sm mr-1 animate-pulse">pending</span>
22
+ {% elif payment.status == 'confirming' %}
23
+ <span class="material-icons-outlined text-sm mr-1 animate-spin">sync</span>
24
+ {% elif payment.status == 'confirmed' %}
25
+ <span class="material-icons-outlined text-sm mr-1">check_circle</span>
26
+ {% elif payment.status == 'completed' %}
27
+ <span class="material-icons-outlined text-sm mr-1">verified</span>
28
+ {% elif payment.status == 'failed' %}
29
+ <span class="material-icons-outlined text-sm mr-1">error</span>
30
+ {% elif payment.status == 'expired' %}
31
+ <span class="material-icons-outlined text-sm mr-1">schedule</span>
32
+ {% elif payment.status == 'cancelled' %}
33
+ <span class="material-icons-outlined text-sm mr-1">cancel</span>
34
+ {% elif payment.status == 'refunded' %}
35
+ <span class="material-icons-outlined text-sm mr-1">undo</span>
36
+ {% else %}
37
+ <span class="material-icons-outlined text-sm mr-1">help</span>
38
+ {% endif %}
39
+
40
+ <span class="status-text">{{ payment.get_status_display }}</span>
41
+ </span>
@@ -0,0 +1,83 @@
1
+ {% comment %}
2
+ Status Overview Component
3
+
4
+ Usage:
5
+ {% include 'payments/components/status_overview.html' with payment_stats=payment_stats %}
6
+
7
+ Parameters:
8
+ - payment_stats: Payment statistics object with counts and totals
9
+ {% endcomment %}
10
+
11
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
12
+ <!-- Total Payments -->
13
+ {% include 'payments/components/status_card.html' with title="Total Payments" value=payment_stats.total_payments_count|default:0 icon="payments" status="info" %}
14
+
15
+ <!-- Pending Payments -->
16
+ {% include 'payments/components/status_card.html' with title="Pending" value=payment_stats.pending_payments_count|default:0 icon="pending" status="warning" description=payment_stats.confirming_payments_count|add:" confirming"|default:"" %}
17
+
18
+ <!-- Completed Payments -->
19
+ {% include 'payments/components/status_card.html' with title="Completed" value=payment_stats.completed_payments_count|default:0 icon="check_circle" status="success" description=payment_stats.success_rate|floatformat:1|add:"% success rate"|default:"" %}
20
+
21
+ <!-- Total Volume -->
22
+ {% include 'payments/components/status_card.html' with title="Total Volume" value="$"|add:payment_stats.total_volume|floatformat:2|default:"0.00" icon="account_balance" status="info" description=payment_stats.failed_payments_count|add:" failed"|default:"" %}
23
+ </div>
24
+
25
+ <!-- Quick Actions Bar -->
26
+ <div class="bg-white dark:bg-gray-800 rounded-lg shadow border border-gray-200 dark:border-gray-700 p-4 mt-6">
27
+ <div class="flex items-center justify-between">
28
+ <div class="flex items-center space-x-4">
29
+ <span class="text-sm font-medium text-gray-700 dark:text-gray-300">Quick Actions:</span>
30
+ <div class="flex space-x-2">
31
+ <a href="{% url 'cfg_payments_admin:payment-form' %}"
32
+ class="inline-flex items-center px-3 py-1.5 text-xs bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 rounded-md transition-colors">
33
+ <span class="material-icons-outlined text-sm mr-1">add</span>
34
+ New Payment
35
+ </a>
36
+ <button onclick="window.location.reload()"
37
+ class="inline-flex items-center px-3 py-1.5 text-xs border border-gray-300 dark:border-gray-500 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-700 hover:bg-gray-50 dark:hover:bg-gray-600 rounded-md transition-colors">
38
+ <span class="material-icons-outlined text-sm mr-1">refresh</span>
39
+ Refresh
40
+ </button>
41
+ <button onclick="exportPayments()"
42
+ class="inline-flex items-center px-3 py-1.5 text-xs border border-gray-300 dark:border-gray-500 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-700 hover:bg-gray-50 dark:hover:bg-gray-600 rounded-md transition-colors">
43
+ <span class="material-icons-outlined text-sm mr-1">download</span>
44
+ Export
45
+ </button>
46
+ </div>
47
+ </div>
48
+
49
+ <!-- Live Status Indicator -->
50
+ <div class="flex items-center space-x-2">
51
+ <div class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400">
52
+ <div class="w-2 h-2 bg-green-500 rounded-full mr-2 animate-pulse"></div>
53
+ Live Updates
54
+ </div>
55
+ <span class="text-xs text-gray-500 dark:text-gray-400">
56
+ Last update: <span id="stats-last-update">{% now "H:i:s" %}</span>
57
+ </span>
58
+ </div>
59
+ </div>
60
+ </div>
61
+
62
+ <script>
63
+ // Export payments functionality
64
+ function exportPayments() {
65
+ // TODO: Implement export functionality
66
+ alert('Export functionality not implemented yet');
67
+ }
68
+
69
+ // Update timestamp every minute
70
+ setInterval(function() {
71
+ const now = new Date();
72
+ const timeString = now.toLocaleTimeString('en-US', {
73
+ hour12: false,
74
+ hour: '2-digit',
75
+ minute: '2-digit',
76
+ second: '2-digit'
77
+ });
78
+ const element = document.getElementById('stats-last-update');
79
+ if (element) {
80
+ element.textContent = timeString;
81
+ }
82
+ }, 60000);
83
+ </script>