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,32 @@
1
+ """
2
+ Helper utilities for settings generation.
3
+
4
+ Common functions used across multiple generators.
5
+ """
6
+
7
+ from typing import Dict, Any
8
+
9
+
10
+ def merge_settings(*settings_dicts: Dict[str, Any]) -> Dict[str, Any]:
11
+ """
12
+ Merge multiple settings dictionaries.
13
+
14
+ Later dictionaries override earlier ones.
15
+
16
+ Args:
17
+ *settings_dicts: Settings dictionaries to merge
18
+
19
+ Returns:
20
+ Merged settings dictionary
21
+
22
+ Example:
23
+ >>> merge_settings({"A": 1}, {"B": 2}, {"A": 3})
24
+ {"A": 3, "B": 2}
25
+ """
26
+ result = {}
27
+ for settings in settings_dicts:
28
+ result.update(settings)
29
+ return result
30
+
31
+
32
+ __all__ = ["merge_settings"]
@@ -16,23 +16,22 @@ _startup_info_shown = False
16
16
 
17
17
  def print_startup_info():
18
18
  """Print startup information based on config.startup_info_mode."""
19
- # Skip startup info in development mode to avoid hot reload spam
20
- try:
21
- from django.conf import settings
22
- if settings.DEBUG:
23
- return
24
- except Exception:
25
- pass
26
-
27
- try:
28
- manager = StartupDisplayManager()
29
- manager.display_startup_info()
30
-
31
- except Exception as e:
32
- import traceback
33
- print(f"❌ ERROR in print_startup_info: {e}")
34
- print("🔍 TRACEBACK:")
35
- traceback.print_exc()
19
+ global _startup_info_shown
20
+
21
+ # Skip if already shown (prevents spam on hot reload)
22
+ if _startup_info_shown:
23
+ return
24
+
25
+ # Only show in the actual worker process (not in autoreload parent process)
26
+ # RUN_MAIN is set by Django's autoreloader in the worker process
27
+ if os.environ.get('RUN_MAIN') != 'true':
28
+ return
29
+
30
+ # Mark as shown to prevent duplicate display on subsequent hot reloads
31
+ _startup_info_shown = True
32
+
33
+ manager = StartupDisplayManager()
34
+ manager.display_startup_info()
36
35
 
37
36
  def reset_startup_info_flag():
38
37
  """Reset the startup info display flag. Useful for testing or manual reset."""
@@ -41,14 +40,8 @@ def reset_startup_info_flag():
41
40
 
42
41
  def print_ngrok_tunnel_info(tunnel_url: str):
43
42
  """Print ngrok tunnel information after tunnel is established."""
44
- try:
45
- manager = NgrokDisplayManager()
46
- manager.display_tunnel_info(tunnel_url)
47
- except Exception as e:
48
- import traceback
49
- print(f"❌ ERROR in print_ngrok_tunnel_info: {e}")
50
- print("🔍 TRACEBACK:")
51
- traceback.print_exc()
43
+ manager = NgrokDisplayManager()
44
+ manager.display_tunnel_info(tunnel_url)
52
45
 
53
46
  from .version_checker import get_version_info, get_latest_version, get_current_version
54
47
  from .commands_collector import get_all_commands, get_command_count, get_commands_with_descriptions
@@ -20,145 +20,158 @@ class StartupDisplayManager(BaseDisplayManager):
20
20
 
21
21
  def display_startup_info(self):
22
22
  """Display startup information based on config.startup_info_mode."""
