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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/payments/admin_interface/old/payments/base.html +175 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +125 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +113 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +35 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +309 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +303 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +382 -0
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +518 -0
- django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/components.css +248 -9
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +163 -0
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +39 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +149 -0
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +114 -0
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +55 -90
- django_cfg/apps/payments/admin_interface/templates/payments/components/dialog.html +81 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_help_dialog.html +112 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +175 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +21 -17
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +123 -250
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +170 -269
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +152 -355
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +202 -551
- django_cfg/apps/payments/admin_interface/views/__init__.py +25 -14
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +20 -0
- django_cfg/apps/payments/admin_interface/views/api/payments.py +191 -0
- django_cfg/apps/payments/admin_interface/views/api/stats.py +206 -0
- django_cfg/apps/payments/admin_interface/views/api/users.py +60 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +257 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +70 -0
- django_cfg/apps/payments/admin_interface/views/base.py +114 -0
- django_cfg/apps/payments/admin_interface/views/dashboard.py +60 -0
- django_cfg/apps/payments/admin_interface/views/forms.py +94 -0
- django_cfg/apps/payments/config/helpers.py +2 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +429 -0
- django_cfg/apps/payments/management/commands/currency_stats.py +443 -0
- django_cfg/apps/payments/management/commands/manage_currencies.py +9 -20
- django_cfg/apps/payments/management/commands/manage_providers.py +5 -5
- django_cfg/apps/payments/management/commands/process_pending_payments.py +357 -0
- django_cfg/apps/payments/management/commands/test_providers.py +434 -0
- django_cfg/apps/payments/middleware/api_access.py +35 -34
- django_cfg/apps/payments/migrations/0001_initial.py +1 -1
- django_cfg/apps/payments/models/balance.py +5 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +6 -2
- django_cfg/apps/payments/models/managers/balance_managers.py +3 -3
- django_cfg/apps/payments/models/managers/payment_managers.py +5 -0
- django_cfg/apps/payments/models/managers/subscription_managers.py +3 -3
- django_cfg/apps/payments/models/subscriptions.py +0 -24
- django_cfg/apps/payments/services/cache/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +143 -0
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +37 -0
- django_cfg/apps/payments/services/cache_service/interfaces.py +32 -0
- django_cfg/apps/payments/services/cache_service/keys.py +49 -0
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +47 -0
- django_cfg/apps/payments/services/cache_service/simple_cache.py +101 -0
- django_cfg/apps/payments/services/core/balance_service.py +13 -2
- django_cfg/apps/payments/services/core/payment_service.py +49 -22
- django_cfg/apps/payments/services/integrations/ngrok_service.py +3 -3
- django_cfg/apps/payments/services/providers/registry.py +20 -0
- django_cfg/apps/payments/signals/api_key_signals.py +2 -2
- django_cfg/apps/payments/signals/balance_signals.py +8 -5
- django_cfg/apps/payments/static/payments/js/api-client.js +385 -0
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +58 -0
- django_cfg/apps/payments/static/payments/js/payment-dashboard.js +50 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +175 -0
- django_cfg/apps/payments/static/payments/js/payment-list.js +95 -0
- django_cfg/apps/payments/static/payments/js/webhook-dashboard.js +154 -0
- django_cfg/apps/payments/urls.py +4 -0
- django_cfg/apps/payments/urls_admin.py +37 -18
- django_cfg/apps/payments/views/api/api_keys.py +14 -0
- django_cfg/apps/payments/views/api/base.py +1 -0
- django_cfg/apps/payments/views/api/currencies.py +2 -2
- django_cfg/apps/payments/views/api/payments.py +11 -5
- django_cfg/apps/payments/views/api/subscriptions.py +36 -31
- django_cfg/apps/payments/views/overview/__init__.py +40 -0
- django_cfg/apps/payments/views/overview/serializers.py +205 -0
- django_cfg/apps/payments/views/overview/services.py +439 -0
- django_cfg/apps/payments/views/overview/urls.py +27 -0
- django_cfg/apps/payments/views/overview/views.py +231 -0
- django_cfg/apps/payments/views/serializers/api_keys.py +20 -6
- django_cfg/apps/payments/views/serializers/balances.py +5 -8
- django_cfg/apps/payments/views/serializers/currencies.py +2 -6
- django_cfg/apps/payments/views/serializers/payments.py +37 -32
- django_cfg/apps/payments/views/serializers/subscriptions.py +4 -26
- django_cfg/apps/urls.py +2 -1
- django_cfg/core/config.py +25 -15
- django_cfg/core/generation.py +12 -12
- django_cfg/core/integration/display/startup.py +1 -1
- django_cfg/core/validation.py +4 -4
- django_cfg/management/commands/show_config.py +2 -2
- django_cfg/management/commands/tree.py +1 -3
- django_cfg/middleware/__init__.py +2 -0
- django_cfg/middleware/static_nocache.py +55 -0
- django_cfg/models/payments.py +13 -15
- django_cfg/models/security.py +15 -0
- django_cfg/modules/django_ngrok.py +6 -0
- django_cfg/modules/django_unfold/dashboard.py +1 -3
- django_cfg/utils/smart_defaults.py +51 -5
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/METADATA +1 -1
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/RECORD +111 -69
- django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +0 -38
- django_cfg/apps/payments/admin_interface/views/payment_views.py +0 -259
- django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +0 -37
- django_cfg/apps/payments/services/cache/cache_service.py +0 -235
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/loading_spinner.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/notification.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/provider_card.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/currency_converter.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/payment_status.html +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/dashboard.css +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/components.js +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/utils.js +0 -0
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/entry_points.txt +0 -0
- {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
|
2
|
+
Status Card Component
|
3
3
|
|
4
4
|
Usage:
|
5
|
-
{% include 'payments/components/status_card.html' with title="
|
5
|
+
{% include 'payments/components/status_card.html' with title="Status" value="Active" icon="check_circle" status="success" %}
|
6
6
|
|
7
|
-
|
7
|
+
Status options: success, warning, error, info
|
8
8
|
{% endcomment %}
|
9
9
|
|
10
|
-
<div class="
|
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
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
<
|
22
|
-
{{ value }}
|
23
|
-
{% if
|
24
|
-
<
|
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
|
-
</
|
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 }}"
|
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>
|