django-cfg 1.3.11__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/inlines.py +11 -5
  3. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  4. django_cfg/apps/accounts/serializers/profile.py +1 -1
  5. django_cfg/apps/accounts/services/otp_service.py +18 -11
  6. django_cfg/apps/accounts/signals.py +15 -24
  7. django_cfg/apps/accounts/utils/notifications.py +217 -358
  8. django_cfg/apps/accounts/views/otp.py +2 -2
  9. django_cfg/apps/accounts/views/webhook.py +1 -1
  10. django_cfg/apps/agents/core/django_agent.py +1 -1
  11. django_cfg/apps/api/commands/views.py +66 -83
  12. django_cfg/apps/api/health/drf_views.py +269 -0
  13. django_cfg/apps/api/health/serializers.py +45 -0
  14. django_cfg/apps/api/health/urls.py +6 -1
  15. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  16. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  17. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  18. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  19. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  20. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  21. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  22. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  23. django_cfg/apps/knowbase/config/settings.py +2 -2
  24. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  25. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  26. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  27. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  28. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  29. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  30. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  31. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  32. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  33. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  34. django_cfg/apps/knowbase/mixins/service.py +2 -2
  35. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  47. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  48. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  49. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  50. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  51. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  52. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  53. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  54. django_cfg/apps/leads/tests.py +1 -1
  55. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  56. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  57. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  58. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  59. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  60. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  61. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  67. django_cfg/apps/payments/apps.py +1 -1
  68. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  69. django_cfg/apps/payments/config/helpers.py +3 -2
  70. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  71. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  73. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  74. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  75. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  76. django_cfg/apps/payments/middleware/api_access.py +1 -1
  77. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  78. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  79. django_cfg/apps/payments/models/balance.py +2 -2
  80. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  84. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  85. django_cfg/apps/payments/models/payments.py +2 -2
  86. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  87. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  88. django_cfg/apps/payments/services/core/base.py +1 -1
  89. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  90. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  91. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  92. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  93. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  94. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  95. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  96. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  97. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  98. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  99. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  100. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  101. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  102. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  103. django_cfg/apps/payments/services/providers/base.py +1 -1
  104. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  112. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  113. django_cfg/apps/payments/services/providers/registry.py +1 -1
  114. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  115. django_cfg/apps/payments/signals/__init__.py +1 -1
  116. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  117. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  118. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  119. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  120. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  121. django_cfg/apps/payments/views/api/balances.py +1 -1
  122. django_cfg/apps/payments/views/api/base.py +1 -1
  123. django_cfg/apps/payments/views/api/currencies.py +1 -1
  124. django_cfg/apps/payments/views/api/payments.py +1 -1
  125. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  126. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  127. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  128. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  129. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  130. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  131. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  132. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  133. django_cfg/apps/support/admin/support_admin.py +21 -13
  134. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  135. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  136. django_cfg/apps/support/utils/support_email_service.py +1 -1
  137. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  138. django_cfg/apps/tasks/utils/simulator.py +1 -1
  139. django_cfg/apps/tasks/views/dashboard.py +33 -3
  140. django_cfg/apps/urls.py +5 -1
  141. django_cfg/cli/README.md +57 -471
  142. django_cfg/cli/commands/create_project.py +140 -529
  143. django_cfg/cli/main.py +13 -10
  144. django_cfg/core/__init__.py +63 -6
  145. django_cfg/core/base/__init__.py +5 -0
  146. django_cfg/core/base/config_model.py +652 -0
  147. django_cfg/core/builders/__init__.py +11 -0
  148. django_cfg/core/builders/apps_builder.py +258 -0
  149. django_cfg/core/builders/middleware_builder.py +115 -0
  150. django_cfg/core/builders/security_builder.py +96 -0
  151. django_cfg/core/config.py +20 -892
  152. django_cfg/core/constants.py +69 -0
  153. django_cfg/core/environment/__init__.py +9 -0
  154. django_cfg/core/exceptions.py +45 -298
  155. django_cfg/core/generation/__init__.py +51 -0
  156. django_cfg/core/generation/core_generators/__init__.py +0 -0
  157. django_cfg/core/generation/core_generators/settings.py +90 -0
  158. django_cfg/core/generation/core_generators/static.py +82 -0
  159. django_cfg/core/generation/core_generators/templates.py +141 -0
  160. django_cfg/core/generation/data_generators/__init__.py +15 -0
  161. django_cfg/core/generation/data_generators/cache.py +132 -0
  162. django_cfg/core/generation/data_generators/database.py +117 -0
  163. django_cfg/core/generation/generation.py +92 -0
  164. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  165. django_cfg/core/generation/integration_generators/api.py +237 -0
  166. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  167. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  168. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  169. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  170. django_cfg/core/generation/orchestrator.py +285 -0
  171. django_cfg/core/generation/protocols.py +30 -0
  172. django_cfg/core/generation/security_generators/__init__.py +0 -0
  173. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  174. django_cfg/core/generation/utility_generators/email.py +58 -0
  175. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  176. django_cfg/core/generation/utility_generators/limits.py +58 -0
  177. django_cfg/core/generation/utility_generators/logging.py +66 -0
  178. django_cfg/core/generation/utility_generators/security.py +101 -0
  179. django_cfg/core/generation/utils/__init__.py +0 -0
  180. django_cfg/core/generation/utils/helpers.py +32 -0
  181. django_cfg/core/integration/__init__.py +18 -25
  182. django_cfg/core/integration/display/startup.py +146 -133
  183. django_cfg/core/integration/url_integration.py +13 -2
  184. django_cfg/core/services/__init__.py +5 -0
  185. django_cfg/core/services/config_service.py +121 -0
  186. django_cfg/core/state/__init__.py +9 -0
  187. django_cfg/core/state/registry.py +84 -0
  188. django_cfg/core/types/__init__.py +15 -0
  189. django_cfg/core/types/aliases.py +15 -0
  190. django_cfg/core/types/enums.py +49 -0
  191. django_cfg/dashboard/DEBUG_README.md +105 -0
  192. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  193. django_cfg/dashboard/__init__.py +24 -0
  194. django_cfg/dashboard/components.py +308 -0
  195. django_cfg/dashboard/debug.py +176 -0
  196. django_cfg/dashboard/management/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/__init__.py +0 -0
  198. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  199. django_cfg/dashboard/sections/__init__.py +1 -0
  200. django_cfg/dashboard/sections/base.py +128 -0
  201. django_cfg/dashboard/sections/commands.py +32 -0
  202. django_cfg/dashboard/sections/overview.py +394 -0
  203. django_cfg/dashboard/sections/stats.py +48 -0
  204. django_cfg/dashboard/sections/system.py +73 -0
  205. django_cfg/management/commands/check_settings.py +6 -2
  206. django_cfg/management/commands/clear_constance.py +6 -1
  207. django_cfg/management/commands/create_token.py +5 -4
  208. django_cfg/management/commands/generate.py +5 -0
  209. django_cfg/management/commands/list_urls.py +7 -2
  210. django_cfg/management/commands/migrate_all.py +6 -2
  211. django_cfg/management/commands/migrator.py +6 -1
  212. django_cfg/management/commands/rundramatiq.py +6 -1
  213. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  214. django_cfg/management/commands/runserver_ngrok.py +9 -7
  215. django_cfg/management/commands/script.py +25 -21
  216. django_cfg/management/commands/show_config.py +6 -1
  217. django_cfg/management/commands/show_urls.py +8 -3
  218. django_cfg/management/commands/superuser.py +5 -4
  219. django_cfg/management/commands/task_clear.py +8 -3
  220. django_cfg/management/commands/task_status.py +8 -3
  221. django_cfg/management/commands/test_email.py +6 -1
  222. django_cfg/management/commands/test_telegram.py +6 -1
  223. django_cfg/management/commands/test_twilio.py +6 -1
  224. django_cfg/management/commands/tree.py +7 -4
  225. django_cfg/models/__init__.py +88 -3
  226. django_cfg/models/api/__init__.py +27 -0
  227. django_cfg/models/{api.py → api/config.py} +1 -1
  228. django_cfg/models/api/drf/__init__.py +21 -0
  229. django_cfg/models/api/drf/config.py +101 -0
  230. django_cfg/models/api/drf/redoc.py +31 -0
  231. django_cfg/models/api/drf/spectacular.py +129 -0
  232. django_cfg/models/api/drf/swagger.py +59 -0
  233. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  234. django_cfg/models/{limits.py → api/limits.py} +0 -1
  235. django_cfg/models/base/__init__.py +14 -0
  236. django_cfg/models/django/__init__.py +16 -0
  237. django_cfg/models/{constance.py → django/constance.py} +1 -1
  238. django_cfg/models/{environment.py → django/environment.py} +1 -1
  239. django_cfg/models/infrastructure/__init__.py +17 -0
  240. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  241. django_cfg/models/infrastructure/database/__init__.py +22 -0
  242. django_cfg/models/infrastructure/database/config.py +265 -0
  243. django_cfg/models/infrastructure/database/converters.py +91 -0
  244. django_cfg/models/infrastructure/database/parsers.py +96 -0
  245. django_cfg/models/infrastructure/database/routing.py +85 -0
  246. django_cfg/models/infrastructure/database/validators.py +170 -0
  247. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  248. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  249. django_cfg/models/ngrok/__init__.py +11 -0
  250. django_cfg/models/ngrok/auth.py +37 -0
  251. django_cfg/models/ngrok/config.py +77 -0
  252. django_cfg/models/ngrok/tunnel.py +35 -0
  253. django_cfg/models/payments/__init__.py +20 -0
  254. django_cfg/models/payments/api_keys.py +57 -0
  255. django_cfg/models/{payments.py → payments/config.py} +56 -154
  256. django_cfg/models/payments/providers/__init__.py +15 -0
  257. django_cfg/models/payments/providers/base.py +25 -0
  258. django_cfg/models/payments/providers/nowpayments.py +48 -0
  259. django_cfg/models/services/__init__.py +18 -0
  260. django_cfg/models/services/base.py +65 -0
  261. django_cfg/models/{email.py → services/email.py} +1 -1
  262. django_cfg/models/services/telegram.py +172 -0
  263. django_cfg/models/tasks/__init__.py +51 -0
  264. django_cfg/models/tasks/backends.py +250 -0
  265. django_cfg/models/tasks/config.py +314 -0
  266. django_cfg/models/tasks/utils.py +174 -0
  267. django_cfg/modules/base.py +18 -3
  268. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  269. django_cfg/modules/django_admin/decorators/display.py +1 -1
  270. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  271. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  272. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  273. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  274. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  285. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  286. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  287. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  288. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  289. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  290. django_cfg/modules/django_drf_theme/README.md +207 -0
  291. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  292. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  293. django_cfg/modules/django_drf_theme/apps.py +15 -0
  294. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  298. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  299. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  300. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  301. django_cfg/modules/django_email/__init__.py +14 -0
  302. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  303. django_cfg/modules/django_email/utils.py +40 -0
  304. django_cfg/modules/django_health/__init__.py +9 -0
  305. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  306. django_cfg/modules/django_llm/llm/client.py +155 -550
  307. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  308. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  309. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  310. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  311. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  312. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  313. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  315. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  316. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  317. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  318. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  319. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  320. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  321. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  322. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  323. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  324. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  325. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  326. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  327. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  328. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  329. django_cfg/modules/django_llm/translator/translator.py +150 -603
  330. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  331. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  332. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  333. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  334. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  335. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  336. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  337. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  338. django_cfg/modules/django_logging/__init__.py +14 -0
  339. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  340. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  341. django_cfg/modules/django_ngrok/__init__.py +39 -0
  342. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  343. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  344. django_cfg/modules/django_rpc_old/README.md +397 -0
  345. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  346. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  347. django_cfg/modules/django_rpc_old/client.py +531 -0
  348. django_cfg/modules/django_rpc_old/config.py +279 -0
  349. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  350. django_cfg/modules/django_tailwind/README.md +478 -0
  351. django_cfg/modules/django_tailwind/__init__.py +7 -0
  352. django_cfg/modules/django_tailwind/apps.py +10 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  358. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  359. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  360. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  361. django_cfg/modules/django_tasks/__init__.py +29 -0
  362. django_cfg/modules/django_tasks/factory.py +127 -0
  363. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  364. django_cfg/modules/django_tasks/settings.py +107 -0
  365. django_cfg/modules/django_telegram/__init__.py +29 -0
  366. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  367. django_cfg/modules/django_telegram/utils.py +62 -0
  368. django_cfg/modules/django_twilio/__init__.py +54 -107
  369. django_cfg/modules/django_twilio/_imports.py +30 -0
  370. django_cfg/modules/django_twilio/base.py +192 -0
  371. django_cfg/modules/django_twilio/email_otp.py +227 -0
  372. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  373. django_cfg/modules/django_twilio/simple_service.py +1 -2
  374. django_cfg/modules/django_twilio/sms.py +94 -0
  375. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  376. django_cfg/modules/django_twilio/unified.py +310 -0
  377. django_cfg/modules/django_twilio/utils.py +190 -0
  378. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  379. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  380. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  381. django_cfg/modules/django_unfold/dashboard.py +65 -43
  382. django_cfg/modules/django_unfold/models/config.py +13 -12
  383. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  384. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  385. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  386. django_cfg/registry/core.py +24 -26
  387. django_cfg/registry/modules.py +5 -2
  388. django_cfg/registry/services.py +20 -3
  389. django_cfg/registry/third_party.py +8 -8
  390. django_cfg/static/admin/css/dashboard.css +260 -0
  391. django_cfg/static/admin/js/commands.js +171 -0
  392. django_cfg/static/admin/js/dashboard.js +126 -0
  393. django_cfg/templates/admin/components/management_commands.js +375 -0
  394. django_cfg/templates/admin/components/progress_bar.html +18 -23
  395. django_cfg/templates/admin/index.html +48 -20
  396. django_cfg/templates/admin/index_new.html +106 -0
  397. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  398. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  399. django_cfg/templates/admin/sections/commands_section.html +626 -0
  400. django_cfg/templates/admin/sections/overview_section.html +112 -0
  401. django_cfg/templates/admin/sections/stats_section.html +35 -0
  402. django_cfg/templates/admin/sections/system_section.html +99 -0
  403. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  404. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  405. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  406. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  407. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  408. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  409. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  410. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  411. django_cfg/templatetags/django_cfg.py +7 -1
  412. django_cfg/utils/smart_defaults.py +4 -4
  413. django_cfg-1.4.0.dist-info/METADATA +920 -0
  414. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
  415. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  416. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  417. django_cfg/core/generation.py +0 -621
  418. django_cfg/management/commands/validate_config.py +0 -189
  419. django_cfg/models/database.py +0 -480
  420. django_cfg/models/drf.py +0 -272
  421. django_cfg/models/ngrok.py +0 -122
  422. django_cfg/models/services.py +0 -440
  423. django_cfg/models/tasks.py +0 -550
  424. django_cfg/modules/django_twilio/service.py +0 -942
  425. django_cfg/template_archive/django_sample.zip +0 -0
  426. django_cfg/templates/rest_framework/api.html +0 -12
  427. django_cfg/utils/toolkit.py +0 -703
  428. django_cfg-1.3.11.dist-info/METADATA +0 -1029
  429. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  430. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  431. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  432. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  433. /django_cfg/models/{base.py → base/config.py} +0 -0
  434. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  435. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  436. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  437. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  438. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  439. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,258 @@
