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,550 +0,0 @@
1
- """
2
- Task processing configuration models for Django-CFG.
3
-
4
- This module provides type-safe Pydantic models for configuring background task
5
- processing with Dramatiq, including worker management, queue configuration,
6
- and monitoring settings.
7
- """
8
-
9
- from pydantic import BaseModel, Field, field_validator
10
- from typing import Optional, List, Literal, Dict, Any
11
- from enum import Enum
12
- import os
13
- import logging
14
- from django_cfg.models.cfg import BaseCfgAutoModule
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
-
19
- class TaskBackend(str, Enum):
20
- """Supported task backends."""
21
- DRAMATIQ = "dramatiq"
22
- # Future: CELERY = "celery"
23
-
24
-
25
- class QueuePriority(str, Enum):
26
- """Standard queue priorities."""
27
- CRITICAL = "critical"
28
- HIGH = "high"
29
- DEFAULT = "default"
30
- LOW = "low"
31
- BACKGROUND = "background"
32
-
33
-
34
- class DramatiqConfig(BaseModel):
35
- """
36
- Dramatiq-specific configuration with production-ready defaults.
37
-
38
- This model provides comprehensive configuration for Dramatiq background
39
- task processing, including Redis settings, worker configuration,
40
- middleware stack, and monitoring options.
41
- """
42
-
43
- # === Redis Configuration ===
44
- redis_db: int = Field(
45
- default=1,
46
- ge=0,
47
- le=15,
48
- description="Redis database number for tasks (separate from cache)"
49
- )
50
- redis_key_prefix: str = Field(
51
- default="dramatiq",
52
- description="Redis key prefix for task data"
53
- )
54
-
55
- # === Task Configuration ===
56
- max_retries: int = Field(
57
- default=3,
58
- ge=0,
59
- le=10,
60
- description="Default maximum retry count for failed tasks"
61
- )
62
- default_priority: int = Field(
63
- default=5,
64
- ge=0,
65
- le=10,
66
- description="Default task priority (0=highest, 10=lowest)"
67
- )
68
- max_age_seconds: int = Field(
69
- default=3600,
70
- ge=60,
71
- description="Maximum age for tasks before they expire"
72
- )
73
- time_limit_seconds: int = Field(
74
- default=600,
75
- ge=30,
76
- description="Maximum execution time per task"
77
- )
78
-
79
- # === Worker Configuration ===
80
- processes: int = Field(
81
- default=4,
82
- ge=1,
83
- le=32,
84
- description="Number of worker processes"
85
- )
86
- threads: int = Field(
87
- default=8,
88
- ge=1,
89
- le=64,
90
- description="Number of threads per worker process"
91
- )
92
- queues: List[str] = Field(
93
- default=["default", "high", "low"],
94
- description="Available task queues"
95
- )
96
-
97
- # === Middleware Stack ===
98
- middleware: List[str] = Field(
99
- default=[
100
- "dramatiq.middleware.AgeLimit",
101
- "dramatiq.middleware.TimeLimit",
102
- "dramatiq.middleware.Callbacks",
103
- "dramatiq.middleware.Retries",
104
- "dramatiq.middleware.Prometheus",
105
- "django_dramatiq.middleware.AdminMiddleware",
106
- "django_dramatiq.middleware.DbConnectionsMiddleware",
107
- ],
108
- description="Middleware stack for task processing"
109
- )
110
-
111
- # === Monitoring & Admin ===
112
- prometheus_enabled: bool = Field(
113
- default=True,
114
- description="Enable Prometheus metrics collection"
115
- )
116
- admin_enabled: bool = Field(
117
- default=True,
118
- description="Enable Django admin interface integration"
119
- )
120
-
121
- # === Performance Tuning ===
122
- prefetch_multiplier: int = Field(
123
- default=2,
124
- ge=1,
125
- le=10,
126
- description="Message prefetch multiplier for workers"
127
- )
128
- max_memory_mb: Optional[int] = Field(
129
- default=512,
130
- ge=128,
131
- description="Maximum memory usage per worker (MB)"
132
- )
133
-
134
- @field_validator("processes")
135
- @classmethod
136
- def validate_processes(cls, v: int) -> int:
137
- """Ensure reasonable process count based on CPU cores."""
138
- cpu_count = os.cpu_count() or 4
139
- max_recommended = cpu_count * 2
140
-
141
- if v > max_recommended:
142
- logger.warning(
143
- f"Process count ({v}) exceeds recommended maximum ({max_recommended}). "
144
- f"Consider reducing to avoid resource contention."
145
- )
146
-
147
- return v
148
-
149
- @field_validator("queues")
150
- @classmethod
151
- def validate_queues(cls, v: List[str]) -> List[str]:
152
- """Ensure queue names are valid and include default."""
153
- if not v:
154
- raise ValueError("At least one queue must be specified")
155
-
156
- # Ensure 'default' queue exists
157
- if "default" not in v:
158
- v.append("default")
159
-
160
- # Validate queue names (alphanumeric + underscore/hyphen)
161
- import re
162
- pattern = re.compile(r'^[a-zA-Z0-9_-]+$')
163
-
164
- for queue in v:
165
- if not pattern.match(queue):
166
- raise ValueError(f"Invalid queue name: {queue}. Use only alphanumeric, underscore, and hyphen.")
167
-
168
- return v
169
-
170
- @field_validator("middleware")
171
- @classmethod
172
- def validate_middleware(cls, v: List[str]) -> List[str]:
173
- """Ensure essential middleware is included."""
174
- essential_middleware = [
175
- "dramatiq.middleware.Retries",
176
- "django_dramatiq.middleware.DbConnectionsMiddleware",
177
- ]
178
-
179
- for middleware in essential_middleware:
180
- if middleware not in v:
181
- logger.warning(f"Adding essential middleware: {middleware}")
182
- v.append(middleware)
183
-
184
- return v
185
-
186
-
187
- class WorkerConfig(BaseModel):
188
- """
189
- Worker process and resource configuration.
190
-
191
- Provides fine-grained control over worker behavior, resource limits,
192
- and health monitoring settings.
193
- """
194
-
195
- # === Process Management ===
196
- shutdown_timeout: int = Field(
197
- default=30,
198
- ge=5,
199
- le=300,
200
- description="Graceful shutdown timeout in seconds"
201
- )
202
- heartbeat_interval: int = Field(
203
- default=5,
204
- ge=1,
205
- le=60,
206
- description="Worker heartbeat interval in seconds"
207
- )
208
-
209
- # === Resource Limits ===
210
- max_memory_mb: Optional[int] = Field(
211
- default=512,
212
- ge=128,
213
- description="Maximum memory per worker process (MB)"
214
- )
215
- max_cpu_percent: Optional[float] = Field(
216
- default=80.0,
217
- ge=10.0,
218
- le=100.0,
219
- description="Maximum CPU usage per worker (%)"
220
- )
221
-
222
- # === Health Monitoring ===
223
- health_check_enabled: bool = Field(
224
- default=True,
225
- description="Enable worker health monitoring"
226
- )
227
- restart_on_memory_limit: bool = Field(
228
- default=True,
229
- description="Restart worker if memory limit exceeded"
230
- )
231
-
232
- # === Logging ===
233
- log_level: Literal["DEBUG", "INFO", "WARNING", "ERROR"] = Field(
234
- default="INFO",
235
- description="Worker log level"
236
- )
237
- log_format: str = Field(
238
- default="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
239
- description="Log message format"
240
- )
241
-
242
-
243
- class TaskConfig(BaseModel, BaseCfgAutoModule):
244
- """
245
- High-level task system configuration.
246
-
247
- Main entry point for configuring background task processing in Django-CFG.
248
- Provides environment-aware defaults and automatic Redis integration.
249
- """
250
-
251
- # === Core Settings ===
252
- enabled: bool = Field(
253
- default=True,
254
- description="Enable background task processing"
255
- )
256
- backend: TaskBackend = Field(
257
- default=TaskBackend.DRAMATIQ,
258
- description="Task processing backend"
259
- )
260
-
261
- def __init__(self, **data):
262
- """Initialize TaskConfig with BaseCfgAutoModule support."""
263
- super().__init__(**data)
264
- # Initialize _config attribute for BaseCfgAutoModule
265
- self._config = None
266
-
267
- # === Backend-Specific Configuration ===
268
- dramatiq: DramatiqConfig = Field(
269
- default_factory=DramatiqConfig,
270
- description="Dramatiq-specific configuration"
271
- )
272
- worker: WorkerConfig = Field(
273
- default_factory=WorkerConfig,
274
- description="Worker configuration"
275
- )
276
-
277
- # === Environment-Specific Overrides ===
278
- dev_processes: Optional[int] = Field(
279
- default=2,
280
- description="Number of processes in development environment"
281
- )
282
- prod_processes: Optional[int] = Field(
283
- default=None,
284
- description="Number of processes in production environment"
285
- )
286
-
287
- # === Auto-Configuration ===
288
- auto_discover_tasks: bool = Field(
289
- default=True,
290
- description="Automatically discover tasks in Django apps"
291
- )
292
- task_modules: List[str] = Field(
293
- default=["tasks"],
294
- description="Module names to search for tasks"
295
- )
296
-
297
- @field_validator("enabled")
298
- @classmethod
299
- def validate_enabled_with_environment(cls, v: bool) -> bool:
300
- """Validate task system can be enabled in current environment."""
301
- if v:
302
- # Check if we're in a test environment
303
- if os.getenv("DJANGO_SETTINGS_MODULE", "").endswith("test"):
304
- logger.info("Task system disabled in test environment")
305
- return False
306
-
307
- # Additional environment checks can be added here
308
- # For example, checking if Redis is available
309
-
310
- return v
311
-
312
- def get_effective_processes(self, debug: bool = False) -> int:
313
- """Get effective number of processes based on environment."""
314
- if debug and self.dev_processes is not None:
315
- return self.dev_processes
316
- elif not debug and self.prod_processes is not None:
317
- return self.prod_processes
318
- else:
319
- return self.dramatiq.processes
320
-
321
- def get_effective_queues(self) -> List[str]:
322
- """Get effective queue configuration."""
323
- return self.dramatiq.queues
324
-
325
- def get_redis_config(self, redis_url: str) -> Dict[str, Any]:
326
- """Generate Redis configuration for Dramatiq."""
327
- from urllib.parse import urlparse, parse_qs
328
-
329
- # Parse Redis URL
330
- parsed = urlparse(redis_url)
331
-
332
- # Build Redis config
333
- config = {
334
- "host": parsed.hostname or "localhost",
335
- "port": parsed.port or 6379,
336
- "db": self.dramatiq.redis_db,
337
- "password": parsed.password,
338
- }
339
-
340
- # Add SSL if specified
341
- if parsed.scheme == "rediss":
342
- config["ssl"] = True
343
-
344
- return config
345
-
346
- def get_dramatiq_settings(self, redis_url: str) -> Dict[str, Any]:
347
- """Generate complete Dramatiq settings for Django."""
348
- from urllib.parse import urlparse
349
-
350
- redis_config = self.get_redis_config(redis_url)
351
- parsed = urlparse(redis_url)
352
-
353
- # Build Redis URL with correct database
354
- redis_url_with_db = redis_url
355
- if parsed.path and parsed.path != "/":
356
- # Replace existing database in URL
357
- redis_url_with_db = redis_url.replace(parsed.path, f"/{self.dramatiq.redis_db}")
358
- else:
359
- # Add database to URL
360
- redis_url_with_db = f"{redis_url.rstrip('/')}/{self.dramatiq.redis_db}"
361
-
362
- return {
363
- "DRAMATIQ_BROKER": {
364
- "BROKER": "dramatiq.brokers.redis.RedisBroker",
365
- "OPTIONS": {
366
- "url": redis_url_with_db,
367
- **redis_config
368
- },
369
- },
370
- "DRAMATIQ_RESULT_BACKEND": {
371
- "BACKEND": "dramatiq.results.backends.redis.RedisBackend",
372
- "BACKEND_OPTIONS": {
373
- "url": redis_url_with_db,
374
- **redis_config
375
- },
376
- },
377
- "DRAMATIQ_MIDDLEWARE": self.dramatiq.middleware,
378
- "DRAMATIQ_QUEUES": self.dramatiq.queues,
379
- }
380
-
381
- def get_smart_defaults(self):
382
- """Get smart default configuration for this module."""
383
- config = self.get_config()
384
- debug = getattr(config, 'debug', False) if config else False
385
- return get_default_task_config(debug=debug)
386
-
387
- def get_module_config(self):
388
- """Get the final configuration for this module."""
389
- return self
390
-
391
- @classmethod
392
- def auto_initialize_if_needed(cls) -> Optional['TaskConfig']:
393
- """
394
- Auto-initialize TaskConfig if needed based on config flags.
395
-
396
- Returns:
397
- TaskConfig instance if should be initialized, None otherwise
398
- """
399
- # Get config through BaseCfgModule
400
- from django_cfg.modules import BaseCfgModule
401
- base_module = BaseCfgModule()
402
- config = base_module.get_config()
403
-
404
- if not config:
405
- return None
406
-
407
- # Check if TaskConfig already exists
408
- if hasattr(config, 'tasks') and config.tasks is not None:
409
- # Set config reference and return existing
410
- config.tasks.set_config(config)
411
- return config.tasks
412
-
413
- # Check if tasks should be enabled
414
- if config.should_enable_tasks():
415
- # Auto-initialize with smart defaults
416
- task_config = cls().get_smart_defaults()
417
- task_config.set_config(config)
418
- config.tasks = task_config
419
-
420
- import logging
421
- logger = logging.getLogger(__name__)
422
- logger.info("🚀 Auto-initialized TaskConfig (enabled by knowbase/agents/tasks flags)")
423
-
424
- return task_config
425
-
426
- return None
427
-
428
-
429
- # === Utility Functions ===
430
-
431
- def get_smart_queues(debug: bool = False) -> List[str]:
432
- """
433
- Get smart default queues based on enabled modules.
434
-
435
- Automatically detects which django-cfg modules are enabled and adds
436
- their corresponding queues to the default queue list.
437
-
438
- Args:
439
- debug: Whether running in debug mode (affects base queues)
440
-
441
- Returns:
442
- List of queue names appropriate for enabled modules
443
- """
444
- # Base queues
445
- if debug:
446
- base_queues = ["default"]
447
- else:
448
- base_queues = ["critical", "high", "default", "low", "background"]
449
-
450
- # Try to detect enabled modules and add their queues
451
- try:
452
- from django_cfg.modules.base import BaseCfgModule
453
- base_module = BaseCfgModule()
454
-
455
- # Check for knowbase module (requires "knowbase" queue)
456
- if base_module.is_knowbase_enabled():
457
- if "knowbase" not in base_queues:
458
- base_queues.append("knowbase")
459
-
460
- # Check for payments module (requires "payments" queue)
461
- if base_module.is_payments_enabled():
462
- if "payments" not in base_queues:
463
- base_queues.append("payments")
464
-
465
- # Check for agents module (may require "agents" queue in future)
466
- if base_module.is_agents_enabled():
467
- if "agents" not in base_queues:
468
- base_queues.append("agents")
469
-
470
- logger.info(f"🎯 Smart queue detection: {base_queues}")
471
-
472
- except Exception as e:
473
- logger.warning(f"Failed to auto-detect queues, using defaults: {e}")
474
-
475
- return base_queues
476
-
477
-
478
- def get_default_task_config(debug: bool = False) -> TaskConfig:
479
- """Get default task configuration based on environment."""
480
- smart_queues = get_smart_queues(debug)
481
-
482
- if debug:
483
- # Development defaults
484
- return TaskConfig(
485
- dramatiq=DramatiqConfig(
486
- processes=2,
487
- threads=4,
488
- prometheus_enabled=False,
489
- queues=smart_queues,
490
- ),
491
- worker=WorkerConfig(
492
- log_level="DEBUG",
493
- health_check_enabled=False,
494
- )
495
- )
496
- else:
497
- # Production defaults
498
- return TaskConfig(
499
- dramatiq=DramatiqConfig(
500
- processes=8,
501
- threads=16,
502
- prometheus_enabled=True,
503
- queues=smart_queues,
504
- ),
505
- worker=WorkerConfig(
506
- log_level="INFO",
507
- health_check_enabled=True,
508
- restart_on_memory_limit=True,
509
- )
510
- )
511
-
512
-
513
- def validate_task_config(config: TaskConfig, redis_url: Optional[str] = None) -> bool:
514
- """Validate task configuration and dependencies."""
515
- if not config.enabled:
516
- return True
517
-
518
- # Check Redis URL if provided
519
- if redis_url:
520
- try:
521
- from urllib.parse import urlparse
522
- parsed = urlparse(redis_url)
523
- if not parsed.scheme.startswith("redis"):
524
- logger.error(f"Invalid Redis URL scheme: {parsed.scheme}")
525
- return False
526
- except Exception as e:
527
- logger.error(f"Invalid Redis URL: {e}")
528
- return False
529
-
530
- # Check if Dramatiq is available
531
- try:
532
- import dramatiq
533
- import django_dramatiq
534
- except ImportError as e:
535
- logger.error(f"Dramatiq dependencies not available: {e}")
536
- return False
537
-
538
- return True
539
-
540
-
541
- # === Type Exports ===
542
- __all__ = [
543
- "TaskConfig",
544
- "DramatiqConfig",
545
- "WorkerConfig",
546
- "TaskBackend",
547
- "QueuePriority",
548
- "get_default_task_config",
549
- "validate_task_config",
550
- ]