23
- try:
24
- if not self.config:
25
- return
26
-
27
- # Always check and display ngrok info first if active
28
- self.ngrok_manager.display_if_active()
29
-
30
- from django_cfg.core.config import StartupInfoMode
31
- mode = self.config.startup_info_mode
32
-
33
- if mode == StartupInfoMode.NONE:
34
- self.display_minimal_info()
35
- elif mode == StartupInfoMode.SHORT:
36
- self.display_essential_info()
37
- elif mode == StartupInfoMode.FULL:
38
- self.display_complete_info()
39
-
40
- except Exception:
41
- # Silently fail - startup info is not critical
42
- pass
23
+ if not self.config:
24
+ return
25
+
26
+ # Always check and display ngrok info first if active
27
+ self.ngrok_manager.display_if_active()
28
+
29
+ from django_cfg.core.config import StartupInfoMode
30
+ mode = self.config.startup_info_mode
31
+
32
+ if mode == StartupInfoMode.NONE:
33
+ self.display_minimal_info()
34
+ elif mode == StartupInfoMode.SHORT:
35
+ self.display_essential_info()
36
+ elif mode == StartupInfoMode.FULL:
37
+ self.display_complete_info()
43
38
 
44
39
  def display_minimal_info(self):
45
40
  """Display minimal startup info (NONE mode)."""
46
- version = self.get_version()
47
- panel_style, env_emoji, env_color = self.get_environment_style()
48
-
49
- # Simple one-liner
50
- info_text = Text()
51
- info_text.append(f"{env_emoji} Django CFG ", style="bold")
52
- info_text.append(f"v{version}", style="cyan")
53
- info_text.append(" • ", style="dim")
54
- info_text.append(f"{self.config.env_mode}", style=env_color)
55
- info_text.append(" • ", style="dim")
56
- info_text.append(f"{self.config.project_name}", style="white")
57
-
58
- # Check for critical updates
59
41
  try:
60
- from ..version_checker import get_version_info
61
- version_info = get_version_info()
62
- if version_info.get('update_available'):
63
- info_text.append(" ", style="dim")
64
- info_text.append("🚨 UPDATE AVAILABLE", style="bold yellow")
65
- info_text.append(" (", style="dim")
66
- info_text.append("poetry add django-cfg@latest", style="bright_blue")
67
- info_text.append(")", style="dim")
68
- except Exception:
69
- pass
70
-
71
- self.console.print(info_text)
42
+ version = self.get_version()
43
+ panel_style, env_emoji, env_color = self.get_environment_style()
44
+
45
+ # Simple one-liner
46
+ info_text = Text()
47
+ info_text.append(f"{env_emoji} Django CFG ", style="bold")
48
+ info_text.append(f"v{version}", style="cyan")
49
+ info_text.append("", style="dim")
50
+ info_text.append(f"{self.config.env_mode}", style=env_color)
51
+ info_text.append(" • ", style="dim")
52
+ info_text.append(f"{self.config.project_name}", style="white")
53
+
54
+ # Check for critical updates
55
+ try:
56
+ from ..version_checker import get_version_info
57
+ version_info = get_version_info()
58
+ if version_info.get('update_available'):
59
+ info_text.append(" • ", style="dim")
60
+ info_text.append("🚨 UPDATE AVAILABLE", style="bold yellow")
61
+ info_text.append(" (", style="dim")
62
+ info_text.append("poetry add django-cfg@latest", style="bright_blue")
63
+ info_text.append(")", style="dim")
64
+ except Exception:
65
+ pass
66
+
67
+ self.console.print(info_text)
68
+ except Exception as e:
69
+ import traceback
70
+ print(f"❌ ERROR in display_minimal_info: {e}")
71
+ print("🔍 TRACEBACK:")
72
+ traceback.print_exc()
72
73
 
73
74
  def display_essential_info(self):
74
75
  """Display essential startup info (SHORT mode)."""
