django-cfg 1.3.11__py3-none-any.whl → 1.4.0__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 (439) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/inlines.py +11 -5
  3. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  4. django_cfg/apps/accounts/serializers/profile.py +1 -1
  5. django_cfg/apps/accounts/services/otp_service.py +18 -11
  6. django_cfg/apps/accounts/signals.py +15 -24
  7. django_cfg/apps/accounts/utils/notifications.py +217 -358
  8. django_cfg/apps/accounts/views/otp.py +2 -2
  9. django_cfg/apps/accounts/views/webhook.py +1 -1
  10. django_cfg/apps/agents/core/django_agent.py +1 -1
  11. django_cfg/apps/api/commands/views.py +66 -83
  12. django_cfg/apps/api/health/drf_views.py +269 -0
  13. django_cfg/apps/api/health/serializers.py +45 -0
  14. django_cfg/apps/api/health/urls.py +6 -1
  15. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  16. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  17. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  18. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  19. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  20. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  21. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  22. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  23. django_cfg/apps/knowbase/config/settings.py +2 -2
  24. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  25. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  26. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  27. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  28. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  29. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  30. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  31. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  32. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  33. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  34. django_cfg/apps/knowbase/mixins/service.py +2 -2
  35. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  47. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  48. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  49. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  50. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  51. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  52. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  53. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  54. django_cfg/apps/leads/tests.py +1 -1
  55. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  56. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  57. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  58. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  59. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  60. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  61. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  67. django_cfg/apps/payments/apps.py +1 -1
  68. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  69. django_cfg/apps/payments/config/helpers.py +3 -2
  70. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  71. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  73. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  74. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  75. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  76. django_cfg/apps/payments/middleware/api_access.py +1 -1
  77. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  78. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  79. django_cfg/apps/payments/models/balance.py +2 -2
  80. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  84. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  85. django_cfg/apps/payments/models/payments.py +2 -2
  86. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  87. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  88. django_cfg/apps/payments/services/core/base.py +1 -1
  89. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  90. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  91. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  92. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  93. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  94. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  95. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  96. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  97. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  98. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  99. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  100. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  101. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  102. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  103. django_cfg/apps/payments/services/providers/base.py +1 -1
  104. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  112. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  113. django_cfg/apps/payments/services/providers/registry.py +1 -1
  114. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  115. django_cfg/apps/payments/signals/__init__.py +1 -1
  116. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  117. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  118. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  119. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  120. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  121. django_cfg/apps/payments/views/api/balances.py +1 -1
  122. django_cfg/apps/payments/views/api/base.py +1 -1
  123. django_cfg/apps/payments/views/api/currencies.py +1 -1
  124. django_cfg/apps/payments/views/api/payments.py +1 -1
  125. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  126. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  127. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  128. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  129. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  130. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  131. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  132. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  133. django_cfg/apps/support/admin/support_admin.py +21 -13
  134. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  135. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  136. django_cfg/apps/support/utils/support_email_service.py +1 -1
  137. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  138. django_cfg/apps/tasks/utils/simulator.py +1 -1
  139. django_cfg/apps/tasks/views/dashboard.py +33 -3
  140. django_cfg/apps/urls.py +5 -1
  141. django_cfg/cli/README.md +57 -471
  142. django_cfg/cli/commands/create_project.py +140 -529
  143. django_cfg/cli/main.py +13 -10
  144. django_cfg/core/__init__.py +63 -6
  145. django_cfg/core/base/__init__.py +5 -0
  146. django_cfg/core/base/config_model.py +652 -0
  147. django_cfg/core/builders/__init__.py +11 -0
  148. django_cfg/core/builders/apps_builder.py +258 -0
  149. django_cfg/core/builders/middleware_builder.py +115 -0
  150. django_cfg/core/builders/security_builder.py +96 -0
  151. django_cfg/core/config.py +20 -892
  152. django_cfg/core/constants.py +69 -0
  153. django_cfg/core/environment/__init__.py +9 -0
  154. django_cfg/core/exceptions.py +45 -298
  155. django_cfg/core/generation/__init__.py +51 -0
  156. django_cfg/core/generation/core_generators/__init__.py +0 -0
  157. django_cfg/core/generation/core_generators/settings.py +90 -0
  158. django_cfg/core/generation/core_generators/static.py +82 -0
  159. django_cfg/core/generation/core_generators/templates.py +141 -0
  160. django_cfg/core/generation/data_generators/__init__.py +15 -0
  161. django_cfg/core/generation/data_generators/cache.py +132 -0
  162. django_cfg/core/generation/data_generators/database.py +117 -0
  163. django_cfg/core/generation/generation.py +92 -0
  164. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  165. django_cfg/core/generation/integration_generators/api.py +237 -0
  166. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  167. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  168. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  169. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  170. django_cfg/core/generation/orchestrator.py +285 -0
  171. django_cfg/core/generation/protocols.py +30 -0
  172. django_cfg/core/generation/security_generators/__init__.py +0 -0
  173. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  174. django_cfg/core/generation/utility_generators/email.py +58 -0
  175. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  176. django_cfg/core/generation/utility_generators/limits.py +58 -0
  177. django_cfg/core/generation/utility_generators/logging.py +66 -0
  178. django_cfg/core/generation/utility_generators/security.py +101 -0
  179. django_cfg/core/generation/utils/__init__.py +0 -0
  180. django_cfg/core/generation/utils/helpers.py +32 -0
  181. django_cfg/core/integration/__init__.py +18 -25
  182. django_cfg/core/integration/display/startup.py +146 -133
  183. django_cfg/core/integration/url_integration.py +13 -2
  184. django_cfg/core/services/__init__.py +5 -0
  185. django_cfg/core/services/config_service.py +121 -0
  186. django_cfg/core/state/__init__.py +9 -0
  187. django_cfg/core/state/registry.py +84 -0
  188. django_cfg/core/types/__init__.py +15 -0
  189. django_cfg/core/types/aliases.py +15 -0
  190. django_cfg/core/types/enums.py +49 -0
  191. django_cfg/dashboard/DEBUG_README.md +105 -0
  192. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  193. django_cfg/dashboard/__init__.py +24 -0
  194. django_cfg/dashboard/components.py +308 -0
  195. django_cfg/dashboard/debug.py +176 -0
  196. django_cfg/dashboard/management/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/__init__.py +0 -0
  198. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  199. django_cfg/dashboard/sections/__init__.py +1 -0
  200. django_cfg/dashboard/sections/base.py +128 -0
  201. django_cfg/dashboard/sections/commands.py +32 -0
  202. django_cfg/dashboard/sections/overview.py +394 -0
  203. django_cfg/dashboard/sections/stats.py +48 -0
  204. django_cfg/dashboard/sections/system.py +73 -0
  205. django_cfg/management/commands/check_settings.py +6 -2
  206. django_cfg/management/commands/clear_constance.py +6 -1
  207. django_cfg/management/commands/create_token.py +5 -4
  208. django_cfg/management/commands/generate.py +5 -0
  209. django_cfg/management/commands/list_urls.py +7 -2
  210. django_cfg/management/commands/migrate_all.py +6 -2
  211. django_cfg/management/commands/migrator.py +6 -1
  212. django_cfg/management/commands/rundramatiq.py +6 -1
  213. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  214. django_cfg/management/commands/runserver_ngrok.py +9 -7
  215. django_cfg/management/commands/script.py +25 -21
  216. django_cfg/management/commands/show_config.py +6 -1
  217. django_cfg/management/commands/show_urls.py +8 -3
  218. django_cfg/management/commands/superuser.py +5 -4
  219. django_cfg/management/commands/task_clear.py +8 -3
  220. django_cfg/management/commands/task_status.py +8 -3
  221. django_cfg/management/commands/test_email.py +6 -1
  222. django_cfg/management/commands/test_telegram.py +6 -1
  223. django_cfg/management/commands/test_twilio.py +6 -1
  224. django_cfg/management/commands/tree.py +7 -4
  225. django_cfg/models/__init__.py +88 -3
  226. django_cfg/models/api/__init__.py +27 -0
  227. django_cfg/models/{api.py → api/config.py} +1 -1
  228. django_cfg/models/api/drf/__init__.py +21 -0
  229. django_cfg/models/api/drf/config.py +101 -0
  230. django_cfg/models/api/drf/redoc.py +31 -0
  231. django_cfg/models/api/drf/spectacular.py +129 -0
  232. django_cfg/models/api/drf/swagger.py +59 -0
  233. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  234. django_cfg/models/{limits.py → api/limits.py} +0 -1
  235. django_cfg/models/base/__init__.py +14 -0
  236. django_cfg/models/django/__init__.py +16 -0
  237. django_cfg/models/{constance.py → django/constance.py} +1 -1
  238. django_cfg/models/{environment.py → django/environment.py} +1 -1
  239. django_cfg/models/infrastructure/__init__.py +17 -0
  240. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  241. django_cfg/models/infrastructure/database/__init__.py +22 -0
  242. django_cfg/models/infrastructure/database/config.py +265 -0
  243. django_cfg/models/infrastructure/database/converters.py +91 -0
  244. django_cfg/models/infrastructure/database/parsers.py +96 -0
  245. django_cfg/models/infrastructure/database/routing.py +85 -0
  246. django_cfg/models/infrastructure/database/validators.py +170 -0
  247. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  248. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  249. django_cfg/models/ngrok/__init__.py +11 -0
  250. django_cfg/models/ngrok/auth.py +37 -0
  251. django_cfg/models/ngrok/config.py +77 -0
  252. django_cfg/models/ngrok/tunnel.py +35 -0
  253. django_cfg/models/payments/__init__.py +20 -0
  254. django_cfg/models/payments/api_keys.py +57 -0
  255. django_cfg/models/{payments.py → payments/config.py} +56 -154
  256. django_cfg/models/payments/providers/__init__.py +15 -0
  257. django_cfg/models/payments/providers/base.py +25 -0
  258. django_cfg/models/payments/providers/nowpayments.py +48 -0
  259. django_cfg/models/services/__init__.py +18 -0
  260. django_cfg/models/services/base.py +65 -0
  261. django_cfg/models/{email.py → services/email.py} +1 -1
  262. django_cfg/models/services/telegram.py +172 -0
  263. django_cfg/models/tasks/__init__.py +51 -0
  264. django_cfg/models/tasks/backends.py +250 -0
  265. django_cfg/models/tasks/config.py +314 -0
  266. django_cfg/models/tasks/utils.py +174 -0
  267. django_cfg/modules/base.py +18 -3
  268. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  269. django_cfg/modules/django_admin/decorators/display.py +1 -1
  270. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  271. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  272. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  273. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  274. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  285. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  286. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  287. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  288. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  289. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  290. django_cfg/modules/django_drf_theme/README.md +207 -0
  291. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  292. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  293. django_cfg/modules/django_drf_theme/apps.py +15 -0
  294. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  298. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  299. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  300. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  301. django_cfg/modules/django_email/__init__.py +14 -0
  302. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  303. django_cfg/modules/django_email/utils.py +40 -0
  304. django_cfg/modules/django_health/__init__.py +9 -0
  305. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  306. django_cfg/modules/django_llm/llm/client.py +155 -550
  307. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  308. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  309. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  310. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  311. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  312. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  313. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  315. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  316. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  317. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  318. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  319. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  320. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  321. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  322. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  323. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  324. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  325. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  326. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  327. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  328. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  329. django_cfg/modules/django_llm/translator/translator.py +150 -603
  330. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  331. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  332. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  333. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  334. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  335. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  336. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  337. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  338. django_cfg/modules/django_logging/__init__.py +14 -0
  339. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  340. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  341. django_cfg/modules/django_ngrok/__init__.py +39 -0
  342. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  343. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  344. django_cfg/modules/django_rpc_old/README.md +397 -0
  345. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  346. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  347. django_cfg/modules/django_rpc_old/client.py +531 -0
  348. django_cfg/modules/django_rpc_old/config.py +279 -0
  349. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  350. django_cfg/modules/django_tailwind/README.md +478 -0
  351. django_cfg/modules/django_tailwind/__init__.py +7 -0
  352. django_cfg/modules/django_tailwind/apps.py +10 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  358. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  359. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  360. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  361. django_cfg/modules/django_tasks/__init__.py +29 -0
  362. django_cfg/modules/django_tasks/factory.py +127 -0
  363. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  364. django_cfg/modules/django_tasks/settings.py +107 -0
  365. django_cfg/modules/django_telegram/__init__.py +29 -0
  366. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  367. django_cfg/modules/django_telegram/utils.py +62 -0
  368. django_cfg/modules/django_twilio/__init__.py +54 -107
  369. django_cfg/modules/django_twilio/_imports.py +30 -0
  370. django_cfg/modules/django_twilio/base.py +192 -0
  371. django_cfg/modules/django_twilio/email_otp.py +227 -0
  372. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  373. django_cfg/modules/django_twilio/simple_service.py +1 -2
  374. django_cfg/modules/django_twilio/sms.py +94 -0
  375. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  376. django_cfg/modules/django_twilio/unified.py +310 -0
  377. django_cfg/modules/django_twilio/utils.py +190 -0
  378. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  379. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  380. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  381. django_cfg/modules/django_unfold/dashboard.py +65 -43
  382. django_cfg/modules/django_unfold/models/config.py +13 -12
  383. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  384. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  385. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  386. django_cfg/registry/core.py +24 -26
  387. django_cfg/registry/modules.py +5 -2
  388. django_cfg/registry/services.py +20 -3
  389. django_cfg/registry/third_party.py +8 -8
  390. django_cfg/static/admin/css/dashboard.css +260 -0
  391. django_cfg/static/admin/js/commands.js +171 -0
  392. django_cfg/static/admin/js/dashboard.js +126 -0
  393. django_cfg/templates/admin/components/management_commands.js +375 -0
  394. django_cfg/templates/admin/components/progress_bar.html +18 -23
  395. django_cfg/templates/admin/index.html +48 -20
  396. django_cfg/templates/admin/index_new.html +106 -0
  397. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  398. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  399. django_cfg/templates/admin/sections/commands_section.html +626 -0
  400. django_cfg/templates/admin/sections/overview_section.html +112 -0
  401. django_cfg/templates/admin/sections/stats_section.html +35 -0
  402. django_cfg/templates/admin/sections/system_section.html +99 -0
  403. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  404. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  405. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  406. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  407. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  408. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  409. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  410. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  411. django_cfg/templatetags/django_cfg.py +7 -1
  412. django_cfg/utils/smart_defaults.py +4 -4
  413. django_cfg-1.4.0.dist-info/METADATA +920 -0
  414. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
  415. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  416. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  417. django_cfg/core/generation.py +0 -621
  418. django_cfg/management/commands/validate_config.py +0 -189
  419. django_cfg/models/database.py +0 -480
  420. django_cfg/models/drf.py +0 -272
  421. django_cfg/models/ngrok.py +0 -122
  422. django_cfg/models/services.py +0 -440
  423. django_cfg/models/tasks.py +0 -550
  424. django_cfg/modules/django_twilio/service.py +0 -942
  425. django_cfg/template_archive/django_sample.zip +0 -0
  426. django_cfg/templates/rest_framework/api.html +0 -12
  427. django_cfg/utils/toolkit.py +0 -703
  428. django_cfg-1.3.11.dist-info/METADATA +0 -1029
  429. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  430. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  431. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  432. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  433. /django_cfg/models/{base.py → base/config.py} +0 -0
  434. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  435. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  436. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  437. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  438. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  439. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,54 +1,92 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- Activity Tracker using reusable components -->
