django-cfg 1.3.13__py3-none-any.whl → 1.4.3__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 (446) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  3. django_cfg/apps/accounts/serializers/profile.py +1 -1
  4. django_cfg/apps/accounts/services/otp_service.py +18 -11
  5. django_cfg/apps/accounts/signals.py +15 -24
  6. django_cfg/apps/accounts/utils/notifications.py +217 -358
  7. django_cfg/apps/accounts/views/otp.py +2 -2
  8. django_cfg/apps/accounts/views/webhook.py +1 -1
  9. django_cfg/apps/agents/core/django_agent.py +1 -1
  10. django_cfg/apps/agents/examples/__init__.py +3 -0
  11. django_cfg/apps/agents/examples/simple_example.py +161 -0
  12. django_cfg/apps/api/commands/views.py +66 -83
  13. django_cfg/apps/api/health/drf_views.py +269 -0
  14. django_cfg/apps/api/health/serializers.py +45 -0
  15. django_cfg/apps/api/health/urls.py +6 -1
  16. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  17. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  18. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  19. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  20. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  21. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  22. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  23. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  24. django_cfg/apps/knowbase/config/settings.py +2 -2
  25. django_cfg/apps/knowbase/examples/__init__.py +3 -0
  26. django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
  27. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  28. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  29. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  30. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  31. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  32. django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
  33. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  34. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  35. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  36. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  37. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  38. django_cfg/apps/knowbase/mixins/service.py +2 -2
  39. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  41. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  42. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  43. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  44. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  47. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  48. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  49. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  50. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  51. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  52. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  53. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  54. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  55. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  56. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  57. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  58. django_cfg/apps/leads/tests.py +1 -1
  59. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  60. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  61. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  62. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  63. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  64. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  65. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  67. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  68. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  69. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  70. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  71. django_cfg/apps/payments/apps.py +1 -1
  72. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  73. django_cfg/apps/payments/config/helpers.py +3 -2
  74. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  75. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  76. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  77. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  78. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  79. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  80. django_cfg/apps/payments/middleware/api_access.py +1 -1
  81. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  82. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  83. django_cfg/apps/payments/models/balance.py +2 -2
  84. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  85. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  86. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  87. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  88. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  89. django_cfg/apps/payments/models/payments.py +2 -2
  90. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  91. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  92. django_cfg/apps/payments/services/core/base.py +1 -1
  93. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  94. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  95. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  96. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  97. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  98. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  99. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  100. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  101. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  102. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  103. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  104. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  105. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  106. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  107. django_cfg/apps/payments/services/providers/base.py +1 -1
  108. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  112. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  113. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  114. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  115. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  116. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  117. django_cfg/apps/payments/services/providers/registry.py +1 -1
  118. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  119. django_cfg/apps/payments/signals/__init__.py +1 -1
  120. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  121. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  122. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  123. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  124. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  125. django_cfg/apps/payments/views/api/balances.py +1 -1
  126. django_cfg/apps/payments/views/api/base.py +1 -1
  127. django_cfg/apps/payments/views/api/currencies.py +1 -1
  128. django_cfg/apps/payments/views/api/payments.py +1 -1
  129. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  130. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  131. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  132. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  133. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  134. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  135. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  136. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  137. django_cfg/apps/support/admin/support_admin.py +21 -13
  138. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  139. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  140. django_cfg/apps/support/utils/support_email_service.py +1 -1
  141. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  142. django_cfg/apps/tasks/utils/simulator.py +1 -1
  143. django_cfg/apps/tasks/views/dashboard.py +33 -3
  144. django_cfg/apps/urls.py +5 -1
  145. django_cfg/cli/README.md +57 -471
  146. django_cfg/cli/commands/create_project.py +140 -529
  147. django_cfg/cli/main.py +13 -10
  148. django_cfg/core/__init__.py +63 -6
  149. django_cfg/core/base/__init__.py +5 -0
  150. django_cfg/core/base/config_model.py +652 -0
  151. django_cfg/core/builders/__init__.py +11 -0
  152. django_cfg/core/builders/apps_builder.py +258 -0
  153. django_cfg/core/builders/middleware_builder.py +115 -0
  154. django_cfg/core/builders/security_builder.py +96 -0
  155. django_cfg/core/config.py +20 -892
  156. django_cfg/core/constants.py +69 -0
  157. django_cfg/core/environment/__init__.py +9 -0
  158. django_cfg/core/exceptions.py +45 -298
  159. django_cfg/core/generation/__init__.py +51 -0
  160. django_cfg/core/generation/core_generators/__init__.py +0 -0
  161. django_cfg/core/generation/core_generators/settings.py +90 -0
  162. django_cfg/core/generation/core_generators/static.py +82 -0
  163. django_cfg/core/generation/core_generators/templates.py +141 -0
  164. django_cfg/core/generation/data_generators/__init__.py +15 -0
  165. django_cfg/core/generation/data_generators/cache.py +132 -0
  166. django_cfg/core/generation/data_generators/database.py +117 -0
  167. django_cfg/core/generation/generation.py +92 -0
  168. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  169. django_cfg/core/generation/integration_generators/api.py +237 -0
  170. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  171. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  172. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  173. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  174. django_cfg/core/generation/orchestrator.py +285 -0
  175. django_cfg/core/generation/protocols.py +30 -0
  176. django_cfg/core/generation/security_generators/__init__.py +0 -0
  177. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  178. django_cfg/core/generation/utility_generators/email.py +58 -0
  179. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  180. django_cfg/core/generation/utility_generators/limits.py +58 -0
  181. django_cfg/core/generation/utility_generators/logging.py +66 -0
  182. django_cfg/core/generation/utility_generators/security.py +101 -0
  183. django_cfg/core/generation/utils/__init__.py +0 -0
  184. django_cfg/core/generation/utils/helpers.py +32 -0
  185. django_cfg/core/integration/__init__.py +18 -25
  186. django_cfg/core/integration/display/startup.py +146 -133
  187. django_cfg/core/integration/url_integration.py +13 -2
  188. django_cfg/core/services/__init__.py +5 -0
  189. django_cfg/core/services/config_service.py +121 -0
  190. django_cfg/core/state/__init__.py +9 -0
  191. django_cfg/core/state/registry.py +84 -0
  192. django_cfg/core/types/__init__.py +15 -0
  193. django_cfg/core/types/aliases.py +15 -0
  194. django_cfg/core/types/enums.py +49 -0
  195. django_cfg/dashboard/DEBUG_README.md +105 -0
  196. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  197. django_cfg/dashboard/__init__.py +24 -0
  198. django_cfg/dashboard/components.py +308 -0
  199. django_cfg/dashboard/debug.py +176 -0
  200. django_cfg/dashboard/management/__init__.py +0 -0
  201. django_cfg/dashboard/management/commands/__init__.py +0 -0
  202. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  203. django_cfg/dashboard/sections/__init__.py +1 -0
  204. django_cfg/dashboard/sections/base.py +128 -0
  205. django_cfg/dashboard/sections/commands.py +32 -0
  206. django_cfg/dashboard/sections/overview.py +394 -0
  207. django_cfg/dashboard/sections/stats.py +48 -0
  208. django_cfg/dashboard/sections/system.py +73 -0
  209. django_cfg/management/commands/check_settings.py +6 -2
  210. django_cfg/management/commands/clear_constance.py +6 -1
  211. django_cfg/management/commands/create_token.py +5 -4
  212. django_cfg/management/commands/generate.py +5 -0
  213. django_cfg/management/commands/list_urls.py +7 -2
  214. django_cfg/management/commands/migrate_all.py +6 -2
  215. django_cfg/management/commands/migrator.py +6 -1
  216. django_cfg/management/commands/rundramatiq.py +6 -1
  217. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  218. django_cfg/management/commands/runserver_ngrok.py +9 -7
  219. django_cfg/management/commands/script.py +25 -21
  220. django_cfg/management/commands/show_config.py +6 -1
  221. django_cfg/management/commands/show_urls.py +8 -3
  222. django_cfg/management/commands/superuser.py +5 -4
  223. django_cfg/management/commands/task_clear.py +8 -3
  224. django_cfg/management/commands/task_status.py +8 -3
  225. django_cfg/management/commands/test_email.py +6 -1
  226. django_cfg/management/commands/test_telegram.py +6 -1
  227. django_cfg/management/commands/test_twilio.py +6 -1
  228. django_cfg/management/commands/tree.py +7 -4
  229. django_cfg/models/__init__.py +88 -3
  230. django_cfg/models/api/__init__.py +27 -0
  231. django_cfg/models/{api.py → api/config.py} +1 -1
  232. django_cfg/models/api/drf/__init__.py +21 -0
  233. django_cfg/models/api/drf/config.py +101 -0
  234. django_cfg/models/api/drf/redoc.py +31 -0
  235. django_cfg/models/api/drf/spectacular.py +129 -0
  236. django_cfg/models/api/drf/swagger.py +59 -0
  237. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  238. django_cfg/models/{limits.py → api/limits.py} +0 -1
  239. django_cfg/models/base/__init__.py +14 -0
  240. django_cfg/models/django/__init__.py +16 -0
  241. django_cfg/models/{constance.py → django/constance.py} +1 -1
  242. django_cfg/models/{environment.py → django/environment.py} +1 -1
  243. django_cfg/models/infrastructure/__init__.py +17 -0
  244. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  245. django_cfg/models/infrastructure/database/__init__.py +22 -0
  246. django_cfg/models/infrastructure/database/config.py +265 -0
  247. django_cfg/models/infrastructure/database/converters.py +91 -0
  248. django_cfg/models/infrastructure/database/parsers.py +96 -0
  249. django_cfg/models/infrastructure/database/routing.py +85 -0
  250. django_cfg/models/infrastructure/database/validators.py +170 -0
  251. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  252. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  253. django_cfg/models/ngrok/__init__.py +11 -0
  254. django_cfg/models/ngrok/auth.py +37 -0
  255. django_cfg/models/ngrok/config.py +77 -0
  256. django_cfg/models/ngrok/tunnel.py +35 -0
  257. django_cfg/models/payments/__init__.py +20 -0
  258. django_cfg/models/payments/api_keys.py +57 -0
  259. django_cfg/models/{payments.py → payments/config.py} +56 -154
  260. django_cfg/models/payments/providers/__init__.py +15 -0
  261. django_cfg/models/payments/providers/base.py +25 -0
  262. django_cfg/models/payments/providers/nowpayments.py +48 -0
  263. django_cfg/models/services/__init__.py +18 -0
  264. django_cfg/models/services/base.py +65 -0
  265. django_cfg/models/{email.py → services/email.py} +1 -1
  266. django_cfg/models/services/telegram.py +172 -0
  267. django_cfg/models/tasks/__init__.py +51 -0
  268. django_cfg/models/tasks/backends.py +250 -0
  269. django_cfg/models/tasks/config.py +314 -0
  270. django_cfg/models/tasks/utils.py +174 -0
  271. django_cfg/modules/base.py +18 -3
  272. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  273. django_cfg/modules/django_admin/decorators/display.py +1 -1
  274. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  275. django_cfg/modules/django_currency/examples/__init__.py +3 -0
  276. django_cfg/modules/django_currency/examples/example_database_usage.py +144 -0
  277. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  278. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  279. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  280. django_cfg/modules/django_drf_theme/README.md +207 -0
  281. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  282. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  283. django_cfg/modules/django_drf_theme/apps.py +15 -0
  284. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  285. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  286. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  287. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  288. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  289. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  290. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  291. django_cfg/modules/django_email/__init__.py +14 -0
  292. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  293. django_cfg/modules/django_email/utils.py +40 -0
  294. django_cfg/modules/django_health/__init__.py +9 -0
  295. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  296. django_cfg/modules/django_ipc_client/README.md +346 -0
  297. django_cfg/modules/django_ipc_client/__init__.py +51 -0
  298. django_cfg/modules/django_ipc_client/client.py +540 -0
  299. django_cfg/modules/django_ipc_client/config.py +207 -0
  300. django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
  301. django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  302. django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
  303. django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
  304. django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
  305. django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
  306. django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
  307. django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
  308. django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
  309. django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
  310. django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
  311. django_cfg/modules/django_ipc_client/exceptions.py +201 -0
  312. django_cfg/modules/django_llm/llm/client.py +155 -550
  313. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  314. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  315. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  316. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  317. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  318. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  319. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  320. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  321. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  322. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  323. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  324. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  325. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  326. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  327. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  328. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  329. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  330. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  331. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  332. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  333. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  334. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  335. django_cfg/modules/django_llm/translator/translator.py +150 -603
  336. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  337. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  338. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  339. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  340. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  341. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  342. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  343. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  344. django_cfg/modules/django_logging/__init__.py +14 -0
  345. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  346. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  347. django_cfg/modules/django_ngrok/__init__.py +39 -0
  348. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  349. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  350. django_cfg/modules/django_rpc_old/README.md +397 -0
  351. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  352. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  353. django_cfg/modules/django_rpc_old/client.py +531 -0
  354. django_cfg/modules/django_rpc_old/config.py +279 -0
  355. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  356. django_cfg/modules/django_tailwind/README.md +478 -0
  357. django_cfg/modules/django_tailwind/__init__.py +7 -0
  358. django_cfg/modules/django_tailwind/apps.py +10 -0
  359. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  360. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  361. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  362. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  363. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  364. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  365. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  366. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  367. django_cfg/modules/django_tasks/__init__.py +29 -0
  368. django_cfg/modules/django_tasks/factory.py +127 -0
  369. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  370. django_cfg/modules/django_tasks/settings.py +107 -0
  371. django_cfg/modules/django_telegram/__init__.py +29 -0
  372. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  373. django_cfg/modules/django_telegram/utils.py +62 -0
  374. django_cfg/modules/django_twilio/__init__.py +54 -107
  375. django_cfg/modules/django_twilio/_imports.py +30 -0
  376. django_cfg/modules/django_twilio/base.py +192 -0
  377. django_cfg/modules/django_twilio/email_otp.py +227 -0
  378. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  379. django_cfg/modules/django_twilio/simple_service.py +1 -2
  380. django_cfg/modules/django_twilio/sms.py +94 -0
  381. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  382. django_cfg/modules/django_twilio/unified.py +310 -0
  383. django_cfg/modules/django_twilio/utils.py +190 -0
  384. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  385. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  386. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  387. django_cfg/modules/django_unfold/dashboard.py +65 -43
  388. django_cfg/modules/django_unfold/models/config.py +13 -12
  389. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  390. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  391. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  392. django_cfg/registry/core.py +24 -26
  393. django_cfg/registry/modules.py +5 -2
  394. django_cfg/registry/services.py +20 -3
  395. django_cfg/registry/third_party.py +8 -8
  396. django_cfg/static/admin/css/dashboard.css +260 -0
  397. django_cfg/static/admin/js/commands.js +171 -0
  398. django_cfg/static/admin/js/dashboard.js +126 -0
  399. django_cfg/templates/admin/components/management_commands.js +375 -0
  400. django_cfg/templates/admin/components/progress_bar.html +18 -23
  401. django_cfg/templates/admin/examples/component_class_example.html +156 -0
  402. django_cfg/templates/admin/index.html +48 -20
  403. django_cfg/templates/admin/index_new.html +106 -0
  404. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  405. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  406. django_cfg/templates/admin/sections/commands_section.html +626 -0
  407. django_cfg/templates/admin/sections/overview_section.html +112 -0
  408. django_cfg/templates/admin/sections/stats_section.html +35 -0
  409. django_cfg/templates/admin/sections/system_section.html +99 -0
  410. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  411. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  412. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  413. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  414. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  415. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  416. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  417. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  418. django_cfg/templatetags/django_cfg.py +7 -1
  419. django_cfg/utils/smart_defaults.py +4 -4
  420. django_cfg-1.4.3.dist-info/METADATA +533 -0
  421. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -195
  422. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  423. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  424. django_cfg/core/generation.py +0 -621
  425. django_cfg/management/commands/validate_config.py +0 -189
  426. django_cfg/models/database.py +0 -480
  427. django_cfg/models/drf.py +0 -272
  428. django_cfg/models/ngrok.py +0 -122
  429. django_cfg/models/services.py +0 -440
  430. django_cfg/models/tasks.py +0 -550
  431. django_cfg/modules/django_twilio/service.py +0 -942
  432. django_cfg/template_archive/django_sample.zip +0 -0
  433. django_cfg/templates/rest_framework/api.html +0 -12
  434. django_cfg/utils/toolkit.py +0 -703
  435. django_cfg-1.3.13.dist-info/METADATA +0 -1029
  436. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  437. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  438. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  439. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  440. /django_cfg/models/{base.py → base/config.py} +0 -0
  441. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  442. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  443. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  444. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/WHEEL +0 -0
  445. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
  446. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.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>