75
- version = self.get_version()
76
- panel_style, env_emoji, env_color = self.get_environment_style()
77
-
78
- # Create compact header
79
- header_text = Text()
80
- header_text.append(f"{env_emoji} Django CFG ", style="bold")
81
- header_text.append(f"v{version}", style="cyan")
82
- header_text.append("", style="dim")
83
- header_text.append(f"{self.config.env_mode}", style=env_color)
84
- header_text.append("", style="dim")
85
- header_text.append(f"{self.config.project_name}", style="white")
86
-
87
- header_panel = self.create_panel(
88
- header_text,
89
- title="",
90
- border_style=panel_style,
91
- width=None
92
- )
93
- header_panel.padding = (0, 1) # Override padding for header
94
- self.console.print(header_panel)
95
-
96
- # Check for updates first
97
- self._display_update_notification_short()
98
-
99
- # Create columns for essential info
100
- self._display_essential_columns()
76
+ try:
77
+ version = self.get_version()
78
+ panel_style, env_emoji, env_color = self.get_environment_style()
79
+
80
+ # Create compact header
81
+ header_text = Text()
82
+ header_text.append(f"{env_emoji} Django CFG ", style="bold")
83
+ header_text.append(f"v{version}", style="cyan")
84
+ header_text.append("", style="dim")
85
+ header_text.append(f"{self.config.env_mode}", style=env_color)
86
+ header_text.append("", style="dim")
87
+ header_text.append(f"{self.config.project_name}", style="white")
88
+
89
+ header_panel = self.create_panel(
90
+ header_text,
91
+ title="",
92
+ border_style=panel_style,
93
+ width=None
94
+ )
95
+ header_panel.padding = (0, 1) # Override padding for header
96
+ self.console.print(header_panel)
97
+
98
+ # Check for updates first
99
+ self._display_update_notification_short()
100
+
101
+ # Create columns for essential info
102
+ self._display_essential_columns()
103
+ except Exception as e:
104
+ import traceback
105
+ print(f"❌ ERROR in display_essential_info: {e}")
106
+ print("🔍 TRACEBACK:")
107
+ traceback.print_exc()
101
108
 
102
109
  def display_complete_info(self):
103
110
  """Display complete startup info (FULL mode)."""