4
- <div class="mt-8 w-full">
5
- {% include 'admin/components/section_header.html' with title='Activity Tracker' icon='timeline' icon_color='primary' %}
6
-
7
- {% component "unfold/components/card.html" with title="User Activity Heatmap" subtitle="Last 52 weeks of user activity" %}
8
- <div class="space-y-4">
9
- <!-- Legend -->
10
- <div class="flex items-center justify-between text-sm text-font-subtle-light dark:text-font-subtle-dark">
11
- <span>Less</span>
12
- <div class="flex items-center space-x-1">
13
- <div class="w-3 h-3 bg-base-200 dark:bg-base-700 rounded-sm"></div>
14
- <div class="w-3 h-3 bg-green-200 dark:bg-green-800 rounded-sm"></div>
15
- <div class="w-3 h-3 bg-green-400 dark:bg-green-600 rounded-sm"></div>
16
- <div class="w-3 h-3 bg-green-600 dark:bg-green-500 rounded-sm"></div>
17
- <div class="w-3 h-3 bg-green-800 dark:bg-green-400 rounded-sm"></div>
18
- </div>
19
- <span>More</span>
20
- </div>
21
-
22
- <!-- Activity Tracker Grid -->
23
- <div class="overflow-x-auto">
24
- {% if activity_tracker %}
25
- {% component "unfold/components/tracker.html" with data=activity_tracker %}
26
- {% endcomponent %}
27
- {% else %}
28
- <div class="flex items-center justify-center p-8 bg-base-50 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700">
29
- <div class="text-center">
30
- <span class="material-icons text-4xl text-base-400 dark:text-base-500 mb-2">timeline</span>
31
- <p class="text-font-subtle-light dark:text-font-subtle-dark">No activity data available</p>
32
- </div>
33
- </div>
34
- {% endif %}
35
- </div>
36
-
37
- <!-- Summary Stats -->
38
- <div class="grid grid-cols-3 gap-4 pt-4 border-t border-base-200 dark:border-base-700">
39
- <div class="text-center">
40
- <div class="text-lg font-semibold text-font-default-light dark:text-font-default-dark">365</div>
41
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Days tracked</div>
42
- </div>
43
- <div class="text-center">
44
- <div class="text-lg font-semibold text-green-600 dark:text-green-400">52</div>
45
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Weeks</div>
46
- </div>
3
+ <!-- Activity Tracker -->
4
+ <div class="space-y-4">
5
+ <!-- Legend -->
6
+ <div class="flex items-center justify-between text-sm text-gray-600 dark:text-gray-400">
7
+ <span>Less</span>
8
+ <div class="flex items-center space-x-1">
9
+ <div class="w-3 h-3 bg-gray-200 dark:bg-gray-700 rounded-sm"></div>
10
+ <div class="w-3 h-3 bg-green-200 dark:bg-green-800 rounded-sm"></div>
11
+ <div class="w-3 h-3 bg-green-400 dark:bg-green-600 rounded-sm"></div>
12
+ <div class="w-3 h-3 bg-green-600 dark:bg-green-500 rounded-sm"></div>
13
+ <div class="w-3 h-3 bg-green-800 dark:bg-green-400 rounded-sm"></div>
14
+ </div>
15
+ <span>More</span>
16
+ </div>
17
+
18
+ <!-- Activity Tracker Grid -->
19
+ <div class="overflow-x-auto pb-2">
20
+ {% if activity_tracker %}
21
+ <!-- GitHub-style heatmap visualization -->
22
+ <div id="activity-heatmap" class="inline-flex gap-1"></div>
23
+
24
+ <script>
25
+ (function() {
26
+ const activityData = {{ activity_tracker }};
27
+ const heatmap = document.getElementById('activity-heatmap');
28
+
29
+ if (activityData && activityData.length > 0) {
30
+ // Group days into weeks (7 days per column)
31
+ const weeks = [];
32
+ for (let i = 0; i < activityData.length; i += 7) {
33
+ weeks.push(activityData.slice(i, i + 7));
34
+ }
35
+
36
+ // Create week columns
37
+ weeks.forEach(week => {
38
+ const weekColumn = document.createElement('div');
39
+ weekColumn.className = 'flex flex-col gap-1';
40
+
41
+ week.forEach(day => {
42
+ const cell = document.createElement('div');
43
+ cell.className = 'w-3 h-3 rounded-sm transition-all hover:ring-2 hover:ring-blue-400 cursor-pointer';
44
+
45
+ // Color based on activity level
46
+ if (day.count === 0) {
47
+ cell.className += ' bg-gray-200 dark:bg-gray-700';
48
+ } else if (day.count <= 2) {
49
+ cell.className += ' bg-green-200 dark:bg-green-800';
50
+ } else if (day.count <= 5) {
51
+ cell.className += ' bg-green-400 dark:bg-green-600';
52
+ } else if (day.count <= 10) {
53
+ cell.className += ' bg-green-600 dark:bg-green-500';
54
+ } else {
55
+ cell.className += ' bg-green-800 dark:bg-green-400';
56
+ }
57
+
58
+ cell.title = `${day.date}: ${day.count} activities`;
59
+ weekColumn.appendChild(cell);
60
+ });
61
+
62
+ heatmap.appendChild(weekColumn);
63
+ });
64
+ }
65
+ })();
66
+ </script>
67
+ {% else %}
68
+ <div class="flex items-center justify-center p-8 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
47
69
  <div class="text-center">
