django-cfg 1.3.7__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.
Files changed (251) 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 +258 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +171 -461
  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 +105 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
  48. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  49. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
  50. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  51. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  52. django_cfg/apps/payments/middleware/api_access.py +32 -6
  53. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
  54. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
  55. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
  56. django_cfg/apps/payments/models/balance.py +12 -0
  57. django_cfg/apps/payments/models/currencies.py +106 -32
  58. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  59. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  60. django_cfg/apps/payments/services/core/payment_service.py +1 -1
  61. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  62. django_cfg/apps/payments/services/providers/base.py +95 -39
  63. django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
  64. django_cfg/apps/payments/services/providers/models/base.py +122 -0
  65. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  66. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  67. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  68. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  69. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  70. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  71. django_cfg/apps/payments/services/providers/{nowpayments.py β†’ nowpayments/provider.py} +240 -209
  72. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  73. django_cfg/apps/payments/services/providers/registry.py +4 -32
  74. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  75. django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
  76. django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
  77. django_cfg/apps/payments/tasks/__init__.py +39 -0
  78. django_cfg/apps/payments/tasks/types.py +73 -0
  79. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  80. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  81. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  82. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  83. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  84. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  85. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  86. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  87. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  88. django_cfg/apps/payments/urls_admin.py +1 -1
  89. django_cfg/apps/payments/views/api/currencies.py +5 -5
  90. django_cfg/apps/payments/views/overview/services.py +2 -2
  91. django_cfg/apps/payments/views/serializers/currencies.py +4 -3
  92. django_cfg/apps/support/admin/__init__.py +10 -1
  93. django_cfg/apps/support/admin/support_admin.py +338 -141
  94. django_cfg/apps/tasks/admin/__init__.py +11 -0
  95. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  96. django_cfg/config.py +1 -1
  97. django_cfg/core/config.py +10 -5
  98. django_cfg/core/generation.py +1 -1
  99. django_cfg/management/commands/__init__.py +13 -1
  100. django_cfg/management/commands/app_agent_diagnose.py +470 -0
  101. django_cfg/management/commands/app_agent_generate.py +342 -0
  102. django_cfg/management/commands/app_agent_info.py +308 -0
  103. django_cfg/management/commands/migrate_all.py +9 -3
  104. django_cfg/management/commands/migrator.py +11 -6
  105. django_cfg/management/commands/rundramatiq.py +3 -2
  106. django_cfg/middleware/__init__.py +0 -2
  107. django_cfg/models/api_keys.py +115 -0
  108. django_cfg/modules/django_admin/__init__.py +64 -0
  109. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  110. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  111. django_cfg/modules/django_admin/decorators/display.py +106 -0
  112. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  113. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  114. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  115. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  116. django_cfg/modules/django_admin/models/__init__.py +20 -0
  117. django_cfg/modules/django_admin/models/action_models.py +33 -0
  118. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  119. django_cfg/modules/django_admin/models/base.py +26 -0
  120. django_cfg/modules/django_admin/models/display_models.py +31 -0
  121. django_cfg/modules/django_admin/utils/badges.py +159 -0
  122. django_cfg/modules/django_admin/utils/displays.py +247 -0
  123. django_cfg/modules/django_app_agent/__init__.py +87 -0
  124. django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
  125. django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
  126. django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
  127. django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
  128. django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
  129. django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
  130. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
  131. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
  132. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
  133. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
  134. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
  135. django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
  136. django_cfg/modules/django_app_agent/core/__init__.py +33 -0
  137. django_cfg/modules/django_app_agent/core/config.py +300 -0
  138. django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
  139. django_cfg/modules/django_app_agent/models/__init__.py +71 -0
  140. django_cfg/modules/django_app_agent/models/base.py +283 -0
  141. django_cfg/modules/django_app_agent/models/context.py +496 -0
  142. django_cfg/modules/django_app_agent/models/enums.py +481 -0
  143. django_cfg/modules/django_app_agent/models/requests.py +500 -0
  144. django_cfg/modules/django_app_agent/models/responses.py +585 -0
  145. django_cfg/modules/django_app_agent/pytest.ini +6 -0
  146. django_cfg/modules/django_app_agent/services/__init__.py +42 -0
  147. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
  148. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
  149. django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
  150. django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
  151. django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
  152. django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
  153. django_cfg/modules/django_app_agent/services/base.py +437 -0
  154. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
  155. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
  156. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
  157. django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
  158. django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
  159. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
  160. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
  161. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
  162. django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
  163. django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
  164. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
  165. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
  166. django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
  167. django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
  168. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
  169. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
  170. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
  171. django_cfg/modules/django_app_agent/services/report_service.py +332 -0
  172. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
  173. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
  174. django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
  175. django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
  176. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
  177. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
  178. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
  179. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
  180. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
  181. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
  182. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
  183. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
  184. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
  185. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
  186. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
  187. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
  188. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
  189. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
  190. django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
  191. django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
  192. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
  193. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
  194. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
  195. django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
  196. django_cfg/modules/django_app_agent/ui/cli.py +419 -0
  197. django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
  198. django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
  199. django_cfg/modules/django_app_agent/utils/logging.py +360 -0
  200. django_cfg/modules/django_app_agent/utils/validation.py +417 -0
  201. django_cfg/modules/django_currency/__init__.py +2 -2
  202. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  203. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  204. django_cfg/modules/django_currency/core/converter.py +12 -12
  205. django_cfg/modules/django_currency/database/__init__.py +2 -2
  206. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  207. django_cfg/modules/django_llm/llm/client.py +10 -2
  208. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  209. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  210. django_cfg/modules/django_unfold/dashboard.py +14 -13
  211. django_cfg/modules/django_unfold/models/config.py +1 -1
  212. django_cfg/registry/core.py +3 -0
  213. django_cfg/registry/third_party.py +2 -2
  214. django_cfg/template_archive/django_sample.zip +0 -0
  215. {django_cfg-1.3.7.dist-info β†’ django_cfg-1.3.9.dist-info}/METADATA +2 -1
  216. {django_cfg-1.3.7.dist-info β†’ django_cfg-1.3.9.dist-info}/RECORD +223 -117
  217. django_cfg/apps/accounts/admin/activity.py +0 -96
  218. django_cfg/apps/accounts/admin/group.py +0 -17
  219. django_cfg/apps/accounts/admin/otp.py +0 -59
  220. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  221. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  222. django_cfg/apps/accounts/admin/user.py +0 -300
  223. django_cfg/apps/agents/core/agent.py +0 -281
  224. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  225. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  226. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  227. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  228. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  229. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  230. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  231. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  232. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  233. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  234. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  235. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  236. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  237. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  238. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  239. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  240. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  241. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  242. django_cfg/apps/tasks/admin.py +0 -320
  243. django_cfg/middleware/static_nocache.py +0 -55
  244. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  245. /django_cfg/modules/{django_unfold β†’ django_admin}/icons/README.md +0 -0
  246. /django_cfg/modules/{django_unfold β†’ django_admin}/icons/__init__.py +0 -0
  247. /django_cfg/modules/{django_unfold β†’ django_admin}/icons/constants.py +0 -0
  248. /django_cfg/modules/{django_unfold β†’ django_admin}/icons/generate_icons.py +0 -0
  249. {django_cfg-1.3.7.dist-info β†’ django_cfg-1.3.9.dist-info}/WHEEL +0 -0
  250. {django_cfg-1.3.7.dist-info β†’ django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
  251. {django_cfg-1.3.7.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'webhooks', WebhookTestViewSet, basename='webhook-test')
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
- is_active=True
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', 'min_amount', 'max_amount']
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': float(provider_currency.min_amount or 0),
323
- 'max_amount': float(provider_currency.max_amount or 0),
324
- 'fee_percentage': float(provider_currency.fee_percentage or 0),
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
- 'min_amount',
110
- 'max_amount',
111
- 'fee_percentage',
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
- Admin configuration for Support app.
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
  ]