104
- version = self.get_version()
105
- panel_style, env_emoji, env_color = self.get_environment_style()
106
-
107
- # Get library info
108
- from django_cfg.config import (
109
- LIB_NAME, LIB_SITE_URL, LIB_DOCS_URL, LIB_GITHUB_URL,
110
- LIB_SUPPORT_URL, LIB_HEALTH_URL
111
- )
112
-
113
- # Create main info table
114
- info_table = self.create_table()
115
- info_table.add_column("Setting", style="cyan", width=30)
116
- info_table.add_column("Value", style="white")
117
-
118
- info_table.add_row("📦 Version", version)
119
- info_table.add_row("🔗 Prefix", "/cfg/")
120
- info_table.add_row("🌍 Environment", self.config.env_mode)
121
- info_table.add_row("🔧 Debug", str(self.config.debug))
122
- info_table.add_row("🏗️ Project", self.config.project_name)
123
-
124
- # Add environment source
125
- env_source = getattr(self.config, 'env_mode', 'default_fallback')
126
- info_table.add_row("🔍 Env Source", env_source)
127
-
128
- info_table.add_row("🌐 Site", LIB_SITE_URL)
129
- info_table.add_row("📚 Docs", LIB_DOCS_URL)
130
- info_table.add_row("🐙 GitHub", LIB_GITHUB_URL)
131
- info_table.add_row("🆘 Support", LIB_SUPPORT_URL)
132
-
133
- # Use full URL for health endpoint
134
- health_url = f"{self.get_base_url()}/cfg/health/"
135
- info_table.add_row("❤️ Health", health_url)
136
-
137
- # Create main panel with full width
138
- main_panel = self.create_full_width_panel(
139
- info_table,
140
- title=f"{env_emoji} Django CFG Configuration",
141
- border_style=panel_style
142
- )
143
-
144
- self.console.print(main_panel)
145
-
146
- # Check for updates
147
- self._display_update_notification_full()
148
-
149
- # Create columns for apps and endpoints
150
- self._display_main_columns()
151
-
152
- # App-specific configuration panels
153
- self._display_config_panels()
154
-
155
- # Revolution info
156
- self._display_revolution_info()
157
-
158
- # Management commands
159
- self._display_commands_info()
160
-
161
- self.print_spacing()
111
+ try:
112
+ version = self.get_version()
113
+ panel_style, env_emoji, env_color = self.get_environment_style()
114
+
115
+ # Get library info
116
+ from django_cfg.config import (
117
+ LIB_NAME, LIB_SITE_URL, LIB_DOCS_URL, LIB_GITHUB_URL,
118
+ LIB_SUPPORT_URL, LIB_HEALTH_URL
119
+ )
120
+
121
+ # Create main info table
122
+ info_table = self.create_table()
123
+ info_table.add_column("Setting", style="cyan", width=30)
124
+ info_table.add_column("Value", style="white")
125
+
126
+ info_table.add_row("📦 Version", version)
127
+ info_table.add_row("🔗 Prefix", "/cfg/")
128
+ info_table.add_row("🌍 Environment", self.config.env_mode)
129
+ info_table.add_row("🔧 Debug", str(self.config.debug))
130
+ info_table.add_row("🏗️ Project", self.config.project_name)
131
+
132
+ # Add environment source
133
+ env_source = getattr(self.config, 'env_mode', 'default_fallback')
134
+ info_table.add_row("🔍 Env Source", env_source)
135
+
136
+ info_table.add_row("🌐 Site", LIB_SITE_URL)
137
+ info_table.add_row("📚 Docs", LIB_DOCS_URL)
138
+ info_table.add_row("🐙 GitHub", LIB_GITHUB_URL)
139
+ info_table.add_row("🆘 Support", LIB_SUPPORT_URL)
140
+
141
+ # Use full URL for health endpoint
142
+ health_url = f"{self.get_base_url()}/cfg/health/"
143
+ info_table.add_row("❤️ Health", health_url)
144
+
145
+ # Create main panel with full width
146
+ main_panel = self.create_full_width_panel(
147
+ info_table,
148
+ title=f"{env_emoji} Django CFG Configuration",
149
+ border_style=panel_style
150
+ )
151
+
152
+ self.console.print(main_panel)
153
+
154
+ # Check for updates
155
+ self._display_update_notification_full()
156
+
157
+ # Create columns for apps and endpoints
158
+ self._display_main_columns()
159
+
160
+ # App-specific configuration panels
161
+ self._display_config_panels()
162
+
163
+ # Revolution info
164
+ self._display_revolution_info()
165
+
166
+ # Management commands
167
+ self._display_commands_info()
168
+
169
+ self.print_spacing()
170
+ except Exception as e:
171
+ import traceback
172
+ print(f"❌ ERROR in display_complete_info: {e}")
173
+ print("🔍 TRACEBACK:")
174
+ traceback.print_exc()
162
175
 
163
176
  def _display_update_notification_short(self):
164
177
  """Display update notification for SHORT mode."""
@@ -223,10 +236,10 @@ class StartupDisplayManager(BaseDisplayManager):
223
236
  def _display_essential_columns(self):
224
237
  """Display essential info in columns for SHORT mode."""
225
238
  # Enabled apps
226
- enabled_apps = self.config.get_enabled_apps() or []
239
+ enabled_apps = self.config.get_installed_apps() if hasattr(self.config, 'get_installed_apps') else []
227
240
  apps_table = self.create_table()
228
241
  apps_table.add_column("App", style="bright_blue")
229
-
242
+
230
243
  for app in enabled_apps[:5]: # Limit for SHORT mode
231
244
  app_name = app.split('.')[-1]
232
245
  apps_table.add_row(f"• {app_name}")
@@ -251,10 +264,10 @@ class StartupDisplayManager(BaseDisplayManager):
251
264
  def _display_main_columns(self):
252
265
  """Display main columns (apps and endpoints) for FULL mode."""
253
266
  # Enabled apps
254
- enabled_apps = self.config.get_enabled_apps() or []
267
+ enabled_apps = self.config.get_installed_apps() if hasattr(self.config, 'get_installed_apps') else []
255
268
  apps_table = self.create_table()
256
269
  apps_table.add_column("App", style="bright_blue")
257
-
270
+
258
271
  for app in enabled_apps:
259
272
  app_name = app.split('.')[-1]
260
273
  apps_table.add_row(f"• {app_name}")