48
- <div class="text-lg font-semibold text-primary-600 dark:text-primary-400">{{ activity_tracker|length|default:"0" }}</div>
49
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Data points</div>
70
+ <span class="material-icons text-4xl text-gray-400 dark:text-gray-500 mb-2">timeline</span>
71
+ <p class="text-gray-600 dark:text-gray-400">No activity data available</p>
50
72
  </div>
51
73
  </div>
74
+ {% endif %}
75
+ </div>
76
+
77
+ <!-- Summary Stats -->
78
+ <div class="grid grid-cols-3 gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
79
+ <div class="text-center">
80
+ <div class="text-lg font-semibold text-gray-900 dark:text-gray-100">365</div>
81
+ <div class="text-xs text-gray-600 dark:text-gray-400">Days tracked</div>
82
+ </div>
83
+ <div class="text-center">
84
+ <div class="text-lg font-semibold text-green-600 dark:text-green-400">52</div>
85
+ <div class="text-xs text-gray-600 dark:text-gray-400">Weeks</div>
86
+ </div>
87
+ <div class="text-center">
88
+ <div class="text-lg font-semibold text-blue-600 dark:text-blue-400">{{ activity_tracker|length|default:"0" }}</div>
89
+ <div class="text-xs text-gray-600 dark:text-gray-400">Data points</div>
52
90
  </div>
