django-cfg 1.3.1__py3-none-any.whl → 1.3.5__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 (115) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/payments/admin_interface/old/payments/base.html +175 -0
  3. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +125 -0
  4. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +113 -0
  5. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +35 -0
  6. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +309 -0
  7. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +303 -0
  8. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +382 -0
  9. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +518 -0
  10. django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/components.css +248 -9
  11. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +163 -0
  12. django_cfg/apps/payments/admin_interface/serializers/__init__.py +39 -0
  13. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +149 -0
  14. django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +114 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/base.html +55 -90
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/dialog.html +81 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_help_dialog.html +112 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +175 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +21 -17
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +123 -250
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +170 -269
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +152 -355
  23. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +202 -551
  24. django_cfg/apps/payments/admin_interface/views/__init__.py +25 -14
  25. django_cfg/apps/payments/admin_interface/views/api/__init__.py +20 -0
  26. django_cfg/apps/payments/admin_interface/views/api/payments.py +191 -0
  27. django_cfg/apps/payments/admin_interface/views/api/stats.py +206 -0
  28. django_cfg/apps/payments/admin_interface/views/api/users.py +60 -0
  29. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +257 -0
  30. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +70 -0
  31. django_cfg/apps/payments/admin_interface/views/base.py +114 -0
  32. django_cfg/apps/payments/admin_interface/views/dashboard.py +60 -0
  33. django_cfg/apps/payments/admin_interface/views/forms.py +94 -0
  34. django_cfg/apps/payments/config/helpers.py +2 -2
  35. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +429 -0
  36. django_cfg/apps/payments/management/commands/currency_stats.py +443 -0
  37. django_cfg/apps/payments/management/commands/manage_currencies.py +9 -20
  38. django_cfg/apps/payments/management/commands/manage_providers.py +5 -5
  39. django_cfg/apps/payments/management/commands/process_pending_payments.py +357 -0
  40. django_cfg/apps/payments/management/commands/test_providers.py +434 -0
  41. django_cfg/apps/payments/middleware/api_access.py +35 -34
  42. django_cfg/apps/payments/migrations/0001_initial.py +1 -1
  43. django_cfg/apps/payments/models/balance.py +5 -2
  44. django_cfg/apps/payments/models/managers/api_key_managers.py +6 -2
  45. django_cfg/apps/payments/models/managers/balance_managers.py +3 -3
  46. django_cfg/apps/payments/models/managers/payment_managers.py +5 -0
  47. django_cfg/apps/payments/models/managers/subscription_managers.py +3 -3
  48. django_cfg/apps/payments/models/subscriptions.py +0 -24
  49. django_cfg/apps/payments/services/cache/__init__.py +1 -1
  50. django_cfg/apps/payments/services/cache_service/__init__.py +143 -0
  51. django_cfg/apps/payments/services/cache_service/api_key_cache.py +37 -0
  52. django_cfg/apps/payments/services/cache_service/interfaces.py +32 -0
  53. django_cfg/apps/payments/services/cache_service/keys.py +49 -0
  54. django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +47 -0
  55. django_cfg/apps/payments/services/cache_service/simple_cache.py +101 -0
  56. django_cfg/apps/payments/services/core/balance_service.py +13 -2
  57. django_cfg/apps/payments/services/core/payment_service.py +49 -22
  58. django_cfg/apps/payments/services/integrations/ngrok_service.py +3 -3
  59. django_cfg/apps/payments/services/providers/registry.py +20 -0
  60. django_cfg/apps/payments/signals/api_key_signals.py +2 -2
  61. django_cfg/apps/payments/signals/balance_signals.py +8 -5
  62. django_cfg/apps/payments/static/payments/js/api-client.js +385 -0
  63. django_cfg/apps/payments/static/payments/js/ngrok-status.js +58 -0
  64. django_cfg/apps/payments/static/payments/js/payment-dashboard.js +50 -0
  65. django_cfg/apps/payments/static/payments/js/payment-form.js +175 -0
  66. django_cfg/apps/payments/static/payments/js/payment-list.js +95 -0
  67. django_cfg/apps/payments/static/payments/js/webhook-dashboard.js +154 -0
  68. django_cfg/apps/payments/urls.py +4 -0
  69. django_cfg/apps/payments/urls_admin.py +37 -18
  70. django_cfg/apps/payments/views/api/api_keys.py +14 -0
  71. django_cfg/apps/payments/views/api/base.py +1 -0
  72. django_cfg/apps/payments/views/api/currencies.py +2 -2
  73. django_cfg/apps/payments/views/api/payments.py +11 -5
  74. django_cfg/apps/payments/views/api/subscriptions.py +36 -31
  75. django_cfg/apps/payments/views/overview/__init__.py +40 -0
  76. django_cfg/apps/payments/views/overview/serializers.py +205 -0
  77. django_cfg/apps/payments/views/overview/services.py +439 -0
  78. django_cfg/apps/payments/views/overview/urls.py +27 -0
  79. django_cfg/apps/payments/views/overview/views.py +231 -0
  80. django_cfg/apps/payments/views/serializers/api_keys.py +20 -6
  81. django_cfg/apps/payments/views/serializers/balances.py +5 -8
  82. django_cfg/apps/payments/views/serializers/currencies.py +2 -6
  83. django_cfg/apps/payments/views/serializers/payments.py +37 -32
  84. django_cfg/apps/payments/views/serializers/subscriptions.py +4 -26
  85. django_cfg/apps/urls.py +2 -1
  86. django_cfg/core/config.py +25 -15
  87. django_cfg/core/generation.py +12 -12
  88. django_cfg/core/integration/display/startup.py +1 -1
  89. django_cfg/core/validation.py +4 -4
  90. django_cfg/management/commands/show_config.py +2 -2
  91. django_cfg/management/commands/tree.py +1 -3
  92. django_cfg/middleware/__init__.py +2 -0
  93. django_cfg/middleware/static_nocache.py +55 -0
  94. django_cfg/models/payments.py +13 -15
  95. django_cfg/models/security.py +15 -0
  96. django_cfg/modules/django_ngrok.py +6 -0
  97. django_cfg/modules/django_unfold/dashboard.py +1 -3
  98. django_cfg/utils/smart_defaults.py +51 -5
  99. {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/METADATA +1 -1
  100. {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/RECORD +111 -69
  101. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +0 -38
  102. django_cfg/apps/payments/admin_interface/views/payment_views.py +0 -259
  103. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +0 -37
  104. django_cfg/apps/payments/services/cache/cache_service.py +0 -235
  105. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/loading_spinner.html +0 -0
  106. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/notification.html +0 -0
  107. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/provider_card.html +0 -0
  108. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/currency_converter.html +0 -0
  109. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/payment_status.html +0 -0
  110. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/dashboard.css +0 -0
  111. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/components.js +0 -0
  112. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/utils.js +0 -0
  113. {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/WHEEL +0 -0
  114. {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/entry_points.txt +0 -0
  115. {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,175 @@
1
+ {% comment %}
2
+ Ngrok Status Component
3
+ Shows ngrok tunnel status with real-time updates
4
+ {% endcomment %}
5
+
6
+ <div class="bg-white dark:bg-gray-800 shadow rounded-lg" x-data="ngrokStatus()" x-init="init()">
7
+ <div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
8
+ <div class="flex items-center justify-between">
9
+ <h3 class="text-lg font-medium text-gray-900 dark:text-white flex items-center">
10
+ <span class="material-icons-outlined mr-2">language</span>
11
+ Ngrok Tunnel
12
+ </h3>
13
+ <div class="flex items-center space-x-2">
14
+ <button @click="refreshStatus()"
15
+ class="text-sm text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300">
16
+ <span class="material-icons-outlined" :class="{ 'animate-spin': loading }">refresh</span>
17
+ </button>
18
+ <button x-show="!status.active"
19
+ @click="showNgrokHelp = true"
20
+ class="text-sm text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200">
21
+ <span class="material-icons-outlined">help</span>
22
+ </button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+
27
+ <div class="p-6">
28
+ <!-- Status Indicator -->
29
+ <div class="flex items-center justify-between mb-4">
30
+ <div class="flex items-center">
31
+ <div class="w-3 h-3 rounded-full mr-2"
32
+ :class="status.active ? 'bg-green-500' : 'bg-red-500'"></div>
33
+ <span class="text-sm font-medium text-gray-900 dark:text-white">
34
+ Status: <span :class="status.active ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'"
35
+ x-text="status.active ? 'Active' : 'Inactive'"></span>
36
+ </span>
37
+ </div>
38
+ </div>
39
+
40
+ <!-- Public URL -->
41
+ <div x-show="status.active && status.public_url" class="mb-4">
42
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
43
+ Public URL
44
+ </label>
45
+ <div class="flex items-center">
46
+ <input type="text"
47
+ :value="status.public_url"
48
+ readonly
49
+ class="flex-1 px-3 py-2 text-sm bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-l-md text-gray-900 dark:text-white">
50
+ <button @click="copyUrl()"
51
+ class="px-3 py-2 bg-blue-600 text-white text-sm rounded-r-md hover:bg-blue-700">
52
+ <span class="material-icons-outlined text-sm">content_copy</span>
53
+ </button>
54
+ </div>
55
+ </div>
56
+
57
+ <!-- Webhook URL -->
58
+ <div x-show="status.active && status.webhook_url" class="mb-4">
59
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
60
+ Webhook URL
61
+ </label>
62
+ <div class="flex items-center">
63
+ <input type="text"
64
+ :value="status.webhook_url"
65
+ readonly
66
+ class="flex-1 px-3 py-2 text-sm bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-l-md text-gray-900 dark:text-white">
67
+ <button @click="copyWebhookUrl()"
68
+ class="px-3 py-2 bg-blue-600 text-white text-sm rounded-r-md hover:bg-blue-700">
69
+ <span class="material-icons-outlined text-sm">content_copy</span>
70
+ </button>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Error Message -->
75
+ <div x-show="!status.active && status.error" class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md">
76
+ <div class="flex items-center">
77
+ <span class="material-icons-outlined text-red-600 dark:text-red-400 mr-2">error</span>
78
+ <span class="text-sm text-red-800 dark:text-red-400" x-text="status.error"></span>
79
+ </div>
80
+ </div>
81
+
82
+ <!-- Inactive Ngrok Help -->
83
+ <div x-show="!status.active" class="mb-4 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md">
84
+ <div class="flex items-start">
85
+ <span class="material-icons-outlined text-blue-600 dark:text-blue-400 mr-2 mt-0.5">info</span>
86
+ <div class="flex-1">
87
+ <div class="text-sm text-blue-800 dark:text-blue-200 mb-2">
88
+ Ngrok tunnel is not active. To enable webhook testing, restart your server with:
89
+ </div>
90
+ <div class="bg-gray-900 rounded px-3 py-2 font-mono text-sm text-green-400 mb-2">
91
+ python manage.py runserver_ngrok
92
+ </div>
93
+ <button @click="showNgrokHelp = true"
94
+ class="text-sm text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 flex items-center">
95
+ <span class="material-icons-outlined mr-1 text-sm">help</span>
96
+ View detailed instructions
97
+ </button>
98
+ </div>
99
+ </div>
100
+ </div>
101
+
102
+ <!-- Actions -->
103
+ <div class="flex justify-end" x-show="status.active && status.public_url">
104
+ <button @click="openTunnel()"
105
+ class="px-4 py-2 bg-blue-600 text-white text-sm rounded-md hover:bg-blue-700 flex items-center">
106
+ <span class="material-icons-outlined mr-1 text-sm">open_in_new</span>
107
+ Open Tunnel
108
+ </button>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <script>
114
+ function ngrokStatus() {
115
+ return {
116
+ loading: false,
117
+ status: {
118
+ active: false,
119
+ public_url: '',
120
+ webhook_url: '',
121
+ error: null
122
+ },
123
+
124
+ async init() {
125
+ await this.refreshStatus();
126
+ },
127
+
128
+ async refreshStatus() {
129
+ this.loading = true;
130
+ try {
131
+ const response = await fetch('/cfg/admin/django_cfg_payments/admin/ngrok/status/');
132
+ if (response.ok) {
133
+ this.status = await response.json();
134
+ }
135
+ } catch (error) {
136
+ console.error('Failed to fetch ngrok status:', error);
137
+ } finally {
138
+ this.loading = false;
139
+ }
140
+ },
141
+
142
+ async startTunnel() {
143
+ this.loading = true;
144
+ try {
145
+ const response = await fetch('/cfg/admin/django_cfg_payments/admin/ngrok/start/', {
146
+ method: 'POST',
147
+ headers: {
148
+ 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
149
+ }
150
+ });
151
+ if (response.ok) {
152
+ await this.refreshStatus();
153
+ }
154
+ } catch (error) {
155
+ console.error('Failed to start ngrok:', error);
156
+ } finally {
157
+ this.loading = false;
158
+ }
159
+ },
160
+
161
+
162
+ copyUrl() {
163
+ navigator.clipboard.writeText(this.status.public_url);
164
+ },
165
+
166
+ copyWebhookUrl() {
167
+ navigator.clipboard.writeText(this.status.webhook_url);
168
+ },
169
+
170
+ openTunnel() {
171
+ window.open(this.status.public_url, '_blank');
172
+ }
173
+ };
174
+ }
175
+ </script>
@@ -1,36 +1,40 @@
1
1
  {% comment %}
2
- Status Card Component with Material Icons
2
+ Status Card Component
3
3
 
4
4
  Usage:
5
- {% include 'payments/components/status_card.html' with title="Ngrok Status" value="Active" icon="language" color_class="text-green-600" description="Tunnel URL available" %}
5
+ {% include 'payments/components/status_card.html' with title="Status" value="Active" icon="check_circle" status="success" %}
6
6
 
7
- Available icons: Material Icons names (e.g., "language", "payment", "check_circle", "error", "warning")
7
+ Status options: success, warning, error, info
8
8
  {% endcomment %}
9
9
 
10
- <div class="payment-card">
10
+ <div class="bg-white dark:bg-gray-800 shadow rounded-lg p-6">
11
11
  <div class="flex items-center">
12
12
  <div class="flex-shrink-0">
13
- <div class="w-10 h-10 bg-{{ icon_bg_color|default:'blue' }}-100 dark:bg-{{ icon_bg_color|default:'blue' }}-900 rounded-full flex items-center justify-center">
14
- <span class="material-icons-outlined text-{{ icon_bg_color|default:'blue' }}-600 dark:text-{{ icon_bg_color|default:'blue' }}-400">
15
- {{ icon|default:'analytics' }}
16
- </span>
13
+ <div class="w-10 h-10 rounded-full flex items-center justify-center
14
+ {% if status == 'success' %}bg-green-100 dark:bg-green-900/20
15
+ {% elif status == 'warning' %}bg-yellow-100 dark:bg-yellow-900/20
16
+ {% elif status == 'error' %}bg-red-100 dark:bg-red-900/20
17
+ {% else %}bg-blue-100 dark:bg-blue-900/20{% endif %}">
18
+ <span class="material-icons-outlined text-lg
19
+ {% if status == 'success' %}text-green-600 dark:text-green-400
20
+ {% elif status == 'warning' %}text-yellow-600 dark:text-yellow-400
21
+ {% elif status == 'error' %}text-red-600 dark:text-red-400
22
+ {% else %}text-blue-600 dark:text-blue-400{% endif %}">{{ icon|default:'info' }}</span>
17
23
  </div>
18
24
  </div>
19
25
  <div class="ml-4 flex-1">
20
26
  <h3 class="text-sm font-medium text-gray-900 dark:text-white">{{ title }}</h3>
21
- <p class="text-2xl font-semibold {{ color_class|default:'text-gray-900 dark:text-white' }} flex items-center">
22
- {{ value }}
23
- {% if status_icon %}
24
- <span class="material-icons-outlined ml-2 text-lg">{{ status_icon }}</span>
27
+ <div class="mt-1">
28
+ <span class="text-2xl font-semibold text-gray-900 dark:text-white">{{ value }}</span>
29
+ {% if description %}
30
+ <p class="text-sm text-gray-500 dark:text-gray-400 mt-1">{{ description }}</p>
25
31
  {% endif %}
26
- </p>
27
- {% if description %}
28
- <p class="text-xs text-gray-500 dark:text-gray-400 mt-1">{{ description }}</p>
29
- {% endif %}
32
+ </div>
30
33
  </div>
31
34
  {% if action_url %}
32
35
  <div class="ml-4">
33
- <a href="{{ action_url }}" class="btn-icon text-gray-400 hover:text-gray-600 dark:hover:text-gray-200">
36
+ <a href="{{ action_url }}"
37
+ class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200">
34
38
  <span class="material-icons-outlined">{{ action_icon|default:'open_in_new' }}</span>
35
39
  </a>
36
40
  </div>