@@ -53,14 +53,25 @@ def add_django_cfg_urls(urlpatterns: List[URLPattern], cfg_prefix: str = "cfg/")
53
53
  except ImportError:
54
54
  # Django Revolution not available - skip
55
55
  pass
56
-
56
+
57
+ # Add django-browser-reload URLs in development (if installed)
58
+ if settings.DEBUG:
59
+ try:
60
+ import django_browser_reload
61
+ new_patterns = new_patterns + [
62
+ path("__reload__/", include("django_browser_reload.urls")),
63
+ ]
64
+ except ImportError:
65
+ # django-browser-reload not installed - skip
66
+ pass
67
+
57
68
  # Show startup info based on config
58
69
  try:
59
70
  from . import print_startup_info
60
71
  print_startup_info()
61
72
  except ImportError:
62
73
  pass
63
-
74
+
64
75
  return new_patterns
65
76
 
66
77
 
@@ -0,0 +1,5 @@
1
+ """Services for configuration management."""
2
+
3
+ from .config_service import ConfigService
4
+
5
+ __all__ = ["ConfigService"]
@@ -0,0 +1,121 @@
1
+ """
2
+ Configuration service coordinating all builders.
3
+
4
+ Facade pattern: Provides simple API to DjangoConfig while delegating
5
+ to specialized builders for actual work.
6
+
7
+ Size: ~100 lines (pure coordination, no business logic)
8
+ """
9
+
10
+ from typing import List, Optional, TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from ..base.config_model import DjangoConfig
14
+ from ..builders.apps_builder import InstalledAppsBuilder
15
+ from ..builders.middleware_builder import MiddlewareBuilder
16
+ from ..builders.security_builder import SecurityBuilder
17
+
18
+
19
+ class ConfigService:
20
+ """
21
+ Facade service coordinating all configuration builders.
22
+
23
+ This service:
24
+ - Lazy-loads builders on demand
25
+ - Provides simple API for DjangoConfig
26
+ - Coordinates multiple builders
27
+
28
+ Example:
29
+ ```python
30
+ service = ConfigService(config)
31
+ apps = service.get_installed_apps()
32
+ middleware = service.get_middleware()
33
+ ```
34
+ """
35
+
36
+ def __init__(self, config: "DjangoConfig"):
37
+ """
38
+ Initialize service with configuration.
39
+
40
+ Args:
41
+ config: DjangoConfig instance
42
+ """
43
+ self.config = config
44
+
45
+ # Lazy initialization of builders
46
+ self._apps_builder: Optional["InstalledAppsBuilder"] = None
47
+ self._middleware_builder: Optional["MiddlewareBuilder"] = None
48
+ self._security_builder: Optional["SecurityBuilder"] = None
49
+
50
+ @property
51
+ def apps_builder(self) -> "InstalledAppsBuilder":
52
+ """Lazy-load apps builder."""
53
+ if self._apps_builder is None:
54
+ from ..builders.apps_builder import InstalledAppsBuilder
55
+ self._apps_builder = InstalledAppsBuilder(self.config)
56
+ return self._apps_builder
57
+
58
+ @property
59
+ def middleware_builder(self) -> "MiddlewareBuilder":
60
+ """Lazy-load middleware builder."""
61
+ if self._middleware_builder is None:
62
+ from ..builders.middleware_builder import MiddlewareBuilder
63
+ self._middleware_builder = MiddlewareBuilder(self.config)
64
+ return self._middleware_builder
65
+
66
+ @property
67
+ def security_builder(self) -> "SecurityBuilder":
68
+ """Lazy-load security builder."""
69
+ if self._security_builder is None:
70
+ from ..builders.security_builder import SecurityBuilder
71
+ self._security_builder = SecurityBuilder(self.config)
72
+ return self._security_builder
73
+
74
+ def get_installed_apps(self) -> List[str]:
75
+ """
76
+ Get complete INSTALLED_APPS list.
77
+
78
+ Delegates to InstalledAppsBuilder.
79
+
80
+ Returns:
81
+ List of Django app labels
82
+
83
+ Example:
84
+ >>> service.get_installed_apps()
85
+ ['django.contrib.admin', 'django.contrib.auth', ...]
86
+ """
87
+ return self.apps_builder.build()
88
+
89
+ def get_middleware(self) -> List[str]:
90
+ """
91
+ Get complete MIDDLEWARE list.
92
+
93
+ Delegates to MiddlewareBuilder.
94
+
95
+ Returns:
96
+ List of middleware class paths
97
+
98
+ Example:
99
+ >>> service.get_middleware()
100
+ ['django.middleware.security.SecurityMiddleware', ...]
101
+ """
102
+ return self.middleware_builder.build()
103
+
104
+ def get_allowed_hosts(self) -> List[str]:
105
+ """
106
+ Get ALLOWED_HOSTS from security configuration.
107
+
108
+ Delegates to SecurityBuilder.
109
+
110
+ Returns:
111
+ List of allowed host patterns
112
+
113
+ Example:
114
+ >>> service.get_allowed_hosts()
115
+ ['localhost', '127.0.0.1', 'example.com']
116
+ """
117
+ return self.security_builder.build_allowed_hosts()
118
+
119
+
120
+ # Export service
121
+ __all__ = ["ConfigService"]
@@ -0,0 +1,9 @@
1
+ """Global state management for django-cfg."""
2
+
3
+ from .registry import get_current_config, set_current_config, clear_current_config
4
+
5
+ __all__ = [
6
+ "get_current_config",
7
+ "set_current_config",
8
+ "clear_current_config",
9
+ ]
@@ -0,0 +1,84 @@
1
+ """
2
+ Global configuration registry.
3
+
4
+ Manages current DjangoConfig instance for thread-safe access.
5
+ Extracted from original config.py for better organization.
6
+
7
+ Size: ~60 lines (simple state management)
8
+ """
9
+
10
+ from typing import Optional, TYPE_CHECKING
11
+ import threading
12
+
13
+ if TYPE_CHECKING:
14
+ from ..base.config_model import DjangoConfig
15
+
16
+ # Thread-local storage for current config
17
+ _thread_local = threading.local()
18
+
19
+ # Global config (fallback if thread-local not set)
20
+ _global_config: Optional["DjangoConfig"] = None
21
+
22
+
23
+ def get_current_config() -> Optional["DjangoConfig"]:
24
+ """
25
+ Get currently active DjangoConfig instance.
26
+
27
+ Returns:
28
+ Current config instance, or None if not set
29
+
30
+ Example:
31
+ >>> config = get_current_config()
32
+ >>> if config:
33
+ ... print(config.project_name)
34
+ """
35
+ # Try thread-local first
36
+ config = getattr(_thread_local, "config", None)
37
+ if config is not None:
38
+ return config
39
+
40
+ # Fall back to global
41
+ return _global_config
42
+
43
+
44
+ def set_current_config(config: "DjangoConfig") -> None:
45
+ """
46
+ Set currently active DjangoConfig instance.
47
+
48
+ Args:
49
+ config: DjangoConfig instance to set as current
50
+
51
+ Example:
52
+ >>> config = DjangoConfig(project_name="My Project", ...)
53
+ >>> set_current_config(config)
54
+ """
55
+ global _global_config
56
+
57
+ # Set both thread-local and global
58
+ _thread_local.config = config
59
+ _global_config = config
60
+
61
+
62
+ def clear_current_config() -> None:
63
+ """
64
+ Clear currently active config (useful for testing).
65
+
66
+ Example:
67
+ >>> clear_current_config()
68
+ >>> assert get_current_config() is None
69
+ """
70
+ global _global_config
71
+
72
+ # Clear both thread-local and global
73
+ if hasattr(_thread_local, "config"):
74
+ delattr(_thread_local, "config")
75
+
76
+ _global_config = None
77
+
78
+
79
+ # Export functions
80
+ __all__ = [
81
+ "get_current_config",
82
+ "set_current_config",
83
+ "clear_current_config",
84
+ ]