django-cfg 1.3.5__py3-none-any.whl β 1.3.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/__init__.py +24 -8
- django_cfg/apps/accounts/admin/activity_admin.py +146 -0
- django_cfg/apps/accounts/admin/filters.py +98 -22
- django_cfg/apps/accounts/admin/group_admin.py +86 -0
- django_cfg/apps/accounts/admin/inlines.py +42 -13
- django_cfg/apps/accounts/admin/otp_admin.py +115 -0
- django_cfg/apps/accounts/admin/registration_admin.py +173 -0
- django_cfg/apps/accounts/admin/resources.py +123 -19
- django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
- django_cfg/apps/accounts/admin/user_admin.py +362 -0
- django_cfg/apps/agents/admin/__init__.py +17 -4
- django_cfg/apps/agents/admin/execution_admin.py +204 -183
- django_cfg/apps/agents/admin/registry_admin.py +230 -255
- django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
- django_cfg/apps/agents/core/__init__.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +221 -0
- django_cfg/apps/agents/core/exceptions.py +14 -0
- django_cfg/apps/agents/core/orchestrator.py +18 -3
- django_cfg/apps/knowbase/admin/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
- django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
- django_cfg/apps/knowbase/admin/document_admin.py +269 -262
- django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
- django_cfg/apps/knowbase/config/settings.py +21 -4
- django_cfg/apps/knowbase/views/chat_views.py +3 -0
- django_cfg/apps/leads/admin/__init__.py +3 -1
- django_cfg/apps/leads/admin/leads_admin.py +235 -35
- django_cfg/apps/maintenance/admin/__init__.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
- django_cfg/apps/maintenance/admin/log_admin.py +143 -61
- django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
- django_cfg/apps/maintenance/admin/site_admin.py +213 -352
- django_cfg/apps/newsletter/admin/__init__.py +29 -2
- django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
- django_cfg/apps/payments/admin/__init__.py +18 -27
- django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
- django_cfg/apps/payments/admin/balance_admin.py +166 -632
- django_cfg/apps/payments/admin/currencies_admin.py +235 -607
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
- django_cfg/apps/payments/admin/filters.py +83 -3
- django_cfg/apps/payments/admin/networks_admin.py +258 -0
- django_cfg/apps/payments/admin/payments_admin.py +171 -461
- django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
- django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
- django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
- django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
- django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
- django_cfg/apps/payments/middleware/api_access.py +32 -6
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
- django_cfg/apps/payments/models/balance.py +12 -0
- django_cfg/apps/payments/models/currencies.py +106 -32
- django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
- django_cfg/apps/payments/services/core/currency_service.py +35 -28
- django_cfg/apps/payments/services/core/payment_service.py +1 -1
- django_cfg/apps/payments/services/providers/__init__.py +3 -0
- django_cfg/apps/payments/services/providers/base.py +95 -39
- django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
- django_cfg/apps/payments/services/providers/models/base.py +122 -0
- django_cfg/apps/payments/services/providers/models/providers.py +87 -0
- django_cfg/apps/payments/services/providers/models/universal.py +48 -0
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
- django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
- django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
- django_cfg/apps/payments/services/providers/{nowpayments.py β nowpayments/provider.py} +240 -209
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
- django_cfg/apps/payments/services/providers/registry.py +4 -32
- django_cfg/apps/payments/services/providers/sync_service.py +277 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
- django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
- django_cfg/apps/payments/tasks/__init__.py +39 -0
- django_cfg/apps/payments/tasks/types.py +73 -0
- django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
- django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
- django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
- django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
- django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
- django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
- django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
- django_cfg/apps/payments/urls_admin.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +5 -5
- django_cfg/apps/payments/views/overview/services.py +2 -2
- django_cfg/apps/payments/views/serializers/currencies.py +4 -3
- django_cfg/apps/support/admin/__init__.py +10 -1
- django_cfg/apps/support/admin/support_admin.py +338 -141
- django_cfg/apps/tasks/admin/__init__.py +11 -0
- django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
- django_cfg/apps/urls.py +1 -2
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +10 -5
- django_cfg/core/generation.py +1 -1
- django_cfg/management/commands/__init__.py +13 -1
- django_cfg/management/commands/app_agent_diagnose.py +470 -0
- django_cfg/management/commands/app_agent_generate.py +342 -0
- django_cfg/management/commands/app_agent_info.py +308 -0
- django_cfg/management/commands/migrate_all.py +9 -3
- django_cfg/management/commands/migrator.py +11 -6
- django_cfg/management/commands/rundramatiq.py +3 -2
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/models/api_keys.py +115 -0
- django_cfg/modules/django_admin/__init__.py +64 -0
- django_cfg/modules/django_admin/decorators/__init__.py +13 -0
- django_cfg/modules/django_admin/decorators/actions.py +106 -0
- django_cfg/modules/django_admin/decorators/display.py +106 -0
- django_cfg/modules/django_admin/mixins/__init__.py +14 -0
- django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
- django_cfg/modules/django_admin/models/__init__.py +20 -0
- django_cfg/modules/django_admin/models/action_models.py +33 -0
- django_cfg/modules/django_admin/models/badge_models.py +20 -0
- django_cfg/modules/django_admin/models/base.py +26 -0
- django_cfg/modules/django_admin/models/display_models.py +31 -0
- django_cfg/modules/django_admin/utils/badges.py +159 -0
- django_cfg/modules/django_admin/utils/displays.py +247 -0
- django_cfg/modules/django_app_agent/__init__.py +87 -0
- django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
- django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
- django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
- django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
- django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
- django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
- django_cfg/modules/django_app_agent/core/__init__.py +33 -0
- django_cfg/modules/django_app_agent/core/config.py +300 -0
- django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
- django_cfg/modules/django_app_agent/models/__init__.py +71 -0
- django_cfg/modules/django_app_agent/models/base.py +283 -0
- django_cfg/modules/django_app_agent/models/context.py +496 -0
- django_cfg/modules/django_app_agent/models/enums.py +481 -0
- django_cfg/modules/django_app_agent/models/requests.py +500 -0
- django_cfg/modules/django_app_agent/models/responses.py +585 -0
- django_cfg/modules/django_app_agent/pytest.ini +6 -0
- django_cfg/modules/django_app_agent/services/__init__.py +42 -0
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
- django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
- django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
- django_cfg/modules/django_app_agent/services/base.py +437 -0
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
- django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
- django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
- django_cfg/modules/django_app_agent/services/report_service.py +332 -0
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
- django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
- django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
- django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
- django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
- django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
- django_cfg/modules/django_app_agent/ui/cli.py +419 -0
- django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
- django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
- django_cfg/modules/django_app_agent/utils/logging.py +360 -0
- django_cfg/modules/django_app_agent/utils/validation.py +417 -0
- django_cfg/modules/django_currency/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
- django_cfg/modules/django_currency/core/converter.py +12 -12
- django_cfg/modules/django_currency/database/__init__.py +2 -2
- django_cfg/modules/django_currency/database/database_loader.py +93 -42
- django_cfg/modules/django_llm/llm/client.py +10 -2
- django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
- django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
- django_cfg/modules/django_unfold/dashboard.py +14 -13
- django_cfg/modules/django_unfold/models/config.py +1 -1
- django_cfg/registry/core.py +3 -0
- django_cfg/registry/third_party.py +2 -2
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.5.dist-info β django_cfg-1.3.9.dist-info}/METADATA +2 -1
- {django_cfg-1.3.5.dist-info β django_cfg-1.3.9.dist-info}/RECORD +224 -118
- django_cfg/apps/accounts/admin/activity.py +0 -96
- django_cfg/apps/accounts/admin/group.py +0 -17
- django_cfg/apps/accounts/admin/otp.py +0 -59
- django_cfg/apps/accounts/admin/registration_source.py +0 -97
- django_cfg/apps/accounts/admin/twilio_response.py +0 -227
- django_cfg/apps/accounts/admin/user.py +0 -300
- django_cfg/apps/agents/core/agent.py +0 -281
- django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
- django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
- django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
- django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
- django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
- django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
- django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
- django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
- django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
- django_cfg/apps/tasks/admin.py +0 -320
- django_cfg/middleware/static_nocache.py +0 -55
- django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
- /django_cfg/modules/{django_unfold β django_admin}/icons/README.md +0 -0
- /django_cfg/modules/{django_unfold β django_admin}/icons/__init__.py +0 -0
- /django_cfg/modules/{django_unfold β django_admin}/icons/constants.py +0 -0
- /django_cfg/modules/{django_unfold β django_admin}/icons/generate_icons.py +0 -0
- {django_cfg-1.3.5.dist-info β django_cfg-1.3.9.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.5.dist-info β django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.5.dist-info β django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
{% extends "admin/change_list.html" %}
|
2
|
+
{% load static %}
|
3
|
+
|
4
|
+
{% block result_list %}
|
5
|
+
<!-- Balance Statistics Dashboard -->
|
6
|
+
{% if balance_stats %}
|
7
|
+
{% include "admin/payments/_components/dashboard_header.html" with title="Balance Overview" icon="π°" %}
|
8
|
+
|
9
|
+
{% with stats=balance_stats %}
|
10
|
+
<div class="grid grid-cols-4 gap-4 mb-4">
|
11
|
+
{% include "admin/payments/_components/stats_card.html" with title="Total Balances" value=stats.total_balances color="primary" %}
|
12
|
+
{% include "admin/payments/_components/stats_card.html" with title="Total Value" value="$"|add:stats.total_balance|floatformat:2 color="success" %}
|
13
|
+
{% include "admin/payments/_components/stats_card.html" with title="Average Balance" value="$"|add:stats.avg_balance|floatformat:2 color="warning" %}
|
14
|
+
{% include "admin/payments/_components/stats_card.html" with title="Active (7 days)" value=stats.active_balances color="info" %}
|
15
|
+
</div>
|
16
|
+
{% endwith %}
|
17
|
+
|
18
|
+
<div class="grid grid-cols-3 gap-4">
|
19
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
20
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Balance Distribution</h4>
|
21
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
22
|
+
<li>πΈ Empty: <span class="font-medium text-base-600 dark:text-base-400">{{ balance_stats.zero_balances|default:0 }}</span></li>
|
23
|
+
<li>πͺ Low ($0-10): <span class="font-medium text-yellow-600 dark:text-yellow-400">{{ balance_stats.low_balances|default:0 }}</span></li>
|
24
|
+
<li>π° Medium ($10-100): <span class="font-medium text-green-600 dark:text-green-400">{{ balance_stats.medium_balances|default:0 }}</span></li>
|
25
|
+
<li>π High ($100-1000): <span class="font-medium text-blue-600 dark:text-blue-400">{{ balance_stats.high_balances|default:0 }}</span></li>
|
26
|
+
<li>π Whale ($1000+): <span class="font-medium text-purple-600 dark:text-purple-400">{{ balance_stats.whale_balances|default:0 }}</span></li>
|
27
|
+
</ul>
|
28
|
+
</div>
|
29
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
30
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π¨ Alerts</h4>
|
31
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
32
|
+
<li>β οΈ Negative: <span class="font-medium text-red-600 dark:text-red-400">{{ balance_stats.negative_balances|default:0 }}</span></li>
|
33
|
+
<li>π Reserved: <span class="font-medium text-orange-600 dark:text-orange-400">${{ balance_stats.total_reserved|floatformat:2|default:0 }}</span></li>
|
34
|
+
</ul>
|
35
|
+
</div>
|
36
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
37
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π Top Balances</h4>
|
38
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
39
|
+
{% for balance in balance_stats.top_balances %}
|
40
|
+
<li><span class="font-semibold text-primary-600 dark:text-primary-400">{{ balance.user.username|truncatechars:15 }}:</span> ${{ balance.balance_usd|floatformat:2 }}</li>
|
41
|
+
{% empty %}
|
42
|
+
<li class="text-font-subtle-light dark:text-font-subtle-dark">No balances available</li>
|
43
|
+
{% endfor %}
|
44
|
+
</ul>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
{% endif %}
|
48
|
+
|
49
|
+
{{ block.super }}
|
50
|
+
{% endblock %}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
{% extends "admin/change_list.html" %}
|
2
|
+
{% load static %}
|
3
|
+
|
4
|
+
{% block result_list %}
|
5
|
+
<!-- Currency Statistics Dashboard -->
|
6
|
+
{% if currency_stats %}
|
7
|
+
{% include "admin/payments/_components/dashboard_header.html" with title="Currency Overview" icon="π" %}
|
8
|
+
|
9
|
+
{% with stats=currency_stats %}
|
10
|
+
<div class="grid grid-cols-4 gap-4 mb-4">
|
11
|
+
{% include "admin/payments/_components/stats_card.html" with title="Total Currencies" value=stats.total_currencies color="primary" %}
|
12
|
+
{% include "admin/payments/_components/stats_card.html" with title="Provider Mappings" value=stats.enabled_provider_currencies color="success" %}
|
13
|
+
{% include "admin/payments/_components/stats_card.html" with title="With USD Rates" value=stats.currencies_with_rates color="warning" %}
|
14
|
+
{% include "admin/payments/_components/stats_card.html" with title="Rate Coverage" value=stats.rate_coverage|floatformat:1|add:"%" color="info" %}
|
15
|
+
</div>
|
16
|
+
{% endwith %}
|
17
|
+
|
18
|
+
<div class="grid grid-cols-2 gap-4">
|
19
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
20
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Currency Types</h4>
|
21
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
22
|
+
<li>π΅ Fiat: <span class="font-medium text-primary-600 dark:text-primary-400">{{ stats.fiat_count|default:0 }}</span></li>
|
23
|
+
<li>βΏ Crypto: <span class="font-medium text-warning-600 dark:text-warning-400">{{ stats.crypto_count|default:0 }}</span></li>
|
24
|
+
</ul>
|
25
|
+
</div>
|
26
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
27
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π Top Supported</h4>
|
28
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
29
|
+
{% for currency in stats.top_currencies %}
|
30
|
+
<li><span class="font-semibold text-primary-600 dark:text-primary-400">{{ currency.code }}:</span> {{ currency.provider_count }} provider{{ currency.provider_count|pluralize }}</li>
|
31
|
+
{% empty %}
|
32
|
+
<li class="text-font-subtle-light dark:text-font-subtle-dark">No provider data available</li>
|
33
|
+
{% endfor %}
|
34
|
+
</ul>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
{% endif %}
|
38
|
+
|
39
|
+
{{ block.super }}
|
40
|
+
{% endblock %}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
{% extends "admin/change_list.html" %}
|
2
|
+
{% load static %}
|
3
|
+
|
4
|
+
{% block result_list %}
|
5
|
+
<!-- Payment Statistics Dashboard -->
|
6
|
+
{% if payment_stats %}
|
7
|
+
{% include "admin/payments/_components/dashboard_header.html" with title="Payment Overview" icon="π³" %}
|
8
|
+
|
9
|
+
{% with stats=payment_stats %}
|
10
|
+
<div class="grid grid-cols-4 gap-4 mb-4">
|
11
|
+
{% include "admin/payments/_components/stats_card.html" with title="Total Payments" value=stats.total_payments color="primary" %}
|
12
|
+
{% include "admin/payments/_components/stats_card.html" with title="Completed" value=stats.status_stats.completed|default:0 color="success" %}
|
13
|
+
{% include "admin/payments/_components/stats_card.html" with title="Pending" value=stats.status_stats.pending|default:0 color="warning" %}
|
14
|
+
{% include "admin/payments/_components/stats_card.html" with title="Failed" value=stats.status_stats.failed|default:0 color="error" %}
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div class="grid grid-cols-3 gap-4">
|
18
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
19
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π° Financial</h4>
|
20
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
21
|
+
<li>Total Volume: <span class="font-medium text-primary-600 dark:text-primary-400">${{ stats.total_amount|floatformat:2|default:0 }}</span></li>
|
22
|
+
<li>Completed: <span class="font-medium text-success-600 dark:text-success-400">${{ stats.completed_amount|floatformat:2|default:0 }}</span></li>
|
23
|
+
<li>Success Rate: <span class="font-medium text-info-600 dark:text-info-400">{{ stats.success_rate|floatformat:1|default:0 }}%</span></li>
|
24
|
+
</ul>
|
25
|
+
</div>
|
26
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
27
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π Recent (24h)</h4>
|
28
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
29
|
+
<li>Payments: <span class="font-medium text-primary-600 dark:text-primary-400">{{ stats.recent_payments|default:0 }}</span></li>
|
30
|
+
<li>Volume: <span class="font-medium text-success-600 dark:text-success-400">${{ stats.recent_amount|floatformat:2|default:0 }}</span></li>
|
31
|
+
</ul>
|
32
|
+
</div>
|
33
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
34
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π Providers</h4>
|
35
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
36
|
+
{% for provider in stats.provider_stats %}
|
37
|
+
<li>{{ provider.provider|title }}: <span class="font-medium text-primary-600 dark:text-primary-400">{{ provider.count }}</span></li>
|
38
|
+
{% empty %}
|
39
|
+
<li class="text-font-subtle-light dark:text-font-subtle-dark">No provider data</li>
|
40
|
+
{% endfor %}
|
41
|
+
</ul>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
{% endwith %}
|
45
|
+
{% endif %}
|
46
|
+
|
47
|
+
{{ block.super }}
|
48
|
+
{% endblock %}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
{% extends "admin/change_list.html" %}
|
2
|
+
{% load static %}
|
3
|
+
|
4
|
+
{% block result_list %}
|
5
|
+
<!-- Subscription Statistics Dashboard -->
|
6
|
+
{% if subscription_stats %}
|
7
|
+
{% include "admin/payments/_components/dashboard_header.html" with title="Subscriptions Overview" icon="π" %}
|
8
|
+
|
9
|
+
{% with stats=subscription_stats %}
|
10
|
+
<div class="grid grid-cols-4 gap-4 mb-4">
|
11
|
+
{% include "admin/payments/_components/stats_card.html" with title="Total Subscriptions" value=stats.total_subscriptions color="primary" %}
|
12
|
+
{% include "admin/payments/_components/stats_card.html" with title="Active" value=stats.active_subscriptions color="success" %}
|
13
|
+
{% include "admin/payments/_components/stats_card.html" with title="Expiring Soon" value=stats.expiring_subscriptions color="warning" %}
|
14
|
+
{% include "admin/payments/_components/stats_card.html" with title="Monthly Revenue" value="$"|add:stats.monthly_revenue|floatformat:2 color="info" %}
|
15
|
+
</div>
|
16
|
+
{% endwith %}
|
17
|
+
{% endif %}
|
18
|
+
|
19
|
+
<div class="grid grid-cols-3 gap-4">
|
20
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
21
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Subscription Tiers</h4>
|
22
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
23
|
+
<li>π₯ Basic: <span class="font-medium text-base-600 dark:text-base-400">{{ stats.basic_subs|default:0 }}</span></li>
|
24
|
+
<li>π₯ Premium: <span class="font-medium text-blue-600 dark:text-blue-400">{{ stats.premium_subs|default:0 }}</span></li>
|
25
|
+
<li>π₯ Enterprise: <span class="font-medium text-purple-600 dark:text-purple-400">{{ stats.enterprise_subs|default:0 }}</span></li>
|
26
|
+
</ul>
|
27
|
+
</div>
|
28
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
29
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">Status Distribution</h4>
|
30
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
31
|
+
<li>β
Active: <span class="font-medium text-success-600 dark:text-success-400">{{ stats.active_count|default:0 }}</span></li>
|
32
|
+
<li>βΈοΈ Paused: <span class="font-medium text-warning-600 dark:text-warning-400">{{ stats.paused_count|default:0 }}</span></li>
|
33
|
+
<li>β Cancelled: <span class="font-medium text-error-600 dark:text-error-400">{{ stats.cancelled_count|default:0 }}</span></li>
|
34
|
+
<li>β° Expired: <span class="font-medium text-base-600 dark:text-base-400">{{ stats.expired_count|default:0 }}</span></li>
|
35
|
+
</ul>
|
36
|
+
</div>
|
37
|
+
<div class="bg-base-50 dark:bg-base-800 p-3 rounded-default">
|
38
|
+
<h4 class="font-semibold text-font-important-light dark:text-font-important-dark mb-2">π Metrics</h4>
|
39
|
+
<ul class="text-sm space-y-1 text-font-default-light dark:text-font-default-dark">
|
40
|
+
<li>π New (30d): <span class="font-medium text-success-600 dark:text-success-400">{{ stats.new_subs_30d|default:0 }}</span></li>
|
41
|
+
<li>π Churn Rate: <span class="font-medium text-warning-600 dark:text-warning-400">{{ stats.churn_rate|floatformat:1|default:0 }}%</span></li>
|
42
|
+
<li>π° ARPU: <span class="font-medium text-primary-600 dark:text-primary-400">${{ stats.arpu|floatformat:2|default:0 }}</span></li>
|
43
|
+
</ul>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
{{ block.super }}
|
48
|
+
{% endblock %}
|
@@ -39,7 +39,7 @@ webhook_events_router.register(r'events', AdminWebhookEventViewSet, basename='ad
|
|
39
39
|
|
40
40
|
# Public API router (no authentication required)
|
41
41
|
public_router = DefaultRouter()
|
42
|
-
public_router.register(r'
|
42
|
+
public_router.register(r'webhook-test', WebhookTestViewSet, basename='webhook-test')
|
43
43
|
|
44
44
|
urlpatterns = [
|
45
45
|
# Template Views
|
@@ -128,7 +128,7 @@ class CurrencyViewSet(ReadOnlyPaymentViewSet):
|
|
128
128
|
currency = self.get_object()
|
129
129
|
provider_currencies = ProviderCurrency.objects.filter(
|
130
130
|
currency=currency,
|
131
|
-
|
131
|
+
is_enabled=True
|
132
132
|
)
|
133
133
|
serializer = ProviderCurrencySerializer(provider_currencies, many=True)
|
134
134
|
|
@@ -253,7 +253,7 @@ class ProviderCurrencyViewSet(ReadOnlyPaymentViewSet):
|
|
253
253
|
permission_classes = [permissions.IsAuthenticated]
|
254
254
|
filterset_fields = ['provider', 'currency__code', 'network__code', 'is_enabled']
|
255
255
|
search_fields = ['provider_currency_code']
|
256
|
-
ordering_fields = ['provider', 'created_at'
|
256
|
+
ordering_fields = ['provider', 'created_at']
|
257
257
|
|
258
258
|
def get_queryset(self):
|
259
259
|
"""Optimize queryset with related objects."""
|
@@ -319,9 +319,9 @@ class ProviderCurrencyViewSet(ReadOnlyPaymentViewSet):
|
|
319
319
|
limits[key] = {
|
320
320
|
'provider': provider,
|
321
321
|
'currency': currency_code,
|
322
|
-
'min_amount':
|
323
|
-
'max_amount':
|
324
|
-
'fee_percentage':
|
322
|
+
'min_amount': provider_currency.provider_min_amount_usd,
|
323
|
+
'max_amount': provider_currency.provider_max_amount_usd,
|
324
|
+
'fee_percentage': provider_currency.provider_fee_percentage,
|
325
325
|
}
|
326
326
|
|
327
327
|
return Response({
|
@@ -260,8 +260,8 @@ class PaymentsUsageChartService:
|
|
260
260
|
None
|
261
261
|
)
|
262
262
|
|
263
|
-
total_amount = day_data['total_amount'] if day_data else 0.0
|
264
|
-
completed_amount = day_data['completed_amount'] if day_data else 0.0
|
263
|
+
total_amount = day_data['total_amount'] if day_data and day_data['total_amount'] is not None else 0.0
|
264
|
+
completed_amount = day_data['completed_amount'] if day_data and day_data['completed_amount'] is not None else 0.0
|
265
265
|
failed_count = day_data['failed_count'] if day_data else 0
|
266
266
|
|
267
267
|
amounts_data.append({'x': date_str, 'y': total_amount})
|
@@ -106,9 +106,10 @@ class ProviderCurrencySerializer(serializers.ModelSerializer):
|
|
106
106
|
'network',
|
107
107
|
'provider',
|
108
108
|
'provider_currency_code',
|
109
|
-
'
|
110
|
-
'
|
111
|
-
'
|
109
|
+
'provider_min_amount_usd',
|
110
|
+
'provider_max_amount_usd',
|
111
|
+
'provider_fee_percentage',
|
112
|
+
'provider_fixed_fee_usd',
|
112
113
|
'is_enabled',
|
113
114
|
'created_at',
|
114
115
|
'updated_at',
|
@@ -1,10 +1,19 @@
|
|
1
1
|
"""
|
2
|
-
|
2
|
+
Support admin interfaces using Django-CFG admin system.
|
3
|
+
|
4
|
+
Refactored admin interfaces with Material Icons and optimized queries.
|
3
5
|
"""
|
4
6
|
|
5
7
|
from .support_admin import TicketAdmin, MessageAdmin
|
8
|
+
from .filters import TicketUserEmailFilter, TicketUserNameFilter, MessageSenderEmailFilter
|
9
|
+
from .resources import TicketResource, MessageResource
|
6
10
|
|
7
11
|
__all__ = [
|
8
12
|
'TicketAdmin',
|
9
13
|
'MessageAdmin',
|
14
|
+
'TicketUserEmailFilter',
|
15
|
+
'TicketUserNameFilter',
|
16
|
+
'MessageSenderEmailFilter',
|
17
|
+
'TicketResource',
|
18
|
+
'MessageResource',
|
10
19
|
]
|