53
- {% endcomponent %}
91
+ </div>
54
92
  </div>
@@ -1,82 +1,172 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- Charts Section using reusable components -->
3
+ <!-- Charts Section -->
4
4
  <div class="mb-8 w-full">
5
5
  {% include 'admin/components/section_header.html' with title='Analytics Overview' icon='analytics' icon_color='blue' %}
6
-
7
-
6
+
7
+ <!-- Time Range Navigation -->
8
+ {% if navigation %}
9
+ <div class="mb-6 flex items-center space-x-2">
10
+ {% for nav_item in navigation %}
11
+ <a href="{{ nav_item.link }}"
12
+ class="px-4 py-2 rounded-default {% if nav_item.active %}bg-primary-600 text-white{% else %}bg-base-100 dark:bg-base-800 text-font-default-light dark:text-font-default-dark hover:bg-base-200 dark:hover:bg-base-700{% endif %} transition-colors flex items-center">
13
+ {% if nav_item.icon %}
14
+ <span class="material-icons text-sm mr-2">{{ nav_item.icon }}</span>
15
+ {% endif %}
16
+ {{ nav_item.title }}
17
+ </a>
18
+ {% endfor %}
19
+ </div>
20
+ {% endif %}
21
+
8
22
  {% if charts %}
9
23
  <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
