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
@@ -0,0 +1,314 @@
1
+ """
2
+ Main task configuration models.
3
+
4
+ Contains TaskConfig class (main entry point) and related enums.
5
+ Size: ~250 lines (focused on main configuration)
6
+ """
7
+
8
+ from pydantic import BaseModel, Field, field_validator
9
+ from typing import Optional, List, Dict, Any
10
+ from enum import Enum
11
+ import os
12
+ import logging
13
+
14
+ from django_cfg.models.base 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 TaskConfig(BaseModel, BaseCfgAutoModule):
35
+ """
36
+ High-level task system configuration.
37
+
38
+ Main entry point for configuring background task processing in Django-CFG.
39
+ Provides environment-aware defaults and automatic Redis integration.
40
+
41
+ Example:
42
+ ```python
43
+ from django_cfg.models.tasks import TaskConfig
44
+
45
+ tasks = TaskConfig(
46
+ enabled=True,
47
+ backend=TaskBackend.DRAMATIQ,
48
+ )
49
+ ```
50
+ """
51
+
52
+ # === Core Settings ===
53
+ enabled: bool = Field(
54
+ default=True,
55
+ description="Enable background task processing"
56
+ )
57
+ backend: TaskBackend = Field(
58
+ default=TaskBackend.DRAMATIQ,
59
+ description="Task processing backend"
60
+ )
61
+
62
+ def __init__(self, **data):
63
+ """Initialize TaskConfig with BaseCfgAutoModule support."""
64
+ super().__init__(**data)
65
+ # Initialize _config attribute for BaseCfgAutoModule
66
+ self._config = None
67
+
68
+ # === Backend-Specific Configuration ===
69
+ dramatiq: 'DramatiqConfig' = Field(
70
+ default_factory=lambda: None,
71
+ description="Dramatiq-specific configuration"
72
+ )
73
+ worker: 'WorkerConfig' = Field(
74
+ default_factory=lambda: None,
75
+ description="Worker configuration"
76
+ )
77
+
78
+ def model_post_init(self, __context: Any) -> None:
79
+ """Initialize backend configs with defaults after model creation."""
80
+ if self.dramatiq is None:
81
+ from .backends import DramatiqConfig
82
+ self.dramatiq = DramatiqConfig()
83
+ if self.worker is None:
84
+ from .backends import WorkerConfig
85
+ self.worker = WorkerConfig()
86
+
87
+ # === Environment-Specific Overrides ===
88
+ dev_processes: Optional[int] = Field(
89
+ default=2,
90
+ description="Number of processes in development environment"
91
+ )
92
+ prod_processes: Optional[int] = Field(
93
+ default=None,
94
+ description="Number of processes in production environment"
95
+ )
96
+
97
+ # === Auto-Configuration ===
98
+ auto_discover_tasks: bool = Field(
99
+ default=True,
100
+ description="Automatically discover tasks in Django apps"
101
+ )
102
+ task_modules: List[str] = Field(
103
+ default=["tasks"],
104
+ description="Module names to search for tasks"
105
+ )
106
+
107
+ @field_validator("enabled")
108
+ @classmethod
109
+ def validate_enabled_with_environment(cls, v: bool) -> bool:
110
+ """Validate task system can be enabled in current environment."""
111
+ if v:
112
+ # Check if we're in a test environment
113
+ if os.getenv("DJANGO_SETTINGS_MODULE", "").endswith("test"):
114
+ logger.info("Task system disabled in test environment")
115
+ return False
116
+
117
+ # Additional environment checks can be added here
118
+ # For example, checking if Redis is available
119
+
120
+ return v
121
+
122
+ def get_effective_processes(self, debug: bool = False) -> int:
123
+ """
124
+ Get effective number of processes based on environment.
125
+
126
+ Args:
127
+ debug: Whether in debug mode
128
+
129
+ Returns:
130
+ Number of worker processes to use
131
+
132
+ Example:
133
+ >>> config = TaskConfig()
134
+ >>> config.get_effective_processes(debug=True)
135
+ 2
136
+ """
137
+ if debug and self.dev_processes is not None:
138
+ return self.dev_processes
139
+ elif not debug and self.prod_processes is not None:
140
+ return self.prod_processes
141
+ else:
142
+ return self.dramatiq.processes
143
+
144
+ def get_effective_queues(self) -> List[str]:
145
+ """
146
+ Get effective queue configuration.
147
+
148
+ Returns:
149
+ List of queue names
150
+
151
+ Example:
152
+ >>> config = TaskConfig()
153
+ >>> config.get_effective_queues()
154
+ ['default', 'high', 'low']
155
+ """
156
+ return self.dramatiq.queues
157
+
158
+ def get_redis_config(self, redis_url: str) -> Dict[str, Any]:
159
+ """
160
+ Generate Redis configuration for Dramatiq.
161
+
162
+ Args:
163
+ redis_url: Redis connection URL
164
+
165
+ Returns:
166
+ Dictionary with Redis connection parameters
167
+
168
+ Example:
169
+ >>> config = TaskConfig()
170
+ >>> config.get_redis_config("redis://localhost:6379/1")
171
+ {'host': 'localhost', 'port': 6379, 'db': 1, 'password': None}
172
+ """
173
+ from urllib.parse import urlparse
174
+
175
+ # Parse Redis URL
176
+ parsed = urlparse(redis_url)
177
+
178
+ # Build Redis config
179
+ config = {
180
+ "host": parsed.hostname or "localhost",
181
+ "port": parsed.port or 6379,
182
+ "db": self.dramatiq.redis_db,
183
+ "password": parsed.password,
184
+ }
185
+
186
+ # Add SSL if specified
187
+ if parsed.scheme == "rediss":
188
+ config["ssl"] = True
189
+
190
+ return config
191
+
192
+ def get_dramatiq_settings(self, redis_url: str) -> Dict[str, Any]:
193
+ """
194
+ Generate complete Dramatiq settings for Django.
195
+
196
+ Args:
197
+ redis_url: Redis connection URL
198
+
199
+ Returns:
200
+ Dictionary with complete Dramatiq configuration
201
+
202
+ Example:
203
+ >>> config = TaskConfig()
204
+ >>> settings = config.get_dramatiq_settings("redis://localhost:6379/1")
205
+ >>> "DRAMATIQ_BROKER" in settings
206
+ True
207
+ """
208
+ from urllib.parse import urlparse
209
+
210
+ redis_config = self.get_redis_config(redis_url)
211
+ parsed = urlparse(redis_url)
212
+
213
+ # Build Redis URL with correct database
214
+ redis_url_with_db = redis_url
215
+ if parsed.path and parsed.path != "/":
216
+ # Replace existing database in URL
217
+ redis_url_with_db = redis_url.replace(parsed.path, f"/{self.dramatiq.redis_db}")
218
+ else:
219
+ # Add database to URL
220
+ redis_url_with_db = f"{redis_url.rstrip('/')}/{self.dramatiq.redis_db}"
221
+
222
+ return {
223
+ "DRAMATIQ_BROKER": {
224
+ "BROKER": "dramatiq.brokers.redis.RedisBroker",
225
+ "OPTIONS": {
226
+ "url": redis_url_with_db,
227
+ **redis_config
228
+ },
229
+ },
230
+ "DRAMATIQ_RESULT_BACKEND": {
231
+ "BACKEND": "dramatiq.results.backends.redis.RedisBackend",
232
+ "BACKEND_OPTIONS": {
233
+ "url": redis_url_with_db,
234
+ **redis_config
235
+ },
236
+ },
237
+ "DRAMATIQ_MIDDLEWARE": self.dramatiq.middleware,
238
+ "DRAMATIQ_QUEUES": self.dramatiq.queues,
239
+ }
240
+
241
+ def get_smart_defaults(self):
242
+ """
243
+ Get smart default configuration for this module.
244
+
245
+ Returns:
246
+ TaskConfig with smart defaults based on environment
247
+ """
248
+ from .utils import get_default_task_config
249
+
250
+ config = self.get_config()
251
+ debug = getattr(config, 'debug', False) if config else False
252
+ return get_default_task_config(debug=debug)
253
+
254
+ def get_module_config(self):
255
+ """
256
+ Get the final configuration for this module.
257
+
258
+ Returns:
259
+ Self (TaskConfig instance)
260
+ """
261
+ return self
262
+
263
+ @classmethod
264
+ def auto_initialize_if_needed(cls) -> Optional['TaskConfig']:
265
+ """
266
+ Auto-initialize TaskConfig if needed based on config flags.
267
+
268
+ Returns:
269
+ TaskConfig instance if should be initialized, None otherwise
270
+
271
+ Example:
272
+ >>> task_config = TaskConfig.auto_initialize_if_needed()
273
+ >>> if task_config:
274
+ ... print("Tasks enabled")
275
+ """
276
+ # Get config through BaseCfgModule
277
+ from django_cfg.modules import BaseCfgModule
278
+ base_module = BaseCfgModule()
279
+ config = base_module.get_config()
280
+
281
+ if not config:
282
+ return None
283
+
284
+ # Check if TaskConfig already exists
285
+ if hasattr(config, 'tasks') and config.tasks is not None:
286
+ # Set config reference and return existing
287
+ config.tasks.set_config(config)
288
+ return config.tasks
289
+
290
+ # Check if tasks should be enabled
291
+ if config.should_enable_tasks():
292
+ # Auto-initialize with smart defaults
293
+ task_config = cls().get_smart_defaults()
294
+ task_config.set_config(config)
295
+ config.tasks = task_config
296
+
297
+ logger.info("๐Ÿš€ Auto-initialized TaskConfig (enabled by knowbase/agents/tasks flags)")
298
+
299
+ return task_config
300
+
301
+ return None
302
+
303
+
304
+ # Resolve forward references for Pydantic v2
305
+ from .backends import DramatiqConfig, WorkerConfig
306
+ TaskConfig.model_rebuild()
307
+
308
+ __all__ = [
309
+ "TaskConfig",
310
+ "TaskBackend",
311
+ "QueuePriority",
312
+ "DramatiqConfig",
313
+ "WorkerConfig",
314
+ ]
@@ -0,0 +1,174 @@
1
+ """
2
+ Task configuration utilities.
3
+
4
+ Contains utility functions for task configuration:
5
+ - Smart queue detection
6
+ - Environment-aware defaults
7
+ - Configuration validation
8
+
9
+ Size: ~120 lines (focused on utilities)
10
+ """
11
+
12
+ from typing import List, Optional, TYPE_CHECKING
13
+ import logging
14
+
15
+ if TYPE_CHECKING:
16
+ from .config import TaskConfig
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def get_smart_queues(debug: bool = False) -> List[str]:
22
+ """
23
+ Get smart default queues based on enabled modules.
24
+
25
+ Automatically detects which django-cfg modules are enabled and adds
26
+ their corresponding queues to the default queue list.
27
+
28
+ Args:
29
+ debug: Whether running in debug mode (affects base queues)
30
+
31
+ Returns:
32
+ List of queue names appropriate for enabled modules
33
+
34
+ Example:
35
+ >>> queues = get_smart_queues(debug=True)
36
+ >>> "default" in queues
37
+ True
38
+ """
39
+ # Base queues
40
+ if debug:
41
+ base_queues = ["default"]
42
+ else:
43
+ base_queues = ["critical", "high", "default", "low", "background"]
44
+
45
+ # Try to detect enabled modules and add their queues
46
+ try:
47
+ from django_cfg.modules.base import BaseCfgModule
48
+ base_module = BaseCfgModule()
49
+
50
+ # Check for knowbase module (requires "knowbase" queue)
51
+ if base_module.is_knowbase_enabled():
52
+ if "knowbase" not in base_queues:
53
+ base_queues.append("knowbase")
54
+
55
+ # Check for payments module (requires "payments" queue)
56
+ if base_module.is_payments_enabled():
57
+ if "payments" not in base_queues:
58
+ base_queues.append("payments")
59
+
60
+ # Check for agents module (may require "agents" queue in future)
61
+ if base_module.is_agents_enabled():
62
+ if "agents" not in base_queues:
63
+ base_queues.append("agents")
64
+
65
+ logger.info(f"๐ŸŽฏ Smart queue detection: {base_queues}")
66
+
67
+ except Exception as e:
68
+ logger.warning(f"Failed to auto-detect queues, using defaults: {e}")
69
+
70
+ return base_queues
71
+
72
+
73
+ def get_default_task_config(debug: bool = False) -> 'TaskConfig':
74
+ """
75
+ Get default task configuration based on environment.
76
+
77
+ Creates a TaskConfig with sensible defaults for development or production.
78
+
79
+ Args:
80
+ debug: Whether in debug/development mode
81
+
82
+ Returns:
83
+ TaskConfig with environment-appropriate defaults
84
+
85
+ Example:
86
+ >>> config = get_default_task_config(debug=True)
87
+ >>> config.dramatiq.processes
88
+ 2
89
+ """
90
+ from .config import TaskConfig
91
+ from .backends import DramatiqConfig, WorkerConfig
92
+
93
+ smart_queues = get_smart_queues(debug)
94
+
95
+ if debug:
96
+ # Development defaults
97
+ return TaskConfig(
98
+ dramatiq=DramatiqConfig(
99
+ processes=2,
100
+ threads=4,
101
+ prometheus_enabled=False,
102
+ queues=smart_queues,
103
+ ),
104
+ worker=WorkerConfig(
105
+ log_level="DEBUG",
106
+ health_check_enabled=False,
107
+ )
108
+ )
109
+ else:
110
+ # Production defaults
111
+ return TaskConfig(
112
+ dramatiq=DramatiqConfig(
113
+ processes=8,
114
+ threads=16,
115
+ prometheus_enabled=True,
116
+ queues=smart_queues,
117
+ ),
118
+ worker=WorkerConfig(
119
+ log_level="INFO",
120
+ health_check_enabled=True,
121
+ restart_on_memory_limit=True,
122
+ )
123
+ )
124
+
125
+
126
+ def validate_task_config(config: 'TaskConfig', redis_url: Optional[str] = None) -> bool:
127
+ """
128
+ Validate task configuration and dependencies.
129
+
130
+ Checks if the task configuration is valid and all required dependencies are available.
131
+
132
+ Args:
133
+ config: TaskConfig to validate
134
+ redis_url: Optional Redis URL to validate
135
+
136
+ Returns:
137
+ True if configuration is valid, False otherwise
138
+
139
+ Example:
140
+ >>> config = get_default_task_config()
141
+ >>> validate_task_config(config, "redis://localhost:6379/1")
142
+ True
143
+ """
144
+ if not config.enabled:
145
+ return True
146
+
147
+ # Check Redis URL if provided
148
+ if redis_url:
149
+ try:
150
+ from urllib.parse import urlparse
151
+ parsed = urlparse(redis_url)
152
+ if not parsed.scheme.startswith("redis"):
153
+ logger.error(f"Invalid Redis URL scheme: {parsed.scheme}")
154
+ return False
155
+ except Exception as e:
156
+ logger.error(f"Invalid Redis URL: {e}")
157
+ return False
158
+
159
+ # Check if Dramatiq is available
160
+ try:
161
+ import dramatiq
162
+ import django_dramatiq
163
+ except ImportError as e:
164
+ logger.error(f"Dramatiq dependencies not available: {e}")
165
+ return False
166
+
167
+ return True
168
+
169
+
170
+ __all__ = [
171
+ "get_smart_queues",
172
+ "get_default_task_config",
173
+ "validate_task_config",
174
+ ]
@@ -178,16 +178,31 @@ class BaseCfgModule(ABC):
178
178
  def is_payments_enabled(self) -> bool:
179
179
  """
180
180
  Check if django-cfg Payments is enabled.
181
-
181
+
182
182
  Returns:
183
183
  True if Payments is enabled, False otherwise
184
184
  """
185
185
  payments_config = self._get_config_key('payments', None)
186
-
186
+
187
187
  # Only handle PaymentsConfig model
188
188
  if payments_config and hasattr(payments_config, 'enabled'):
189
189
  return payments_config.enabled
190
-
190
+
191
+ return False
192
+
193
+ def is_rpc_enabled(self) -> bool:
194
+ """
195
+ Check if django-cfg RPC Client is enabled.
196
+
197
+ Returns:
198
+ True if RPC Client is enabled, False otherwise
199
+ """
200
+ rpc_config = self._get_config_key('django_ipc', None)
201
+
202
+ # Only handle DjangoCfgRPCConfig model
203
+ if rpc_config and hasattr(rpc_config, 'enabled'):
204
+ return rpc_config.enabled
205
+
191
206
  return False
192
207
 
193
208
 
@@ -9,7 +9,7 @@ from functools import wraps
9
9
  from unfold.decorators import action as unfold_action
10
10
  from unfold.enums import ActionVariant as UnfoldActionVariant
11
11
 
12
- from django_cfg.modules.django_logger import get_logger
12
+ from django_cfg.modules.django_logging import get_logger
13
13
  from ..models.action_models import ActionVariant