1
+ """
2
+ INSTALLED_APPS builder for Django-CFG.
3
+
4
+ Single Responsibility: Build Django INSTALLED_APPS list from configuration.
5
+ Extracted from original config.py (903 lines) for better maintainability.
6
+
7
+ Size: ~220 lines (focused on one task)
8
+ """
9
+
10
+ from typing import List, TYPE_CHECKING
11
+
12
+ from ..constants import DEFAULT_APPS
13
+
14
+ if TYPE_CHECKING:
15
+ from ..base.config_model import DjangoConfig
16
+
17
+
18
+ class InstalledAppsBuilder:
19
+ """
20
+ Builds INSTALLED_APPS list from DjangoConfig.
21
+
22
+ Responsibilities:
23
+ - Combine default Django/third-party apps
24
+ - Add django-cfg apps based on enabled features
25
+ - Handle special ordering (accounts before admin)
26
+ - Auto-enable tasks if needed
27
+ - Auto-detect dashboard apps from Unfold
28
+ - Add project-specific apps
29
+ - Remove duplicates while preserving order
30
+
31
+ Example:
32
+ ```python
33
+ builder = InstalledAppsBuilder(config)
34
+ apps = builder.build()
35
+ ```
36
+ """
37
+
38
+ def __init__(self, config: "DjangoConfig"):
39
+ """
40
+ Initialize builder with configuration.
41
+
42
+ Args:
43
+ config: DjangoConfig instance
44
+ """
45
+ self.config = config
46
+
47
+ def build(self) -> List[str]:
48
+ """
49
+ Build complete INSTALLED_APPS list.
50
+
51
+ Returns:
52
+ List of Django app labels in correct order
53
+
54
+ Example:
55
+ >>> config = DjangoConfig(enable_support=True)
56
+ >>> builder = InstalledAppsBuilder(config)
57
+ >>> apps = builder.build()
58
+ >>> "django_cfg.apps.support" in apps
59
+ True
60
+ """
61
+ apps = []
62
+
63
+ # Step 1: Add default apps (with special handling for accounts)
64
+ apps.extend(self._get_default_apps())
65
+
66
+ # Step 2: Add django-cfg built-in apps
67
+ apps.extend(self._get_django_cfg_apps())
68
+
69
+ # Step 3: Add optional apps (tasks, dashboard)
70
+ apps.extend(self._get_optional_apps())
71
+
72
+ # Step 4: Add project-specific apps
73
+ apps.extend(self.config.project_apps)
74
+
75
+ # Step 5: Remove duplicates while preserving order
76
+ return self._deduplicate(apps)
77
+
78
+ def _get_default_apps(self) -> List[str]:
79
+ """
80
+ Get base Django and third-party apps.
81
+
82
+ Handles special case: accounts app must be inserted before admin
83
+ for proper migration order.
84
+
85
+ Returns:
86
+ List of default app labels
87
+ """
88
+ apps = []
89
+
90
+ # Add apps one by one, inserting accounts before admin if enabled
91
+ for app in DEFAULT_APPS:
92
+ if app == "django.contrib.admin":
93
+ # Insert accounts before admin if enabled (for proper migration order)
94
+ if self.config.enable_accounts:
95
+ apps.append("django_cfg.apps.accounts")
96
+ apps.append(app)
97
+
98
+ return apps
99
+
100
+ def _get_django_cfg_apps(self) -> List[str]:
101
+ """
102
+ Get django-cfg built-in apps based on enabled features.
103
+
104
+ Returns:
105
+ List of django-cfg app labels
106
+ """
107
+ apps = [
108
+ # Core apps (always enabled)
109
+ "django_cfg.modules.django_tailwind", # Universal Tailwind layouts
110
+ "django_cfg.apps.api.health",
111
+ "django_cfg.apps.api.commands",
112
+ ]
113
+
114
+ # Add optional apps based on configuration
115
+ if self.config.enable_support:
116
+ apps.append("django_cfg.apps.support")
117
+
118
+ if self.config.enable_newsletter:
119
+ apps.append("django_cfg.apps.newsletter")
120
+
121
+ if self.config.enable_leads:
122
+ apps.append("django_cfg.apps.leads")
123
+
124
+ if self.config.enable_knowbase:
125
+ apps.append("django_cfg.apps.knowbase")
126
+
127
+ if self.config.enable_agents:
128
+ apps.append("django_cfg.apps.agents")
129
+
130
+ if self.config.enable_maintenance:
131
+ apps.append("django_cfg.apps.maintenance")
132
+
133
+ if self.config.payments and self.config.payments.enabled:
134
+ apps.append("django_cfg.apps.payments")
135
+
136
+ if self.config.django_cfg_rpc and self.config.django_cfg_rpc.enabled:
137
+ apps.append("django_cfg.modules.django_cfg_rpc_client.dashboard")
138
+
139
+ return apps
140
+
141
+ def _get_optional_apps(self) -> List[str]:
142
+ """
143
+ Get optional apps like background tasks, dashboard apps, and frontend integrations.
144
+
145
+ Returns:
146
+ List of optional app labels
147
+ """
148
+ apps = []
149
+
150
+ # Auto-enable tasks if needed by other features
151
+ if self.config.should_enable_tasks():
152
+ apps.append("django_dramatiq") # Add django_dramatiq first
153
+ apps.append("django_cfg.apps.tasks")
154
+
155
+ # Add DRF Tailwind theme module (uses Tailwind via CDN)
156
+ if self.config.enable_drf_tailwind:
157
+ apps.append("django_cfg.modules.django_drf_theme.apps.DjangoDRFThemeConfig")
158
+
159
+ # Add Tailwind CSS apps (optional, only if theme app exists)
160
+ # Note: DRF Tailwind theme doesn't require these
161
+ try:
162
+ import importlib
163
+ importlib.import_module(self.config.tailwind_app_name)
164
+ apps.append("tailwind")
165
+ apps.append(self.config.tailwind_app_name)
166
+ except (ImportError, ModuleNotFoundError):
167
+ # Tailwind app not installed, skip it
168
+ pass
169
+
170
+ # Add browser reload in development (if installed)
171
+ if self.config.debug:
172
+ try:
173
+ import django_browser_reload
174
+ apps.append("django_browser_reload")
175
+ except ImportError:
176
+ # django-browser-reload not installed, skip it
177
+ pass
178
+
179
+ # Auto-detect dashboard apps from Unfold callback
180
+ dashboard_apps = self._get_dashboard_apps_from_callback()
181
+ apps.extend(dashboard_apps)
182
+
183
+ return apps
184
+
185
+ def _get_dashboard_apps_from_callback(self) -> List[str]:
186
+ """
187
+ Auto-detect dashboard apps from Unfold dashboard_callback setting.
188
+
189
+ Extracts app names from callback paths like:
190
+ - "api.dashboard.callbacks.main_dashboard_callback" → ["api.dashboard"]
191
+ - "myproject.admin.callbacks.dashboard" → ["myproject.admin"]
192
+
193
+ This allows django-cfg to automatically add dashboard apps to INSTALLED_APPS
194
+ without requiring manual configuration.
195
+
196
+ Returns:
197
+ List of dashboard app names to add to INSTALLED_APPS
198
+ """
199
+ dashboard_apps = []
200
+
201
+ # Check if Unfold is configured with a theme
202
+ if not self.config.unfold or not self.config.unfold.theme:
203
+ return dashboard_apps
204
+
205
+ # Get dashboard callback path from theme
206
+ callback_path = getattr(self.config.unfold.theme, "dashboard_callback", None)
207
+ if not callback_path:
208
+ return dashboard_apps
209
+
210
+ try:
211
+ # Parse callback path: "api.dashboard.callbacks.main_dashboard_callback"
212
+ # Extract app part: "api.dashboard"
213
+ parts = callback_path.split(".")
214
+
215
+ # Look for common callback patterns
216
+ callback_indicators = ["callbacks", "views", "handlers"]
217
+
218
+ # Find the callback indicator and extract app path before it
219
+ app_parts = []
220
+ for i, part in enumerate(parts):
221
+ if part in callback_indicators:
222
+ app_parts = parts[:i] # Everything before the callback indicator
223
+ break
224
+
225
+ # If no callback indicator found, assume last part is function name
226
+ if not app_parts and len(parts) > 1:
227
+ app_parts = parts[:-1] # Everything except the last part
228
+
229
+ if app_parts:
230
+ app_name = ".".join(app_parts)
231
+ dashboard_apps.append(app_name)
232
+
233
+ except Exception:
234
+ # If parsing fails, silently continue - dashboard callback is optional
235
+ pass
236
+
237
+ return dashboard_apps
238
+
239
+ def _deduplicate(self, apps: List[str]) -> List[str]:
240
+ """
241
+ Remove duplicate apps while preserving order.
242
+
243
+ Args:
244
+ apps: List of app labels (may contain duplicates)
245
+
246
+ Returns:
247
+ Deduplicated list of app labels
248
+
249
+ Example:
250
+ >>> builder._deduplicate(["app1", "app2", "app1", "app3"])
251
+ ["app1", "app2", "app3"]
252
+ """
253
+ seen = set()
254
+ return [app for app in apps if not (app in seen or seen.add(app))]
255
+
256
+
257
+ # Export builder
258
+ __all__ = ["InstalledAppsBuilder"]
@@ -0,0 +1,115 @@
1
+ """
2
+ MIDDLEWARE builder for Django-CFG.
3
+
4
+ Single Responsibility: Build Django MIDDLEWARE list from configuration.
5
+ Extracted from original config.py for better maintainability.
6
+
7
+ Size: ~120 lines (focused on middleware logic)
8
+ """
9
+
10
+ from typing import List, TYPE_CHECKING
11
+
12
+ from ..constants import DEFAULT_MIDDLEWARE
13
+
14
+ if TYPE_CHECKING:
15
+ from ..base.config_model import DjangoConfig
16
+
17
+
18
+ class MiddlewareBuilder:
19
+ """
20
+ Builds MIDDLEWARE list from DjangoConfig.
21
+
22
+ Responsibilities:
23
+ - Add default Django middleware
24
+ - Insert CORS middleware if security domains configured
25
+ - Add feature-specific middleware (accounts, payments)
26
+ - Add custom user middleware
27
+ - Maintain correct middleware ordering
28
+
29
+ Example:
30
+ ```python
31
+ builder = MiddlewareBuilder(config)
32
+ middleware = builder.build()
33
+ ```
34
+ """
35
+
36
+ def __init__(self, config: "DjangoConfig"):
37
+ """
38
+ Initialize builder with configuration.
39
+
40
+ Args:
41
+ config: DjangoConfig instance
42
+ """
43
+ self.config = config
44
+
45
+ def build(self) -> List[str]:
46
+ """
47
+ Build complete MIDDLEWARE list.
48
+
49
+ Returns:
50
+ List of middleware class paths in correct order
51
+
52
+ Example:
53
+ >>> config = DjangoConfig(security_domains=["example.com"])
54
+ >>> builder = MiddlewareBuilder(config)
55
+ >>> middleware = builder.build()
56
+ >>> "corsheaders.middleware.CorsMiddleware" in middleware
57
+ True
58
+ """
59
+ # Start with default middleware
60
+ middleware = list(DEFAULT_MIDDLEWARE)
61
+
62
+ # Add CORS middleware if security domains configured
63
+ # Insert after WhiteNoise but before Session middleware
64
+ if self.config.security_domains:
65
+ # Find WhiteNoise position
66
+ try:
67
+ whitenoise_index = middleware.index("whitenoise.middleware.WhiteNoiseMiddleware")
68
+ # Insert CORS after WhiteNoise
69
+ middleware.insert(whitenoise_index + 1, "corsheaders.middleware.CorsMiddleware")
70
+ except ValueError:
71
+ # If WhiteNoise not found, insert at beginning
72
+ middleware.insert(0, "corsheaders.middleware.CorsMiddleware")
73
+
74
+ # Add django-cfg feature-specific middleware
75
+ feature_middleware = self._get_feature_middleware()
76
+ middleware.extend(feature_middleware)
77
+
78
+ # Add custom user middleware
79
+ middleware.extend(self.config.custom_middleware)
80
+
81
+ return middleware
82
+
83
+ def _get_feature_middleware(self) -> List[str]:
84
+ """
85
+ Get middleware for enabled django-cfg features.
86
+
87
+ Returns:
88
+ List of feature-specific middleware class paths
89
+ """
90
+ middleware = []
91
+
92
+ # Accounts middleware (user activity tracking)
93
+ if self.config.enable_accounts:
94
+ middleware.append("django_cfg.middleware.UserActivityMiddleware")
95
+
96
+ # Payments middleware (if enabled and configured)
97
+ if self.config.payments and self.config.payments.enabled:
98
+ payment_middleware = self.config.payments.get_middleware_classes()
99
+ middleware.extend(payment_middleware)
100
+
101
+ # Tailwind CSS middleware (browser reload in development)
102
+ # Note: Must be after middleware that encodes responses (like GZipMiddleware)
103
+ if self.config.debug:
104
+ try:
105
+ import django_browser_reload
106
+ middleware.append("django_browser_reload.middleware.BrowserReloadMiddleware")
107
+ except ImportError:
108
+ # django-browser-reload not installed, skip it
109
+ pass
110
+
111
+ return middleware
112
+
113
+
114
+ # Export builder
115
+ __all__ = ["MiddlewareBuilder"]
@@ -0,0 +1,96 @@
1
+ """
2
+ Security settings builder for Django-CFG.
3
+
4
+ Single Responsibility: Build security-related Django settings (ALLOWED_HOSTS, CORS, etc.).
5
+ Extracted from original config.py for better maintainability.
6
+
7
+ Size: ~100 lines (focused on security)
8
+ """
9
+
10
+ from typing import List, TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from ..base.config_model import DjangoConfig
14
+
15
+
16
+ class SecurityBuilder:
17
+ """
18
+ Builds security-related settings from DjangoConfig.
19
+
20
+ Responsibilities:
21
+ - Generate ALLOWED_HOSTS from security_domains
22
+ - Add localhost/127.0.0.1 in development
23
+ - Prepare CORS settings
24
+ - Handle SSL redirect configuration
25
+
26
+ Example:
27
+ ```python
28
+ builder = SecurityBuilder(config)
29
+ allowed_hosts = builder.build_allowed_hosts()
30
+ ```
31
+ """
32
+
33
+ def __init__(self, config: "DjangoConfig"):
34
+ """
35
+ Initialize builder with configuration.
36
+
37
+ Args:
38
+ config: DjangoConfig instance
39
+ """
40
+ self.config = config
41
+
42
+ def build_allowed_hosts(self) -> List[str]:
43
+ """
44
+ Build ALLOWED_HOSTS from security_domains.
45
+
46
+ In development:
47
+ - Adds localhost, 127.0.0.1, [::1]
48
+ - Adds security_domains if provided
49
+
50
+ In production:
51
+ - Uses only security_domains
52
+ - Warning if security_domains is empty
53
+
54
+ Returns:
55
+ List of allowed host patterns
56
+
57
+ Example:
58
+ >>> config = DjangoConfig(
59
+ ... env_mode=EnvironmentMode.PRODUCTION,
60
+ ... security_domains=["example.com", "api.example.com"]
61
+ ... )
62
+ >>> builder = SecurityBuilder(config)
63
+ >>> hosts = builder.build_allowed_hosts()
64
+ >>> "example.com" in hosts
65
+ True
66
+ """
67
+ allowed_hosts = []
68
+
69
+ # Development mode: add localhost by default
70
+ if self.config.is_development:
71
+ allowed_hosts.extend([
72
+ "localhost",
73
+ "127.0.0.1",
74
+ "[::1]", # IPv6 localhost
75
+ ])
76
+
77
+ # Add security domains (both dev and prod)
78
+ allowed_hosts.extend(self.config.security_domains)
79
+
80
+ # Production warning if no domains configured
81
+ if self.config.is_production and not self.config.security_domains:
82
+ import warnings
83
+ warnings.warn(
84
+ "No security_domains configured in production mode. "
85
+ "Add domains to security_domains field for proper security.",
86
+ UserWarning,
87
+ stacklevel=2,
88
+ )
89
+ # In production without domains, allow all (not recommended)
90
+ allowed_hosts = ["*"]
91
+
92
+ return allowed_hosts
93
+
94
+
95
+ # Export builder
96
+ __all__ = ["SecurityBuilder"]