10
24
  <!-- User Registration Chart -->
11
- <div class="group">
12
- {% component "unfold/components/card.html" with title="User Registrations" subtitle="Last 7 days activity" %}
13
- <div class="flex items-center mb-2">
14
- <span class="material-icons text-primary-600 dark:text-primary-500 mr-2">trending_up</span>
15
- <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Growth Trends</span>
25
+ <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 p-6 shadow-sm">
26
+ <div class="mb-4">
27
+ <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">User Registrations</h3>
28
+ <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Last 7 days activity</p>
29
+ </div>
30
+ <div class="flex items-center mb-4">
31
+ <span class="material-icons text-primary-600 dark:text-primary-500 mr-2">trending_up</span>
32
+ <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Growth Trends</span>
33
+ </div>
34
+ {% if charts.user_registrations %}
35
+ <div class="relative h-[300px]">
36
+ <canvas id="userRegistrationsChart"></canvas>
16
37
  </div>
17
- {% if charts.user_registrations %}
18
- {% component "unfold/components/chart/line.html" with data=charts.user_registrations_json height=300 %}
19
- {% endcomponent %}
20
-
21
- <!-- Fallback data table if chart doesn't render -->
22
- <div class="mt-4 text-xs text-font-subtle-light dark:text-font-subtle-dark">
23
- <div class="flex justify-between items-center mb-2">
24
- <span class="font-medium">Data Preview:</span>
25
- <span>{{ charts.user_registrations.datasets.0.label }}</span>
26
- </div>
27
- <div class="grid grid-cols-7 gap-1 text-center">
28
- {% for label in charts.user_registrations.labels %}
29
- <div class="bg-base-100 dark:bg-base-700 p-1 rounded text-xs">{{ label }}</div>
30
- {% endfor %}
31
- </div>
32
- <div class="grid grid-cols-7 gap-1 text-center mt-1">
33
- {% for value in charts.user_registrations.datasets.0.data %}
34
- <div class="bg-primary-50 dark:bg-primary-900/20 p-1 rounded text-xs font-medium">{{ value }}</div>
35
- {% endfor %}
36
- </div>
38
+ <script>
39
+ document.addEventListener('DOMContentLoaded', function() {
40
+ const ctx = document.getElementById('userRegistrationsChart');
41
+ const chartData = {{ charts.user_registrations_json|safe }};
42
+
43
+ if (ctx && typeof Chart !== 'undefined') {
44
+ try {
45
+ new Chart(ctx, {
46
+ type: 'line',
47
+ data: chartData,
48
+ options: {
49
+ responsive: true,
50
+ maintainAspectRatio: false,
51
+ plugins: {
52
+ legend: {
53
+ display: true,
54
+ position: 'top'
55
+ }
56
+ },
57
+ scales: {
58
+ y: {
59
+ beginAtZero: true,
60
+ ticks: {
61
+ precision: 0
62
+ }
63
+ }
64
+ }
65
+ }
66
+ });
67
+ } catch (error) {
68
+ console.error('Error creating registration chart:', error);
69
+ }
70
+ }
71
+ });
72
+ </script>
73
+
74
+ <!-- Fallback data table if chart doesn't render -->
75
+ <div class="mt-4 text-xs text-font-subtle-light dark:text-font-subtle-dark">
76
+ <div class="flex justify-between items-center mb-2">
77
+ <span class="font-medium">Data Preview:</span>
78
+ <span>{{ charts.user_registrations.datasets.0.label }}</span>
79
+ </div>
80
+ <div class="grid grid-cols-7 gap-1 text-center">
81
+ {% for label in charts.user_registrations.labels %}
82
+ <div class="bg-base-100 dark:bg-base-700 p-1 rounded text-xs">{{ label }}</div>
83
+ {% endfor %}
37
84
  </div>
