django-cfg 1.3.13__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 (438) 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/api/commands/views.py +66 -83
  11. django_cfg/apps/api/health/drf_views.py +269 -0
  12. django_cfg/apps/api/health/serializers.py +45 -0
  13. django_cfg/apps/api/health/urls.py +6 -1
  14. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  15. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  16. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  17. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  18. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  19. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  20. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  21. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  22. django_cfg/apps/knowbase/config/settings.py +2 -2
  23. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  24. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  25. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  26. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  27. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  28. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  29. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  30. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  31. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  32. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  33. django_cfg/apps/knowbase/mixins/service.py +2 -2
  34. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  35. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  40. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  46. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  47. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  48. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  49. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  50. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  51. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  52. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  53. django_cfg/apps/leads/tests.py +1 -1
  54. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  55. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  56. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  57. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  58. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  59. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  60. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  61. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  66. django_cfg/apps/payments/apps.py +1 -1
  67. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  68. django_cfg/apps/payments/config/helpers.py +3 -2
  69. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  70. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  71. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  73. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  74. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  75. django_cfg/apps/payments/middleware/api_access.py +1 -1
  76. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  77. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  78. django_cfg/apps/payments/models/balance.py +2 -2
  79. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  80. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  84. django_cfg/apps/payments/models/payments.py +2 -2
  85. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  86. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  87. django_cfg/apps/payments/services/core/base.py +1 -1
  88. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  89. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  90. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  91. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  92. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  93. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  94. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  95. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  96. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  97. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  98. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  99. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  100. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  101. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  102. django_cfg/apps/payments/services/providers/base.py +1 -1
  103. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  104. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  111. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  112. django_cfg/apps/payments/services/providers/registry.py +1 -1
  113. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  114. django_cfg/apps/payments/signals/__init__.py +1 -1
  115. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  116. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  117. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  118. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  119. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  120. django_cfg/apps/payments/views/api/balances.py +1 -1
  121. django_cfg/apps/payments/views/api/base.py +1 -1
  122. django_cfg/apps/payments/views/api/currencies.py +1 -1
  123. django_cfg/apps/payments/views/api/payments.py +1 -1
  124. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  125. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  126. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  127. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  128. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  129. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  130. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  131. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  132. django_cfg/apps/support/admin/support_admin.py +21 -13
  133. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  134. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  135. django_cfg/apps/support/utils/support_email_service.py +1 -1
  136. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  137. django_cfg/apps/tasks/utils/simulator.py +1 -1
  138. django_cfg/apps/tasks/views/dashboard.py +33 -3
  139. django_cfg/apps/urls.py +5 -1
  140. django_cfg/cli/README.md +57 -471
  141. django_cfg/cli/commands/create_project.py +140 -529
  142. django_cfg/cli/main.py +13 -10
  143. django_cfg/core/__init__.py +63 -6
  144. django_cfg/core/base/__init__.py +5 -0
  145. django_cfg/core/base/config_model.py +652 -0
  146. django_cfg/core/builders/__init__.py +11 -0
  147. django_cfg/core/builders/apps_builder.py +258 -0
  148. django_cfg/core/builders/middleware_builder.py +115 -0
  149. django_cfg/core/builders/security_builder.py +96 -0
  150. django_cfg/core/config.py +20 -892
  151. django_cfg/core/constants.py +69 -0
  152. django_cfg/core/environment/__init__.py +9 -0
  153. django_cfg/core/exceptions.py +45 -298
  154. django_cfg/core/generation/__init__.py +51 -0
  155. django_cfg/core/generation/core_generators/__init__.py +0 -0
  156. django_cfg/core/generation/core_generators/settings.py +90 -0
  157. django_cfg/core/generation/core_generators/static.py +82 -0
  158. django_cfg/core/generation/core_generators/templates.py +141 -0
  159. django_cfg/core/generation/data_generators/__init__.py +15 -0
  160. django_cfg/core/generation/data_generators/cache.py +132 -0
  161. django_cfg/core/generation/data_generators/database.py +117 -0
  162. django_cfg/core/generation/generation.py +92 -0
  163. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  164. django_cfg/core/generation/integration_generators/api.py +237 -0
  165. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  166. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  167. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  168. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  169. django_cfg/core/generation/orchestrator.py +285 -0
  170. django_cfg/core/generation/protocols.py +30 -0
  171. django_cfg/core/generation/security_generators/__init__.py +0 -0
  172. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  173. django_cfg/core/generation/utility_generators/email.py +58 -0
  174. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  175. django_cfg/core/generation/utility_generators/limits.py +58 -0
  176. django_cfg/core/generation/utility_generators/logging.py +66 -0
  177. django_cfg/core/generation/utility_generators/security.py +101 -0
  178. django_cfg/core/generation/utils/__init__.py +0 -0
  179. django_cfg/core/generation/utils/helpers.py +32 -0
  180. django_cfg/core/integration/__init__.py +18 -25
  181. django_cfg/core/integration/display/startup.py +146 -133
  182. django_cfg/core/integration/url_integration.py +13 -2
  183. django_cfg/core/services/__init__.py +5 -0
  184. django_cfg/core/services/config_service.py +121 -0
  185. django_cfg/core/state/__init__.py +9 -0
  186. django_cfg/core/state/registry.py +84 -0
  187. django_cfg/core/types/__init__.py +15 -0
  188. django_cfg/core/types/aliases.py +15 -0
  189. django_cfg/core/types/enums.py +49 -0
  190. django_cfg/dashboard/DEBUG_README.md +105 -0
  191. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  192. django_cfg/dashboard/__init__.py +24 -0
  193. django_cfg/dashboard/components.py +308 -0
  194. django_cfg/dashboard/debug.py +176 -0
  195. django_cfg/dashboard/management/__init__.py +0 -0
  196. django_cfg/dashboard/management/commands/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  198. django_cfg/dashboard/sections/__init__.py +1 -0
  199. django_cfg/dashboard/sections/base.py +128 -0
  200. django_cfg/dashboard/sections/commands.py +32 -0
  201. django_cfg/dashboard/sections/overview.py +394 -0
  202. django_cfg/dashboard/sections/stats.py +48 -0
  203. django_cfg/dashboard/sections/system.py +73 -0
  204. django_cfg/management/commands/check_settings.py +6 -2
  205. django_cfg/management/commands/clear_constance.py +6 -1
  206. django_cfg/management/commands/create_token.py +5 -4
  207. django_cfg/management/commands/generate.py +5 -0
  208. django_cfg/management/commands/list_urls.py +7 -2
  209. django_cfg/management/commands/migrate_all.py +6 -2
  210. django_cfg/management/commands/migrator.py +6 -1
  211. django_cfg/management/commands/rundramatiq.py +6 -1
  212. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  213. django_cfg/management/commands/runserver_ngrok.py +9 -7
  214. django_cfg/management/commands/script.py +25 -21
  215. django_cfg/management/commands/show_config.py +6 -1
  216. django_cfg/management/commands/show_urls.py +8 -3
  217. django_cfg/management/commands/superuser.py +5 -4
  218. django_cfg/management/commands/task_clear.py +8 -3
  219. django_cfg/management/commands/task_status.py +8 -3
  220. django_cfg/management/commands/test_email.py +6 -1
  221. django_cfg/management/commands/test_telegram.py +6 -1
  222. django_cfg/management/commands/test_twilio.py +6 -1
  223. django_cfg/management/commands/tree.py +7 -4
  224. django_cfg/models/__init__.py +88 -3
  225. django_cfg/models/api/__init__.py +27 -0
  226. django_cfg/models/{api.py → api/config.py} +1 -1
  227. django_cfg/models/api/drf/__init__.py +21 -0
  228. django_cfg/models/api/drf/config.py +101 -0
  229. django_cfg/models/api/drf/redoc.py +31 -0
  230. django_cfg/models/api/drf/spectacular.py +129 -0
  231. django_cfg/models/api/drf/swagger.py +59 -0
  232. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  233. django_cfg/models/{limits.py → api/limits.py} +0 -1
  234. django_cfg/models/base/__init__.py +14 -0
  235. django_cfg/models/django/__init__.py +16 -0
  236. django_cfg/models/{constance.py → django/constance.py} +1 -1
  237. django_cfg/models/{environment.py → django/environment.py} +1 -1
  238. django_cfg/models/infrastructure/__init__.py +17 -0
  239. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  240. django_cfg/models/infrastructure/database/__init__.py +22 -0
  241. django_cfg/models/infrastructure/database/config.py +265 -0
  242. django_cfg/models/infrastructure/database/converters.py +91 -0
  243. django_cfg/models/infrastructure/database/parsers.py +96 -0
  244. django_cfg/models/infrastructure/database/routing.py +85 -0
  245. django_cfg/models/infrastructure/database/validators.py +170 -0
  246. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  247. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  248. django_cfg/models/ngrok/__init__.py +11 -0
  249. django_cfg/models/ngrok/auth.py +37 -0
  250. django_cfg/models/ngrok/config.py +77 -0
  251. django_cfg/models/ngrok/tunnel.py +35 -0
  252. django_cfg/models/payments/__init__.py +20 -0
  253. django_cfg/models/payments/api_keys.py +57 -0
  254. django_cfg/models/{payments.py → payments/config.py} +56 -154
  255. django_cfg/models/payments/providers/__init__.py +15 -0
  256. django_cfg/models/payments/providers/base.py +25 -0
  257. django_cfg/models/payments/providers/nowpayments.py +48 -0
  258. django_cfg/models/services/__init__.py +18 -0
  259. django_cfg/models/services/base.py +65 -0
  260. django_cfg/models/{email.py → services/email.py} +1 -1
  261. django_cfg/models/services/telegram.py +172 -0
  262. django_cfg/models/tasks/__init__.py +51 -0
  263. django_cfg/models/tasks/backends.py +250 -0
  264. django_cfg/models/tasks/config.py +314 -0
  265. django_cfg/models/tasks/utils.py +174 -0
  266. django_cfg/modules/base.py +18 -3
  267. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  268. django_cfg/modules/django_admin/decorators/display.py +1 -1
  269. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  270. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  271. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  272. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  273. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  274. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  285. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  286. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  287. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  288. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  289. django_cfg/modules/django_drf_theme/README.md +207 -0
  290. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  291. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  292. django_cfg/modules/django_drf_theme/apps.py +15 -0
  293. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  294. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  298. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  299. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  300. django_cfg/modules/django_email/__init__.py +14 -0
  301. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  302. django_cfg/modules/django_email/utils.py +40 -0
  303. django_cfg/modules/django_health/__init__.py +9 -0
  304. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  305. django_cfg/modules/django_llm/llm/client.py +155 -550
  306. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  307. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  308. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  309. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  310. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  311. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  312. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  313. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  315. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  316. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  317. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  318. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  319. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  320. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  321. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  322. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  323. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  324. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  325. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  326. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  327. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  328. django_cfg/modules/django_llm/translator/translator.py +150 -603
  329. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  330. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  331. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  332. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  333. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  334. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  335. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  336. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  337. django_cfg/modules/django_logging/__init__.py +14 -0
  338. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  339. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  340. django_cfg/modules/django_ngrok/__init__.py +39 -0
  341. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  342. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  343. django_cfg/modules/django_rpc_old/README.md +397 -0
  344. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  345. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  346. django_cfg/modules/django_rpc_old/client.py +531 -0
  347. django_cfg/modules/django_rpc_old/config.py +279 -0
  348. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  349. django_cfg/modules/django_tailwind/README.md +478 -0
  350. django_cfg/modules/django_tailwind/__init__.py +7 -0
  351. django_cfg/modules/django_tailwind/apps.py +10 -0
  352. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  358. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  359. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  360. django_cfg/modules/django_tasks/__init__.py +29 -0
  361. django_cfg/modules/django_tasks/factory.py +127 -0
  362. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  363. django_cfg/modules/django_tasks/settings.py +107 -0
  364. django_cfg/modules/django_telegram/__init__.py +29 -0
  365. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  366. django_cfg/modules/django_telegram/utils.py +62 -0
  367. django_cfg/modules/django_twilio/__init__.py +54 -107
  368. django_cfg/modules/django_twilio/_imports.py +30 -0
  369. django_cfg/modules/django_twilio/base.py +192 -0
  370. django_cfg/modules/django_twilio/email_otp.py +227 -0
  371. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  372. django_cfg/modules/django_twilio/simple_service.py +1 -2
  373. django_cfg/modules/django_twilio/sms.py +94 -0
  374. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  375. django_cfg/modules/django_twilio/unified.py +310 -0
  376. django_cfg/modules/django_twilio/utils.py +190 -0
  377. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  378. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  379. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  380. django_cfg/modules/django_unfold/dashboard.py +65 -43
  381. django_cfg/modules/django_unfold/models/config.py +13 -12
  382. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  383. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  384. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  385. django_cfg/registry/core.py +24 -26
  386. django_cfg/registry/modules.py +5 -2
  387. django_cfg/registry/services.py +20 -3
  388. django_cfg/registry/third_party.py +8 -8
  389. django_cfg/static/admin/css/dashboard.css +260 -0
  390. django_cfg/static/admin/js/commands.js +171 -0
  391. django_cfg/static/admin/js/dashboard.js +126 -0
  392. django_cfg/templates/admin/components/management_commands.js +375 -0
  393. django_cfg/templates/admin/components/progress_bar.html +18 -23
  394. django_cfg/templates/admin/index.html +48 -20
  395. django_cfg/templates/admin/index_new.html +106 -0
  396. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  397. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  398. django_cfg/templates/admin/sections/commands_section.html +626 -0
  399. django_cfg/templates/admin/sections/overview_section.html +112 -0
  400. django_cfg/templates/admin/sections/stats_section.html +35 -0
  401. django_cfg/templates/admin/sections/system_section.html +99 -0
  402. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  403. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  404. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  405. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  406. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  407. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  408. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  409. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  410. django_cfg/templatetags/django_cfg.py +7 -1
  411. django_cfg/utils/smart_defaults.py +4 -4
  412. django_cfg-1.4.0.dist-info/METADATA +920 -0
  413. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
  414. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  415. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  416. django_cfg/core/generation.py +0 -621
  417. django_cfg/management/commands/validate_config.py +0 -189
  418. django_cfg/models/database.py +0 -480
  419. django_cfg/models/drf.py +0 -272
  420. django_cfg/models/ngrok.py +0 -122
  421. django_cfg/models/services.py +0 -440
  422. django_cfg/models/tasks.py +0 -550
  423. django_cfg/modules/django_twilio/service.py +0 -942
  424. django_cfg/template_archive/django_sample.zip +0 -0
  425. django_cfg/templates/rest_framework/api.html +0 -12
  426. django_cfg/utils/toolkit.py +0 -703
  427. django_cfg-1.3.13.dist-info/METADATA +0 -1029
  428. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  429. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  430. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  431. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  432. /django_cfg/models/{base.py → base/config.py} +0 -0
  433. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  434. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  435. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  436. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  437. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  438. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,621 +0,0 @@
