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
@@ -1,545 +0,0 @@
1
- /**
2
- * Universal Payment System v2.0 - Component Functions
3
- *
4
- * Reusable Alpine.js components and interactive functionality.
5
- */
6
-
7
- // Ensure PaymentSystem namespace exists
8
- window.PaymentSystem = window.PaymentSystem || {};
9
-
10
- /**
11
- * Alpine.js Components
12
- */
13
- PaymentSystem.Components = {
14
- /**
15
- * Webhook Dashboard Component
16
- */
17
- webhookDashboard: function() {
18
- return {
19
- loading: true,
20
- providers: [],
21
- ngrokStatus: {
22
- active: false,
23
- url: null,
24
- description: 'Checking...'
25
- },
26
- healthStatus: {
27
- healthy: false,
28
- description: 'Checking...',
29
- last_check: null
30
- },
31
- stats: {
32
- total_webhooks: 0,
33
- successful_webhooks: 0,
34
- failed_webhooks: 0,
35
- recent_count: 0,
36
- recent_activity: []
37
- },
38
- showTestModal: false,
39
- testProvider: '',
40
- testData: '{"payment_id": "test_123", "status": "completed", "amount": "10.00"}',
41
- testLoading: false,
42
- lastTest: null,
43
- testStatus: null,
44
-
45
- async init() {
46
- await this.loadData();
47
- },
48
-
49
- async loadData() {
50
- this.loading = true;
51
- try {
52
- await Promise.all([
53
- this.loadProviders(),
54
- this.checkHealth(),
55
- this.loadStats()
56
- ]);
57
- } catch (error) {
58
- console.error('Failed to load dashboard data:', error);
59
- PaymentSystem.Utils.showNotification('Failed to load dashboard data', 'error');
60
- } finally {
61
- this.loading = false;
62
- }
63
- },
64
-
65
- async loadProviders() {
66
- try {
67
- const response = await fetch('/api/payments/webhooks/providers/');
68
- const data = await response.json();
69
-
70
- if (data.success) {
71
- this.providers = data.providers || [];
72
- } else {
73
- throw new Error(data.error || 'Failed to load providers');
74
- }
75
- } catch (error) {
76
- console.error('Failed to load providers:', error);
77
- this.providers = [];
78
- }
79
- },
80
-
81
- async checkHealth() {
82
- try {
83
- const response = await fetch('/api/payments/webhooks/health/');
84
- const data = await response.json();
85
-
86
- this.healthStatus = {
87
- healthy: data.status === 'healthy',
88
- description: data.status === 'healthy' ? 'Service healthy' : (data.error || 'Unknown status'),
89
- last_check: new Date().toLocaleString()
90
- };
91
-
92
- // Update ngrok status from details
93
- const ngrokAvailable = data.details?.ngrok_available || false;
94
- this.ngrokStatus = {
95
- active: ngrokAvailable,
96
- url: data.details?.api_base_url || null,
97
- description: ngrokAvailable ? 'Tunnel active' : 'Tunnel inactive'
98
- };
99
- } catch (error) {
100
- console.error('Failed to check health:', error);
101
- this.healthStatus = {
102
- healthy: false,
103
- description: 'Health check failed',
104
- last_check: new Date().toLocaleString()
105
- };
106
- }
107
- },
108
-
109
- async loadStats() {
110
- try {
111
- const response = await fetch('/api/payments/webhooks/stats/');
112
- const data = await response.json();
113
-
114
- if (data.success) {
115
- this.stats = {
116
- total_webhooks: data.stats.total_webhooks || 0,
117
- successful_webhooks: data.stats.successful_webhooks || 0,
118
- failed_webhooks: data.stats.failed_webhooks || 0,
119
- recent_count: data.stats.recent_count || 0,
120
- recent_activity: data.stats.recent_activity || []
121
- };
122
- }
123
- } catch (error) {
124
- console.error('Failed to load stats:', error);
125
- this.stats = {
126
- total_webhooks: 0,
127
- successful_webhooks: 0,
128
- failed_webhooks: 0,
129
- recent_count: 0,
130
- recent_activity: []
131
- };
132
- }
133
- },
134
-
135
- async refreshData() {
136
- await this.loadData();
137
- PaymentSystem.Utils.showNotification('Dashboard data refreshed', 'success', 'refresh');
138
- },
139
-
140
- async checkNgrokStatus() {
141
- await this.checkHealth();
142
- PaymentSystem.Utils.showNotification('Ngrok status updated', 'info', 'network_check');
143
- },
144
-
145
- async sendTestWebhook() {
146
- if (!this.testProvider) {
147
- PaymentSystem.Utils.showNotification('Please select a provider', 'warning', 'warning');
148
- return;
149
- }
150
-
151
- this.testLoading = true;
152
- try {
153
- const provider = this.providers.find(p => p.name === this.testProvider);
154
- if (!provider) {
155
- throw new Error('Provider not found');
156
- }
157
-
158
- const response = await fetch(provider.webhook_url, {
159
- method: 'POST',
160
- headers: {
161
- 'Content-Type': 'application/json',
162
- [provider.signature_header]: 'test-signature'
163
- },
164
- body: this.testData
165
- });
166
-
167
- this.lastTest = new Date().toLocaleString();
168
- this.testStatus = response.ok ? 'Success' : 'Failed';
169
-
170
- PaymentSystem.Utils.showNotification(
171
- `Test webhook ${response.ok ? 'sent successfully' : 'failed'}`,
172
- response.ok ? 'success' : 'error',
173
- response.ok ? 'check_circle' : 'error'
174
- );
175
-
176
- this.showTestModal = false;
177
- } catch (error) {
178
- console.error('Test webhook failed:', error);
179
- this.testStatus = 'Error';
180
- PaymentSystem.Utils.showNotification('Failed to send test webhook', 'error', 'error');
181
- } finally {
182
- this.testLoading = false;
183
- }
184
- },
185
-
186
- copyToClipboard(text) {
187
- PaymentSystem.Utils.copyToClipboard(text);
188
- }
189
- }
190
- },
191
-
192
- /**
193
- * Payment Form Component
194
- */
195
- paymentForm: function() {
196
- return {
197
- formData: {
198
- amount: '',
199
- currency: 'USD',
200
- provider: '',
201
- callback_url: ''
202
- },
203
- loading: false,
204
- errors: {},
205
- currencies: [],
206
- providers: [],
207
-
208
- async init() {
209
- await this.loadFormData();
210
- },
211
-
212
- async loadFormData() {
213
- try {
214
- const [currenciesResponse, providersResponse] = await Promise.all([
215
- fetch('/payments/api/currencies/supported/'),
216
- fetch('/api/payments/webhooks/providers/')
217
- ]);
218
-
219
- const currenciesData = await currenciesResponse.json();
220
- const providersData = await providersResponse.json();
221
-
222
- this.currencies = currenciesData.currencies || [];
223
- this.providers = providersData.providers || [];
224
- } catch (error) {
225
- console.error('Failed to load form data:', error);
226
- PaymentSystem.Utils.showNotification('Failed to load form data', 'error');
227
- }
228
- },
229
-
230
- validateForm() {
231
- this.errors = {};
232
-
233
- if (!this.formData.amount || parseFloat(this.formData.amount) <= 0) {
234
- this.errors.amount = 'Amount must be greater than 0';
235
- }
236
-
237
- if (!this.formData.currency) {
238
- this.errors.currency = 'Currency is required';
239
- }
240
-
241
- if (!this.formData.provider) {
242
- this.errors.provider = 'Provider is required';
243
- }
244
-
245
- if (this.formData.callback_url && !PaymentSystem.Utils.isValidUrl(this.formData.callback_url)) {
246
- this.errors.callback_url = 'Invalid URL format';
247
- }
248
-
249
- return Object.keys(this.errors).length === 0;
250
- },
251
-
252
- async submitForm() {
253
- if (!this.validateForm()) {
254
- PaymentSystem.Utils.showNotification('Please fix form errors', 'warning', 'warning');
255
- return;
256
- }
257
-
258
- this.loading = true;
259
- try {
260
- const response = await fetch('/payments/api/payments/create/', {
261
- method: 'POST',
262
- headers: {
263
- 'Content-Type': 'application/json',
264
- 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
265
- },
266
- body: JSON.stringify(this.formData)
267
- });
268
-
269
- const data = await response.json();
270
-
271
- if (response.ok && data.success) {
272
- PaymentSystem.Utils.showNotification('Payment created successfully', 'success', 'check_circle');
273
- // Redirect to payment status page
274
- window.location.href = `/payments/status/${data.payment.id}/`;
275
- } else {
276
- throw new Error(data.error || 'Failed to create payment');
277
- }
278
- } catch (error) {
279
- console.error('Payment creation failed:', error);
280
- PaymentSystem.Utils.showNotification(error.message, 'error', 'error');
281
- } finally {
282
- this.loading = false;
283
- }
284
- }
285
- }
286
- },
287
-
288
- /**
289
- * Data Table Component
290
- */
291
- dataTable: function(config = {}) {
292
- return {
293
- data: [],
294
- loading: true,
295
- currentPage: 1,
296
- perPage: config.perPage || 10,
297
- totalPages: 1,
298
- totalItems: 0,
299
- sortField: config.defaultSort || 'created_at',
300
- sortDirection: 'desc',
301
- searchQuery: '',
302
- filters: {},
303
- selectedItems: [],
304
-
305
- async init() {
306
- await this.loadData();
307
- },
308
-
309
- async loadData() {
310
- this.loading = true;
311
- try {
312
- const params = new URLSearchParams({
313
- page: this.currentPage,
314
- per_page: this.perPage,
315
- sort: this.sortField,
316
- direction: this.sortDirection,
317
- search: this.searchQuery,
318
- ...this.filters
319
- });
320
-
321
- const response = await fetch(`${config.apiUrl}?${params}`);
322
- const data = await response.json();
323
-
324
- if (response.ok) {
325
- this.data = data.results || data.data || [];
326
- this.totalPages = Math.ceil((data.count || data.total || 0) / this.perPage);
327
- this.totalItems = data.count || data.total || 0;
328
- } else {
329
- throw new Error(data.error || 'Failed to load data');
330
- }
331
- } catch (error) {
332
- console.error('Failed to load table data:', error);
333
- PaymentSystem.Utils.showNotification('Failed to load data', 'error');
334
- } finally {
335
- this.loading = false;
336
- }
337
- },
338
-
339
- async sort(field) {
340
- if (this.sortField === field) {
341
- this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
342
- } else {
343
- this.sortField = field;
344
- this.sortDirection = 'asc';
345
- }
346
- this.currentPage = 1;
347
- await this.loadData();
348
- },
349
-
350
- async search() {
351
- this.currentPage = 1;
352
- await this.loadData();
353
- },
354
-
355
- async goToPage(page) {
356
- if (page >= 1 && page <= this.totalPages) {
357
- this.currentPage = page;
358
- await this.loadData();
359
- }
360
- },
361
-
362
- async applyFilters(newFilters) {
363
- this.filters = { ...this.filters, ...newFilters };
364
- this.currentPage = 1;
365
- await this.loadData();
366
- },
367
-
368
- toggleSelection(item) {
369
- const index = this.selectedItems.findIndex(selected => selected.id === item.id);
370
- if (index > -1) {
371
- this.selectedItems.splice(index, 1);
372
- } else {
373
- this.selectedItems.push(item);
374
- }
375
- },
376
-
377
- selectAll() {
378
- if (this.selectedItems.length === this.data.length) {
379
- this.selectedItems = [];
380
- } else {
381
- this.selectedItems = [...this.data];
382
- }
383
- },
384
-
385
- isSelected(item) {
386
- return this.selectedItems.some(selected => selected.id === item.id);
387
- }
388
- }
389
- },
390
-
391
- /**
392
- * Modal Component
393
- */
394
- modal: function(config = {}) {
395
- return {
396
- show: false,
397
- title: config.title || 'Modal',
398
- size: config.size || 'md',
399
- closable: config.closable !== false,
400
-
401
- open() {
402
- this.show = true;
403
- document.body.style.overflow = 'hidden';
404
- },
405
-
406
- close() {
407
- if (this.closable) {
408
- this.show = false;
409
- document.body.style.overflow = '';
410
- }
411
- },
412
-
413
- onEscape(event) {
414
- if (event.key === 'Escape' && this.closable) {
415
- this.close();
416
- }
417
- }
418
- }
419
- },
420
-
421
- /**
422
- * Status Monitor Component
423
- */
424
- statusMonitor: function(config = {}) {
425
- return {
426
- status: 'checking',
427
- lastCheck: null,
428
- interval: null,
429
- checkUrl: config.checkUrl,
430
- intervalMs: config.intervalMs || 30000,
431
-
432
- async init() {
433
- await this.checkStatus();
434
- this.startMonitoring();
435
- },
436
-
437
- async checkStatus() {
438
- try {
439
- const response = await fetch(this.checkUrl);
440
- const data = await response.json();
441
-
442
- this.status = data.status || 'unknown';
443
- this.lastCheck = new Date().toLocaleString();
444
- } catch (error) {
445
- console.error('Status check failed:', error);
446
- this.status = 'error';
447
- this.lastCheck = new Date().toLocaleString();
448
- }
449
- },
450
-
451
- startMonitoring() {
452
- if (this.interval) {
453
- clearInterval(this.interval);
454
- }
455
-
456
- this.interval = setInterval(() => {
457
- this.checkStatus();
458
- }, this.intervalMs);
459
- },
460
-
461
- stopMonitoring() {
462
- if (this.interval) {
463
- clearInterval(this.interval);
464
- this.interval = null;
465
- }
466
- },
467
-
468
- getStatusIcon() {
469
- return PaymentSystem.Utils.getStatusIcon(this.status);
470
- },
471
-
472
- getStatusClass() {
473
- return PaymentSystem.Utils.getStatusBadgeClass(this.status);
474
- }
475
- }
476
- }
477
- };
478
-
479
- /**
480
- * Global Alpine.js data functions
481
- */
482
- window.webhookDashboard = PaymentSystem.Components.webhookDashboard;
483
- window.paymentForm = PaymentSystem.Components.paymentForm;
484
- window.dataTable = PaymentSystem.Components.dataTable;
485
- window.modal = PaymentSystem.Components.modal;
486
- window.statusMonitor = PaymentSystem.Components.statusMonitor;
487
-
488
- /**
489
- * Initialize components on page load
490
- */
491
- document.addEventListener('DOMContentLoaded', function() {
492
- // Add global click handlers for common actions
493
- document.addEventListener('click', function(e) {
494
- // Handle refresh buttons
495
- if (e.target.matches('[data-refresh]')) {
496
- const target = e.target.getAttribute('data-refresh');
497
- if (target === 'page') {
498
- location.reload();
499
- } else {
500
- // Trigger Alpine.js refresh method if available
501
- const component = e.target.closest('[x-data]');
502
- if (component && component._x_dataStack && component._x_dataStack[0].refreshData) {
503
- component._x_dataStack[0].refreshData();
504
- }
505
- }
506
- }
507
-
508
- // Handle modal triggers
509
- if (e.target.matches('[data-modal]')) {
510
- const modalId = e.target.getAttribute('data-modal');
511
- const modal = document.querySelector(`[data-modal-id="${modalId}"]`);
512
- if (modal && modal._x_dataStack && modal._x_dataStack[0].open) {
513
- modal._x_dataStack[0].open();
514
- }
515
- }
516
- });
517
-
518
- // Add global form validation
519
- document.addEventListener('submit', function(e) {
520
- const form = e.target;
521
- if (form.hasAttribute('data-validate')) {
522
- const requiredFields = form.querySelectorAll('[required]');
523
- let isValid = true;
524
-
525
- requiredFields.forEach(field => {
526
- if (!field.value.trim()) {
527
- field.classList.add('border-red-500');
528
- isValid = false;
529
- } else {
530
- field.classList.remove('border-red-500');
531
- }
532
- });
533
-
534
- if (!isValid) {
535
- e.preventDefault();
536
- PaymentSystem.Utils.showNotification('Please fill in all required fields', 'warning', 'warning');
537
- }
538
- }
539
- });
540
- });
541
-
542
- // Export for module systems
543
- if (typeof module !== 'undefined' && module.exports) {
544
- module.exports = PaymentSystem.Components;
545
- }
@@ -1,163 +0,0 @@
1
- /**
2
- * Ngrok Status Component
3
- *
4
- * Alpine.js component for displaying and managing ngrok tunnel status.
5
- */
6
-
7
- // Ensure PaymentSystem namespace exists
8
- window.PaymentSystem = window.PaymentSystem || {};
9
- window.PaymentSystem.Components = window.PaymentSystem.Components || {};
10
-
11
- /**
12
- * Ngrok Status Card Component
13
- */
14
- window.PaymentSystem.Components.ngrokStatus = function() {
15
- return {
16
- status: {
17
- active: false,
18
- public_url: '',
19
- webhook_url: '',
20
- region: 'us',
21
- proto: 'https',
22
- error: null
23
- },
24
- refreshing: false,
25
-
26
- async init() {
27
- await this.loadStatus();
28
- // Auto-refresh every 30 seconds
29
- setInterval(() => this.loadStatus(), 30000);
30
- },
31
-
32
- async loadStatus() {
33
- try {
34
- // Use our health check endpoint instead of direct ngrok API
35
- const response = await fetch('/api/payments/webhooks/health/');
36
- if (response.ok) {
37
- const data = await response.json();
38
- const ngrokActive = data.details?.ngrok_available || false;
39
- const apiUrl = data.details?.api_base_url || '';
40
-
41
- if (ngrokActive) {
42
- this.status = {
43
- active: true,
44
- public_url: apiUrl,
45
- webhook_url: apiUrl + '/api/payments/webhooks/',
46
- region: 'auto',
47
- proto: apiUrl.startsWith('https') ? 'https' : 'http',
48
- error: null
49
- };
50
- } else {
51
- this.status = {
52
- active: false,
53
- public_url: '',
54
- webhook_url: '',
55
- region: 'us',
56
- proto: 'https',
57
- error: 'Ngrok tunnel not active'
58
- };
59
- }
60
- } else {
61
- this.status = {
62
- active: false,
63
- public_url: '',
64
- webhook_url: '',
65
- region: 'us',
66
- proto: 'https',
67
- error: 'Health check API not accessible'
68
- };
69
- }
70
- } catch (error) {
71
- console.error('Failed to fetch Ngrok status:', error);
72
- this.status = {
73
- active: false,
74
- public_url: '',
75
- webhook_url: '',
76
- region: 'us',
77
- proto: 'https',
78
- error: error.message || 'Failed to check ngrok status'
79
- };
80
- }
81
- },
82
-
83
- async refreshStatus() {
84
- this.refreshing = true;
85
- try {
86
- await this.loadStatus();
87
- } finally {
88
- this.refreshing = false;
89
- }
90
- },
91
-
92
- async copyUrl() {
93
- if (this.status.public_url) {
94
- try {
95
- await navigator.clipboard.writeText(this.status.public_url);
96
- this.$dispatch('show-notification', {
97
- type: 'success',
98
- message: 'Public URL copied to clipboard'
99
- });
100
- } catch (error) {
101
- console.error('Failed to copy URL:', error);
102
- this.$dispatch('show-notification', {
103
- type: 'error',
104
- message: 'Failed to copy URL to clipboard'
105
- });
106
- }
107
- }
108
- },
109
-
110
- async copyWebhookUrl() {
111
- if (this.status.webhook_url) {
112
- try {
113
- await navigator.clipboard.writeText(this.status.webhook_url);
114
- this.$dispatch('show-notification', {
115
- type: 'success',
116
- message: 'Webhook URL copied to clipboard'
117
- });
118
- } catch (error) {
119
- console.error('Failed to copy webhook URL:', error);
120
- this.$dispatch('show-notification', {
121
- type: 'error',
122
- message: 'Failed to copy webhook URL to clipboard'
123
- });
124
- }
125
- }
126
- },
127
-
128
- openInBrowser() {
129
- if (this.status.public_url) {
130
- window.open(this.status.public_url, '_blank');
131
- }
132
- },
133
-
134
- async startTunnel() {
135
- // This would typically call a backend endpoint to start ngrok
136
- this.$dispatch('show-notification', {
137
- type: 'info',
138
- message: 'Starting ngrok tunnel... (This feature requires backend implementation)'
139
- });
140
- },
141
-
142
- async stopTunnel() {
143
- // This would typically call a backend endpoint to stop ngrok
144
- this.$dispatch('show-notification', {
145
- type: 'info',
146
- message: 'Stopping ngrok tunnel... (This feature requires backend implementation)'
147
- });
148
- }
149
- };
150
- };
151
-
152
- // Global function for backward compatibility
153
- window.ngrokStatus = window.PaymentSystem.Components.ngrokStatus;
154
-
155
- // Also define it directly for immediate availability
156
- if (!window.ngrokStatus) {
157
- window.ngrokStatus = window.PaymentSystem.Components.ngrokStatus;
158
- }
159
-
160
- // Debug: Log that the component is loaded
161
- console.log('Ngrok Status component loaded:', typeof window.ngrokStatus);
162
- console.log('PaymentSystem namespace:', window.PaymentSystem);
163
- console.log('Available functions:', Object.keys(window).filter(key => key.includes('ngrok')));