38
- {% else %}
39
- <div class="h-[300px] flex items-center justify-center bg-base-50 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700">
40
- <p class="text-font-subtle-light dark:text-font-subtle-dark">No registration data available</p>
85
+ <div class="grid grid-cols-7 gap-1 text-center mt-1">
86
+ {% for value in charts.user_registrations.datasets.0.data %}
87
+ <div class="bg-primary-50 dark:bg-primary-900/20 p-1 rounded text-xs font-medium">{{ value }}</div>
88
+ {% endfor %}
41
89
  </div>
42
- {% endif %}
43
- {% endcomponent %}
90
+ </div>
91
+ {% else %}
92
+ <div class="h-[300px] flex items-center justify-center bg-base-50 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700">
93
+ <p class="text-font-subtle-light dark:text-font-subtle-dark">No registration data available</p>
94
+ </div>
95
+ {% endif %}
44
96
  </div>
45
97
 
46
98
  <!-- User Activity Chart -->
47
- <div class="group">
48
- {% component "unfold/components/card.html" with title="User Activity" subtitle="Weekly engagement metrics" %}
49
- <div class="flex items-center mb-2">
50
- <span class="material-icons text-green-600 dark:text-green-400 mr-2">bar_chart</span>
51
- <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Activity Levels</span>
99
+ <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 p-6 shadow-sm">
100
+ <div class="mb-4">
101
+ <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">User Activity</h3>
102
+ <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Weekly engagement metrics</p>
103
+ </div>
104
+ <div class="flex items-center mb-4">
105
+ <span class="material-icons text-green-600 dark:text-green-400 mr-2">bar_chart</span>
106
+ <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Activity Levels</span>
107
+ </div>
108
+ {% if charts.user_activity %}
109
+ <div class="relative h-[300px]">
110
+ <canvas id="userActivityChart"></canvas>
52
111
  </div>