1
- """
2
- Django settings generation for django_cfg.
3
-
4
- Following CRITICAL_REQUIREMENTS.md:
5
- - No raw Dict/Any usage
6
- - Proper type annotations
7
- - Comprehensive error handling
8
- - Performance-aware generation
9
- """
10
-
11
- from typing import Dict, List, Any, TYPE_CHECKING
12
- from pathlib import Path
13
- import logging
14
-
15
- from django_cfg.core.exceptions import ConfigurationError
16
- from django_cfg.utils.smart_defaults import SmartDefaults
17
-
18
- if TYPE_CHECKING:
19
- from django_cfg.core.config import DjangoConfig
20
-
21
- logger = logging.getLogger(__name__)
22
-
23
-
24
- class SettingsGenerator:
25
- """
26
- Generates complete Django settings from DjangoConfig instances.
27
-
28
- Converts type-safe Pydantic configuration models into Django-compatible
29
- settings dictionaries with intelligent defaults and validation.
30
- """
31
-
32
- @classmethod
33
- def generate(cls, config: "DjangoConfig") -> Dict[str, Any]:
34
- """
35
- Generate complete Django settings dictionary.
36
-
37
- Args:
38
- config: DjangoConfig instance
39
-
40
- Returns:
41
- Complete Django settings dictionary
42
-
43
- Raises:
44
- ConfigurationError: If settings generation fails
45
- """
46
- try:
47
- settings = {}
48
-
49
- # Generate core Django settings
50
- settings.update(cls._generate_core_settings(config))
51
-
52
- # Generate database settings
53
- settings.update(cls._generate_database_settings(config))
54
-
55
- # Generate cache settings
56
- settings.update(cls._generate_cache_settings(config))
57
-
58
- # Generate security settings
59
- settings.update(cls._generate_security_settings(config))
60
-
61
- # Generate email settings
62
- settings.update(cls._generate_email_settings(config))
63
-
64
- # Generate logging settings
65
- settings.update(cls._generate_logging_settings(config))
66
-
67
- # Generate static files settings
68
- settings.update(cls._generate_static_settings(config))
69
-
70
- # Generate internationalization settings
71
- settings.update(cls._generate_i18n_settings(config))
72
-
73
- # Generate limits settings
74
- settings.update(cls._generate_limits_settings(config))
75
-
76
- # Generate third-party integration settings
77
- settings.update(cls._generate_integration_settings(config))
78
-
79
- return settings
80
-
81
- except Exception as e:
82
- raise ConfigurationError(f"Failed to generate Django settings: {e}", context={"config_type": type(config).__name__, "project_name": getattr(config, "project_name", "unknown")}) from e
83
-
84
- @classmethod
85
- def _generate_core_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
86
- """Generate core Django settings."""
87
- try:
88
- settings = {
89
- "SECRET_KEY": config.secret_key,
90
- "DEBUG": config.debug,
91
- "ALLOWED_HOSTS": config.get_allowed_hosts(),
92
- "INSTALLED_APPS": config.get_installed_apps(),
93
- "MIDDLEWARE": config.get_middleware(),
94
- }
95
-
96
- # Add URL configuration
97
- if config.root_urlconf:
98
- settings["ROOT_URLCONF"] = config.root_urlconf
99
-
100
- # Add WSGI application
101
- if config.wsgi_application:
102
- settings["WSGI_APPLICATION"] = config.wsgi_application
103
-
104
- # Add custom user model
105
- if config.auth_user_model:
106
- settings["AUTH_USER_MODEL"] = config.auth_user_model
107
- elif config.enable_accounts:
108
- # Auto-use django-cfg accounts CustomUser if accounts is enabled
109
- settings["AUTH_USER_MODEL"] = "django_cfg_accounts.CustomUser"
110
-
111
- # Add base directory
112
- if config._base_dir:
113
- settings["BASE_DIR"] = config._base_dir
114
-
115
- # Add templates configuration
116
- django_cfg_templates = Path(__file__).parent.parent / "templates"
117
-
118
- # Collect all django-cfg template directories
119
- template_dirs = [
120
- config.base_dir / "templates",
121
- django_cfg_templates, # Add django_cfg templates
122
- ]
123
-
124
- # Auto-discover app template directories
125
- django_cfg_dir = Path(__file__).parent.parent
126
- apps_dir = django_cfg_dir / 'apps'
127
- if apps_dir.exists():
128
- for app_dir in apps_dir.iterdir():
129
- if app_dir.is_dir() and not app_dir.name.startswith(('@', '_', '.')):
130
- # Look for common template directory patterns
131
- possible_template_dirs = [
132
- app_dir / 'templates',
133
- app_dir / 'admin_interface' / 'templates',
134
- app_dir / 'frontend' / 'templates',
135
- ]
136
-
137
- for template_dir in possible_template_dirs:
138
- if template_dir.exists():
139
- template_dirs.append(template_dir)
140
-
141
- settings["TEMPLATES"] = [
142
- {
143
- "BACKEND": "django.template.backends.django.DjangoTemplates",
144
- "DIRS": template_dirs,
145
- "APP_DIRS": True,
146
- "OPTIONS": {
147
- "context_processors": [
148
- "django.template.context_processors.debug",
149
- "django.template.context_processors.request",
150
- "django.contrib.auth.context_processors.auth",
151
- "django.contrib.messages.context_processors.messages",
152
- ],
153
- },
154
- },
155
- ]
156
-
157
- # Add default auto field
158
- settings["DEFAULT_AUTO_FIELD"] = "django.db.models.BigAutoField"
159
-
160
- return settings
161
-
162
- except Exception as e:
163
- raise ConfigurationError(f"Failed to generate core settings: {e}") from e
164
-
165
- @classmethod
166
- def _generate_database_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
167
- """Generate database settings."""
168
- try:
169
- settings = {}
170
-
171
- if config.databases:
172
- # Convert database configurations
173
- django_databases = {}
174
- for alias, db_config in config.databases.items():
175
- django_databases[alias] = db_config.to_django_config()
176
-
177
- settings["DATABASES"] = django_databases
178
-
179
- # Apply database defaults for each database based on its engine
180
- for alias, db_config in config.databases.items():
181
- db_defaults = SmartDefaults.get_database_defaults(
182
- config.env_mode,
183
- config.debug,
184
- db_config.engine
185
- )
186
- if db_defaults:
187
- # Merge defaults with existing configuration
188
- for key, value in db_defaults.items():
189
- if key == "OPTIONS":
190
- # Merge OPTIONS dictionaries
191
- existing_options = django_databases[alias].get("OPTIONS", {})
192
- merged_options = {**value, **existing_options}
193
- django_databases[alias]["OPTIONS"] = merged_options
194
- elif key not in django_databases[alias]:
195
- django_databases[alias][key] = value
196
-
197
- # Database routing - check if any database has routing rules
198
- routing_rules = {}
199
- for alias, db_config in config.databases.items():
200
- if db_config.has_routing_rules():
201
- for app in db_config.apps:
202
- routing_rules[app] = alias
203
-
204
- if routing_rules:
205
- settings["DATABASE_ROUTERS"] = ["django_cfg.routing.routers.DatabaseRouter"]
206
- settings["DATABASE_ROUTING_RULES"] = routing_rules
207
-
208
- return settings
209
-
210
- except Exception as e:
211
- raise ConfigurationError(f"Failed to generate database settings: {e}") from e
212
-
213
- @classmethod
214
- def _generate_cache_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
215
- """Generate cache settings."""
216
- try:
217
- settings = {}
218
- caches = {}
219
-
220
- # Default cache - always provide one
221
- if config.cache_default:
222
- caches["default"] = config.cache_default.to_django_config(config.env_mode, config.debug, "default")
223
- else:
224
- # Create default cache backend
225
- from django_cfg.models.cache import CacheConfig
226
-
227
- default_cache = CacheConfig()
228
- caches["default"] = default_cache.to_django_config(config.env_mode, config.debug, "default")
229
-
230
- # Sessions cache
231
- if config.cache_sessions:
232
- caches["sessions"] = config.cache_sessions.to_django_config(config.env_mode, config.debug, "sessions")
233
-
234
- # Configure Django to use cache for sessions (can be overridden)
235
- settings["SESSION_ENGINE"] = "django.contrib.sessions.backends.cache"
236
- settings["SESSION_CACHE_ALIAS"] = "sessions"
237
-
238
- # Add any additional cache backends found as attributes
239
- for attr_name in dir(config):
240
- if attr_name.startswith("cache_") and attr_name not in ["cache_default", "cache_sessions"]:
241
- cache_obj = getattr(config, attr_name)
242
- if hasattr(cache_obj, "to_django_config"):
243
- cache_alias = attr_name.replace("cache_", "")
244
- caches[cache_alias] = cache_obj.to_django_config(config.env_mode, config.debug, cache_alias)
245
-
246
- if caches:
247
- settings["CACHES"] = caches
248
-
249
- return settings
250
-
251
- except Exception as e:
252
- raise ConfigurationError(f"Failed to generate cache settings: {e}") from e
253
-
254
- @classmethod
255
- def _generate_security_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
256
- """Generate security settings."""
257
- try:
258
- settings = {}
259
-
260
- # Generate security defaults based on domains and ssl_redirect
261
- if config.security_domains or config.ssl_redirect is not None:
262
- security_defaults = SmartDefaults.get_security_defaults(
263
- config.security_domains,
264
- config.env_mode,
265
- config.debug,
266
- config.ssl_redirect,
267
- config.cors_allow_headers
268
- )
269
- settings.update(security_defaults)
270
-
271
- # Add CORS to installed apps if domains are configured
272
- installed_apps = settings.get("INSTALLED_APPS", config.get_installed_apps())
273
- if "corsheaders" not in installed_apps:
274
- # This will be handled by the core settings generation
275
- pass
276
-
277
- # Additional security settings for production
278
- if config.env_mode == "production":
279
- settings.update(
280
- {
281
- "SESSION_COOKIE_AGE": 2592000, # 30 days (30 * 24 * 60 * 60)
282
- "SESSION_SAVE_EVERY_REQUEST": True,
283
- "SESSION_EXPIRE_AT_BROWSER_CLOSE": False, # Allow persistent sessions
284
- }
285
- )
286
-
287
- return settings
288
-
289
- except Exception as e:
290
- raise ConfigurationError(f"Failed to generate security settings: {e}") from e
291
-
292
- @classmethod
293
- def _generate_email_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
294
- """Generate email settings."""
295
- try:
296
- settings = {}
297
-
298
- if config.email:
299
- email_settings = config.email.to_django_config(config.env_mode, config.debug)
300
- settings.update(email_settings)
301
-
302
- return settings
303
-
304
- except Exception as e:
305
- raise ConfigurationError(f"Failed to generate email settings: {e}") from e
306
-
307
- @classmethod
308
- def _generate_logging_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
309
- """Generate logging settings."""
310
- try:
311
- settings = {}
312
-
313
- # Generate logging defaults
314
- logging_defaults = SmartDefaults.get_logging_defaults(config.env_mode, config.debug)
315
-
316
- if logging_defaults:
317
- settings["LOGGING"] = logging_defaults
318
-
319
- return settings
320
-
321
- except Exception as e:
322
- raise ConfigurationError(f"Failed to generate logging settings: {e}") from e
323
-
324
- @classmethod
325
- def _generate_static_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
326
- """Generate static files settings."""
327
- try:
328
- settings = {
329
- "STATIC_URL": "/static/",
330
- "MEDIA_URL": "/media/",
331
- # WhiteNoise configuration
332
- "STATICFILES_STORAGE": "whitenoise.storage.CompressedManifestStaticFilesStorage",
333
- "WHITENOISE_USE_FINDERS": True,
334
- "WHITENOISE_AUTOREFRESH": config.debug,
335
- "WHITENOISE_MAX_AGE": 0 if config.debug else 3600, # No cache in debug, 1 hour
336
- }
337
-
338
- # Set paths relative to base directory
339
- if config._base_dir:
340
- settings.update(
341
- {
342
- "STATIC_ROOT": config._base_dir / "staticfiles",
343
- "MEDIA_ROOT": config._base_dir / "media",
344
- "STATICFILES_DIRS": [
345
- config._base_dir / "static",
346
- ],
347
- }
348
- )
349
-
350
- # Static files finders
351
- settings["STATICFILES_FINDERS"] = [
352
- "django.contrib.staticfiles.finders.FileSystemFinder",
353
- "django.contrib.staticfiles.finders.AppDirectoriesFinder",
354
- ]
355
-
356
- return settings
357
-
358
- except Exception as e:
359
- raise ConfigurationError(f"Failed to generate static settings: {e}") from e
360
-
361
- @classmethod
362
- def _generate_i18n_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
363
- """Generate internationalization settings."""
364
- try:
365
- settings = {
366
- "LANGUAGE_CODE": "en-us",
367
- "TIME_ZONE": "UTC",
368
- "USE_I18N": True,
369
- "USE_TZ": True,
370
- }
371
-
372
- # Adjust for different environments
373
- if config.env_mode == "development":
374
- settings["USE_L10N"] = True # Deprecated but sometimes needed
375
-
376
- return settings
377
-
378
- except Exception as e:
379
- raise ConfigurationError(f"Failed to generate i18n settings: {e}") from e
380
-
381
- @classmethod
382
- def _generate_limits_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
383
- """Generate application limits settings."""
384
- try:
385
- settings = {}
386
-
387
- if config.limits:
388
- # Get Django settings from limits configuration
389
- limits_settings = config.limits.to_django_settings()
390
- settings.update(limits_settings)
391
-
392
- return settings
393
-
394
- except Exception as e:
395
- raise ConfigurationError(f"Failed to generate limits settings: {e}") from e
396
-
397
- @classmethod
398
- def _generate_integration_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
399
- """Generate third-party integration settings."""
400
- try:
401
- settings = {}
402
-
403
- # Session configuration - use database for persistence by default
404
- settings.update(
405
- {
406
- "SESSION_ENGINE": "django.contrib.sessions.backends.db",
407
- "SESSION_COOKIE_AGE": 86400 * 7, # 7 days
408
- "SESSION_SAVE_EVERY_REQUEST": True,
409
- }
410
- )
411
-
412
- # Placeholder for future integrations
413
- integrations = []
414
-
415
- # Check for telegram configuration
416
- if config.telegram:
417
- telegram_settings = config.telegram.to_config_dict()
418
- settings["TELEGRAM_CONFIG"] = telegram_settings
419
- integrations.append("telegram")
420
-
421
- # Check for unfold configuration
422
- if config.unfold:
423
- unfold_settings = config.unfold.to_django_settings()
424
- settings.update(unfold_settings)
425
- integrations.append("unfold")
426
-
427
- # Check for Constance configuration
428
- if hasattr(config, "constance") and config.constance:
429
- # Set config reference for app fields detection
430
- config.constance.set_config(config)
431
- constance_settings = config.constance.to_django_settings()
432
- settings.update(constance_settings)
433
- integrations.append("constance")
434
-
435
- # Check for JWT configuration
436
- if hasattr(config, "jwt") and config.jwt:
437
- jwt_settings = config.jwt.to_django_settings(config.secret_key)
438
- settings.update(jwt_settings)
439
- integrations.append("jwt")
440
-
441
- # Check for Tasks/Dramatiq configuration
442
- try:
443
- # Use the config's computed method to determine if tasks should be enabled
444
- if config.should_enable_tasks():
445
- from django_cfg.models.tasks import TaskConfig
446
- from django_cfg.modules.django_tasks import generate_dramatiq_settings_from_config
447
-
448
- # Auto-initialize TaskConfig if needed and generate settings
449
- task_config = TaskConfig.auto_initialize_if_needed()
450
- if task_config is not None:
451
- dramatiq_settings = generate_dramatiq_settings_from_config()
452
- if dramatiq_settings:
453
- settings.update(dramatiq_settings)
454
- integrations.append("dramatiq")
455
- logger.info("✅ Dramatiq enabled (tasks/knowbase/agents required)")
456
- else:
457
- logger.debug("⏭️ Dramatiq disabled (no tasks/knowbase/agents)")
458
-
459
- except ImportError as e:
460
- logger.warning(f"Failed to import django_tasks module: {e}")
461
- except Exception as e:
462
- logger.error(f"Failed to generate Dramatiq settings: {e}")
463
-
464
- # Check for Django Revolution configuration
465
- if hasattr(config, "revolution") and config.revolution:
466
- revolution_settings = {
467
- "DJANGO_REVOLUTION": {
468
- "api_prefix": config.revolution.api_prefix,
469
- "debug": getattr(config.revolution, "debug", config.debug),
470
- "auto_install_deps": getattr(config.revolution, "auto_install_deps", True),
471
-
472
- "zones": {zone_name: zone_config.model_dump() for zone_name, zone_config in config.revolution.get_zones_with_defaults().items()},
473
- }
474
- }
475
- settings.update(revolution_settings)
476
- integrations.append("django_revolution")
477
-
478
- # Automatically generate DRF configuration using Revolution's core_config
479
- try:
480
- from django_revolution import create_drf_spectacular_config
481
-
482
- # Extract DRF parameters from RevolutionConfig
483
- drf_kwargs = {
484
- "title": getattr(config.revolution, "drf_title", "API"),
485
- "description": getattr(config.revolution, "drf_description", "RESTful API"),
486
- "version": getattr(config.revolution, "drf_version", "1.0.0"),
487
- "schema_path_prefix": f"/{config.revolution.api_prefix}/",
488
- "enable_browsable_api": getattr(config.revolution, "drf_enable_browsable_api", False),
489
- "enable_throttling": getattr(config.revolution, "drf_enable_throttling", False),
490
- }
491
-
492
- # Create DRF + Spectacular config with Revolution's comprehensive settings (includes proper enum config)
493
- drf_settings = create_drf_spectacular_config(**drf_kwargs)
494
- settings.update(drf_settings)
495
- logger.info("🚀 Generated DRF + Spectacular settings using Revolution's create_drf_spectacular_config")
496
- integrations.append("drf_spectacular")
497
-
498
- except ImportError as e:
499
- logger.warning(f"Could not import django_revolution.create_drf_spectacular_config: {e}")
500
- except Exception as e:
501
- logger.warning(f"Could not generate DRF config from Revolution: {e}")
502
-
503
- # Apply django-cfg DRF/Spectacular extensions
504
- try:
505
- # Always apply project name to Spectacular settings if they exist
506
- if "SPECTACULAR_SETTINGS" in settings:
507
- if config.spectacular:
508
- # User provided explicit spectacular config
509
- spectacular_extensions = config.spectacular.get_spectacular_settings(project_name=config.project_name)
510
- settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
511
- logger.info("🔧 Extended SPECTACULAR_SETTINGS with django-cfg Spectacular config")
512
- else:
513
- # Auto-create minimal spectacular config to set project name
514
- from django_cfg.models.drf import SpectacularConfig
515
- auto_spectacular = SpectacularConfig()
516
- spectacular_extensions = auto_spectacular.get_spectacular_settings(project_name=config.project_name)
517
- settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
518
- logger.info(f"🚀 Auto-configured API title as '{config.project_name} API'")
519
-
520
- integrations.append("drf_spectacular_extended")
521
-
522
- # Always apply django-cfg DRF settings (create REST_FRAMEWORK if needed)
523
- if config.drf:
524
- # User provided explicit DRF config
525
- drf_extensions = config.drf.get_rest_framework_settings()
526
- if "REST_FRAMEWORK" in settings:
527
- settings["REST_FRAMEWORK"].update(drf_extensions)
528
- else:
529
- settings["REST_FRAMEWORK"] = drf_extensions
530
- logger.info("🔧 Extended REST_FRAMEWORK settings with django-cfg DRF config")
531
- else:
532
- # Auto-create minimal DRF config to set default pagination
533
- from django_cfg.models.drf import DRFConfig
534
- auto_drf = DRFConfig()
535
- drf_extensions = auto_drf.get_rest_framework_settings()
536
-
537
- if "REST_FRAMEWORK" in settings:
538
- # Only apply pagination and page_size, don't override other settings
539
- pagination_settings = {
540
- 'DEFAULT_PAGINATION_CLASS': drf_extensions['DEFAULT_PAGINATION_CLASS'],
541
- 'PAGE_SIZE': drf_extensions['PAGE_SIZE'],
542
- }
543
- settings["REST_FRAMEWORK"].update(pagination_settings)
544
- else:
545
- # Create new REST_FRAMEWORK settings with our defaults
546
- settings["REST_FRAMEWORK"] = drf_extensions
547
-
548
- logger.info(f"🚀 Auto-configured default pagination: {drf_extensions['DEFAULT_PAGINATION_CLASS']}")
549
-
550
- except Exception as e:
551
- logger.warning(f"Could not apply DRF/Spectacular extensions from django-cfg: {e}")
552
-
553
- # Add integration info for debugging
554
- if integrations:
555
- settings["DJANGO_CFG_INTEGRATIONS"] = integrations
556
-
557
- # Apply additional settings from config if available (for overrides)
558
- if hasattr(config, "get_additional_settings"):
559
- additional_settings = config.get_additional_settings()
560
- settings.update(additional_settings)
561
-
562
- return settings
563
-
564
- except Exception as e:
565
- raise ConfigurationError(f"Failed to generate integration settings: {e}") from e
566
-
567
- @classmethod
568
- def validate_generated_settings(cls, settings: Dict[str, Any]) -> List[str]:
569
- """
570
- Validate generated Django settings.
571
-
572
- Args:
573
- settings: Generated Django settings
574
-
575
- Returns:
576
- List of validation errors (empty if valid)
577
- """
578
- errors = []
579
-
580
- # Required settings validation
581
- required_settings = ["SECRET_KEY", "DEBUG", "ALLOWED_HOSTS", "INSTALLED_APPS", "MIDDLEWARE", "DATABASES"]
582
-
583
- for setting in required_settings:
584
- if setting not in settings:
585
- errors.append(f"Missing required setting: {setting}")
586
-
587
- # SECRET_KEY validation
588
- if "SECRET_KEY" in settings:
589
- secret_key = settings["SECRET_KEY"]
590
- if not secret_key or len(secret_key) < 50:
591
- errors.append("SECRET_KEY must be at least 50 characters long")
592
-
593
- # DATABASES validation
594
- if "DATABASES" in settings:
595
- databases = settings["DATABASES"]
596
- if not isinstance(databases, dict) or not databases:
597
- errors.append("DATABASES must be a non-empty dictionary")
598
- elif "default" not in databases:
599
- errors.append("DATABASES must contain a 'default' database")
600
-
601
- # INSTALLED_APPS validation
602
- if "INSTALLED_APPS" in settings:
603
- installed_apps = settings["INSTALLED_APPS"]
604
- if not isinstance(installed_apps, list):
605
- errors.append("INSTALLED_APPS must be a list")
606
- else:
607
- required_apps = [
608
- "django.contrib.contenttypes",
609
- "django.contrib.auth",
610
- ]
611
- for app in required_apps:
612
- if app not in installed_apps:
613
- errors.append(f"Missing required app: {app}")
614
-
615
- return errors
616
-
617
-
618
- # Export the main class
619
- __all__ = [
620
- "SettingsGenerator",
621
- ]