14
14
 
15
15
 
@@ -8,7 +8,7 @@ from typing import Optional, Callable, Any, Union
8
8
  from functools import wraps
9
9
  from django.utils.safestring import SafeString, mark_safe
10
10
  from unfold.decorators import display as unfold_display
11
- from django_cfg.modules.django_logger import get_logger
11
+ from django_cfg.modules.django_logging import get_logger
12
12
 
13
13
  logger = get_logger('django_admin.decorators.display')
14
14
 
@@ -14,7 +14,7 @@ import threading
14
14
 
15
15
  from unfold.decorators import action as unfold_action
16
16
  from unfold.enums import ActionVariant as UnfoldActionVariant
17
- from django_cfg.modules.django_logger import get_logger
17
+ from django_cfg.modules.django_logging import get_logger
18
18
  from ..models.action_models import ActionVariant
19
19
 
20
20
 
@@ -0,0 +1,3 @@
1
+ """
2
+ Examples for currency module usage.
3
+ """
@@ -0,0 +1,144 @@
1
+ """
2
+ Example usage of the database loader for populating currency data.
3
+ """
4
+
5
+ import logging
6
+ from .database_loader import (
7
+ CurrencyDatabaseLoader,
8
+ DatabaseLoaderConfig,
9
+ create_database_loader,
10
+ load_currencies_to_database_format
11
+ )
12
+
13
+ # Configure logging
14
+ logging.basicConfig(level=logging.INFO, format='%(name)s:%(levelname)s: %(message)s')
15
+
16
+
17
+ def example_basic_usage():
18
+ """Basic example of using the database loader."""
19
+ print("๐Ÿ”„ Creating database loader...")
20
+
21
+ # Create loader with default settings
22
+ loader = create_database_loader(
23
+ max_cryptocurrencies=100, # Limit to top 100 cryptos
24
+ max_fiat_currencies=30, # Top 30 fiat currencies
25
+ min_market_cap_usd=10_000_000, # 10M USD minimum
26
+ coingecko_delay=2.0 # 2 second delay between requests
27
+ )
28
+
29
+ # Get statistics
30
+ print("๐Ÿ“Š Statistics:")
31
+ stats = loader.get_statistics()
32
+ for key, value in stats.items():
33
+ print(f" {key}: {value}")
34
+
35
+ print("\n๐Ÿช™ Building currency database data...")
36
+
37
+ # Build complete currency data
38
+ currencies = loader.build_currency_database_data()
39
+
40
+ print(f"\nโœ… Successfully loaded {len(currencies)} currencies")
41
+
42
+ # Show sample data
43
+ print("\n๐Ÿ“‹ Sample currencies:")
44
+ for i, currency in enumerate(currencies[:10]):
45
+ print(f" {i+1}. {currency.code} ({currency.currency_type}): "
46
+ f"{currency.name} = ${currency.usd_rate:.6f}")
47
+
48
+ return currencies
49
+
50
+
51
+ def example_django_integration():
52
+ """Example of how to integrate with Django ORM."""
53
+ print("๐Ÿ”„ Loading currencies in Django format...")
54
+
55
+ # Get currencies in Django-ready format
56
+ currency_dicts = load_currencies_to_database_format()
57
+
58
+ print(f"โœ… Ready to insert {len(currency_dicts)} currencies into Django ORM")
59
+
60
+ # This is how you would use it in Django:
61
+ print("\n๐Ÿ’ก Django integration example:")
62
+ print("""
63
+ # In your Django management command or view:
64
+ from django_cfg.modules.django_currency.database_loader import load_currencies_to_database_format
65
+ from django_cfg.apps.payments.models import Currency
66
+
67
+ # Load currency data
68
+ currency_data = load_currencies_to_database_format()
69
+
70
+ # Bulk create currencies
71
+ currencies_to_create = []
72
+ for data in currency_data:
73
+ currency = Currency(**data)
74
+ currencies_to_create.append(currency)
75
+
76
+ # Insert into database
77
+ Currency.objects.bulk_create(currencies_to_create, ignore_conflicts=True)
78
+ print(f"Inserted {len(currencies_to_create)} currencies")
79
+ """)
80
+
81
+ return currency_dicts
82
+
83
+
84
+ def example_advanced_config():
85
+ """Example with advanced configuration."""
86
+ print("๐Ÿ”ง Advanced configuration example...")
87
+
88
+ # Custom configuration
89
+ config = DatabaseLoaderConfig(
90
+ # Rate limiting
91
+ coingecko_delay=3.0, # Slower requests for stability
92
+ yfinance_delay=1.0,
93
+ max_requests_per_minute=20, # Conservative rate limit
94
+
95
+ # Limits
96
+ max_cryptocurrencies=50, # Smaller set
97
+ max_fiat_currencies=20,
98
+
99
+ # Filtering
100
+ min_market_cap_usd=50_000_000, # Higher threshold - 50M USD
101
+ exclude_stablecoins=True, # Skip stablecoins
102
+
103
+ # Cache
104
+ cache_ttl_hours=12 # Cache for 12 hours
105
+ )
106
+
107
+ loader = CurrencyDatabaseLoader(config)
108
+
109
+ print(f"๐Ÿ“Š Configuration:")
110
+ print(f" Max cryptocurrencies: {config.max_cryptocurrencies}")
111
+ print(f" Min market cap: ${config.min_market_cap_usd:,.0f}")
112
+ print(f" Exclude stablecoins: {config.exclude_stablecoins}")
113
+ print(f" CoinGecko delay: {config.coingecko_delay}s")
114
+
115
+ return loader
116
+
117
+
118
+ if __name__ == "__main__":
119
+ print("๐Ÿงช CURRENCY DATABASE LOADER EXAMPLES")
120
+ print("=" * 50)
121
+
122
+ try:
123
+ # Basic usage
124
+ print("\n1๏ธโƒฃ BASIC USAGE:")
125
+ currencies = example_basic_usage()
126
+
127
+ print("\n" + "=" * 50)
128
+
129
+ # Django integration
130
+ print("\n2๏ธโƒฃ DJANGO INTEGRATION:")
131
+ django_data = example_django_integration()
132
+
133
+ print("\n" + "=" * 50)
134
+
135
+ # Advanced config
136
+ print("\n3๏ธโƒฃ ADVANCED CONFIGURATION:")
137
+ advanced_loader = example_advanced_config()
138
+
139
+ print("\n๐ŸŽ‰ All examples completed successfully!")
140
+
141
+ except Exception as e:
142
+ print(f"โŒ Error: {e}")
143
+ import traceback
144
+ traceback.print_exc()