53
- {% if charts.user_activity %}
54
- {% component "unfold/components/chart/bar.html" with data=charts.user_activity_json height=300 %}
55
- {% endcomponent %}
56
-
57
- <!-- Fallback data table if chart doesn't render -->
58
- <div class="mt-4 text-xs text-font-subtle-light dark:text-font-subtle-dark">
59
- <div class="flex justify-between items-center mb-2">
60
- <span class="font-medium">Data Preview:</span>
61
- <span>{{ charts.user_activity.datasets.0.label }}</span>
62
- </div>
63
- <div class="grid grid-cols-7 gap-1 text-center">
64
- {% for label in charts.user_activity.labels %}
65
- <div class="bg-base-100 dark:bg-base-700 p-1 rounded text-xs">{{ label }}</div>
66
- {% endfor %}
67
- </div>
68
- <div class="grid grid-cols-7 gap-1 text-center mt-1">
69
- {% for value in charts.user_activity.datasets.0.data %}
70
- <div class="bg-green-50 dark:bg-green-900/20 p-1 rounded text-xs font-medium">{{ value }}</div>
71
- {% endfor %}
72
- </div>
112
+ <script>
113
+ document.addEventListener('DOMContentLoaded', function() {
114
+ const ctx = document.getElementById('userActivityChart');
115
+ const chartData = {{ charts.user_activity_json|safe }};
116
+
117
+ if (ctx && typeof Chart !== 'undefined') {
118
+ try {
119
+ new Chart(ctx, {
120
+ type: 'bar',
121
+ data: chartData,
122
+ options: {
123
+ responsive: true,
124
+ maintainAspectRatio: false,
125
+ plugins: {
126
+ legend: {
127
+ display: true,
128
+ position: 'top'
129
+ }
130
+ },
131
+ scales: {
132
+ y: {
133
+ beginAtZero: true,
134
+ ticks: {
135
+ precision: 0
136
+ }
137
+ }
138
+ }
139
+ }
140
+ });
141
+ } catch (error) {
142
+ console.error('Error creating activity chart:', error);
143
+ }
144
+ }
145
+ });
146
+ </script>
147
+
148
+ <!-- Fallback data table if chart doesn't render -->
149
+ <div class="mt-4 text-xs text-font-subtle-light dark:text-font-subtle-dark">
150
+ <div class="flex justify-between items-center mb-2">
151
+ <span class="font-medium">Data Preview:</span>
152
+ <span>{{ charts.user_activity.datasets.0.label }}</span>
73
153
  </div>
74
- {% else %}
75
- <div class="h-[300px] flex items-center justify-center bg-base-50 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700">
76
- <p class="text-font-subtle-light dark:text-font-subtle-dark">No activity data available</p>
154
+ <div class="grid grid-cols-7 gap-1 text-center">
155
+ {% for label in charts.user_activity.labels %}
156
+ <div class="bg-base-100 dark:bg-base-700 p-1 rounded text-xs">{{ label }}</div>
157
+ {% endfor %}
77
158
  </div>
78
- {% endif %}
79
- {% endcomponent %}
159
+ <div class="grid grid-cols-7 gap-1 text-center mt-1">
160
+ {% for value in charts.user_activity.datasets.0.data %}
161
+ <div class="bg-green-50 dark:bg-green-900/20 p-1 rounded text-xs font-medium">{{ value }}</div>
162
+ {% endfor %}
163
+ </div>
164
+ </div>
165
+ {% else %}
166
+ <div class="h-[300px] flex items-center justify-center bg-base-50 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700">
167
+ <p class="text-font-subtle-light dark:text-font-subtle-dark">No activity data available</p>
168
+ </div>
169
+ {% endif %}
80
170
  </div>
81
171
  </div>
82
172
  {% else %}
@@ -86,4 +176,4 @@
86
176
  <p class="text-font-subtle-light dark:text-font-subtle-dark">Charts data is not available in the context</p>
87
177
  </div>
88
178
  {% endif %}
89
- </div>
179
+ </div>
@@ -122,16 +122,16 @@
122
122
  {% endif %}
123
123
  </div>
124
124
 
125
- <!-- Action Buttons -->
125
+ <!-- Action Buttons - Custom due to onclick handlers -->
126
126
  <div class="flex gap-2">
127
- <button
127
+ <button
128
128
  onclick="copyToClipboard('python manage.py {{ command.name }}')"
129
129
  class="flex-1 inline-flex items-center justify-center px-3 py-2 bg-base-100 dark:bg-base-700 hover:bg-base-200 dark:hover:bg-base-600 text-font-default-light dark:text-font-default-dark rounded-lg text-xs font-medium transition-colors"
130
130
  title="Copy command to clipboard">
131
131
  <span class="material-icons text-xs mr-1">content_copy</span>
132
132
  Copy
133
133
  </button>
134
- <button
134
+ <button
135
135
  onclick="executeCommand('{{ command.name }}')"
136
136
  class="flex-1 inline-flex items-center justify-center px-3 py-2 bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600 text-white rounded-lg text-xs font-medium transition-colors"
137
137
  title="Execute command">
@@ -0,0 +1,25 @@
1
+ {% load unfold %}
2
+
3
+ <!-- Recent Users Table Component -->
4
+ {% if recent_users_table and recent_users_table.rows %}
5
+ {% include 'admin/snippets/components/recent_users_table.html' %}
6
+ {% else %}
7
+ <!-- Empty State -->
8
+ <div class="flex flex-col items-center justify-center
9
+ rounded-default border-2 border-dashed
10
+ border-base-200 bg-base-50 p-12
11
+ dark:border-base-700 dark:bg-base-800/50">
12
+
13
+ <div class="mb-4 rounded-full bg-base-100 p-4
14
+ dark:bg-base-700">
15
+ <span class="material-icons text-4xl text-base-400
16
+ dark:text-base-500">history</span>
17
+ </div>
18
+
19
+ <h3 class="mb-1 text-sm font-semibold text-font-important-light
20
+ dark:text-font-important-dark">No Recent Activity</h3>
21
+ <p class="text-xs text-font-subtle-light dark:text-font-subtle-dark">
22
+ User activity will appear here once users start joining
23
+ </p>
24
+ </div>
25
+ {% endif %}
@@ -49,7 +49,7 @@
49
49
  </thead>
50
50
  <tbody class="bg-white dark:bg-base-900 divide-y divide-base-200 dark:divide-base-700">
51
51
  {% for user in recent_users %}
52
- <tr class="hover:bg-base-100 dark:hover:bg-base-800 transition-colors duration-150">
52
+ <tr class="hover:bg-base-50 dark:hover:bg-base-700 transition-colors duration-150">
53
53
  <td class="px-6 py-4 whitespace-nowrap">
54
54
  {% include 'admin/components/user_avatar.html' with name=user.username email=user.email show_details=True %}
55
55
  </td>