django-cfg 1.3.13__py3-none-any.whl → 1.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  3. django_cfg/apps/accounts/serializers/profile.py +1 -1
  4. django_cfg/apps/accounts/services/otp_service.py +18 -11
  5. django_cfg/apps/accounts/signals.py +15 -24
  6. django_cfg/apps/accounts/utils/notifications.py +217 -358
  7. django_cfg/apps/accounts/views/otp.py +2 -2
  8. django_cfg/apps/accounts/views/webhook.py +1 -1
  9. django_cfg/apps/agents/core/django_agent.py +1 -1
  10. django_cfg/apps/agents/examples/__init__.py +3 -0
  11. django_cfg/apps/agents/examples/simple_example.py +161 -0
  12. django_cfg/apps/api/commands/views.py +66 -83
  13. django_cfg/apps/api/health/drf_views.py +269 -0
  14. django_cfg/apps/api/health/serializers.py +45 -0
  15. django_cfg/apps/api/health/urls.py +6 -1
  16. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  17. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  18. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  19. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  20. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  21. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  22. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  23. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  24. django_cfg/apps/knowbase/config/settings.py +2 -2
  25. django_cfg/apps/knowbase/examples/__init__.py +3 -0
  26. django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
  27. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  28. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  29. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  30. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  31. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  32. django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
  33. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  34. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  35. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  36. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  37. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  38. django_cfg/apps/knowbase/mixins/service.py +2 -2
  39. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  41. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  42. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  43. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  44. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  47. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  48. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  49. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  50. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  51. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  52. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  53. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  54. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  55. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  56. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  57. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  58. django_cfg/apps/leads/tests.py +1 -1
  59. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  60. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  61. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  62. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  63. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  64. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  65. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  67. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  68. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  69. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  70. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  71. django_cfg/apps/payments/apps.py +1 -1
  72. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  73. django_cfg/apps/payments/config/helpers.py +3 -2
  74. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  75. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  76. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  77. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  78. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  79. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  80. django_cfg/apps/payments/middleware/api_access.py +1 -1
  81. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  82. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  83. django_cfg/apps/payments/models/balance.py +2 -2
  84. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  85. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  86. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  87. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  88. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  89. django_cfg/apps/payments/models/payments.py +2 -2
  90. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  91. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  92. django_cfg/apps/payments/services/core/base.py +1 -1
  93. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  94. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  95. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  96. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  97. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  98. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  99. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  100. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  101. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  102. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  103. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  104. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  105. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  106. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  107. django_cfg/apps/payments/services/providers/base.py +1 -1
  108. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  112. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  113. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  114. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  115. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  116. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  117. django_cfg/apps/payments/services/providers/registry.py +1 -1
  118. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  119. django_cfg/apps/payments/signals/__init__.py +1 -1
  120. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  121. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  122. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  123. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  124. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  125. django_cfg/apps/payments/views/api/balances.py +1 -1
  126. django_cfg/apps/payments/views/api/base.py +1 -1
  127. django_cfg/apps/payments/views/api/currencies.py +1 -1
  128. django_cfg/apps/payments/views/api/payments.py +1 -1
  129. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  130. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  131. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  132. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  133. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  134. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  135. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  136. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  137. django_cfg/apps/support/admin/support_admin.py +21 -13
  138. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  139. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  140. django_cfg/apps/support/utils/support_email_service.py +1 -1
  141. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  142. django_cfg/apps/tasks/utils/simulator.py +1 -1
  143. django_cfg/apps/tasks/views/dashboard.py +33 -3
  144. django_cfg/apps/urls.py +5 -1
  145. django_cfg/cli/README.md +57 -471
  146. django_cfg/cli/commands/create_project.py +140 -529
  147. django_cfg/cli/main.py +13 -10
  148. django_cfg/core/__init__.py +63 -6
  149. django_cfg/core/base/__init__.py +5 -0
  150. django_cfg/core/base/config_model.py +652 -0
  151. django_cfg/core/builders/__init__.py +11 -0
  152. django_cfg/core/builders/apps_builder.py +258 -0
  153. django_cfg/core/builders/middleware_builder.py +115 -0
  154. django_cfg/core/builders/security_builder.py +96 -0
  155. django_cfg/core/config.py +20 -892
  156. django_cfg/core/constants.py +69 -0
  157. django_cfg/core/environment/__init__.py +9 -0
  158. django_cfg/core/exceptions.py +45 -298
  159. django_cfg/core/generation/__init__.py +51 -0
  160. django_cfg/core/generation/core_generators/__init__.py +0 -0
  161. django_cfg/core/generation/core_generators/settings.py +90 -0
  162. django_cfg/core/generation/core_generators/static.py +82 -0
  163. django_cfg/core/generation/core_generators/templates.py +141 -0
  164. django_cfg/core/generation/data_generators/__init__.py +15 -0
  165. django_cfg/core/generation/data_generators/cache.py +132 -0
  166. django_cfg/core/generation/data_generators/database.py +117 -0
  167. django_cfg/core/generation/generation.py +92 -0
  168. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  169. django_cfg/core/generation/integration_generators/api.py +237 -0
  170. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  171. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  172. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  173. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  174. django_cfg/core/generation/orchestrator.py +285 -0
  175. django_cfg/core/generation/protocols.py +30 -0
  176. django_cfg/core/generation/security_generators/__init__.py +0 -0
  177. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  178. django_cfg/core/generation/utility_generators/email.py +58 -0
  179. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  180. django_cfg/core/generation/utility_generators/limits.py +58 -0
  181. django_cfg/core/generation/utility_generators/logging.py +66 -0
  182. django_cfg/core/generation/utility_generators/security.py +101 -0
  183. django_cfg/core/generation/utils/__init__.py +0 -0
  184. django_cfg/core/generation/utils/helpers.py +32 -0
  185. django_cfg/core/integration/__init__.py +18 -25
  186. django_cfg/core/integration/display/startup.py +146 -133
  187. django_cfg/core/integration/url_integration.py +13 -2
  188. django_cfg/core/services/__init__.py +5 -0
  189. django_cfg/core/services/config_service.py +121 -0
  190. django_cfg/core/state/__init__.py +9 -0
  191. django_cfg/core/state/registry.py +84 -0
  192. django_cfg/core/types/__init__.py +15 -0
  193. django_cfg/core/types/aliases.py +15 -0
  194. django_cfg/core/types/enums.py +49 -0
  195. django_cfg/dashboard/DEBUG_README.md +105 -0
  196. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  197. django_cfg/dashboard/__init__.py +24 -0
  198. django_cfg/dashboard/components.py +308 -0
  199. django_cfg/dashboard/debug.py +176 -0
  200. django_cfg/dashboard/management/__init__.py +0 -0
  201. django_cfg/dashboard/management/commands/__init__.py +0 -0
  202. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  203. django_cfg/dashboard/sections/__init__.py +1 -0
  204. django_cfg/dashboard/sections/base.py +128 -0
  205. django_cfg/dashboard/sections/commands.py +32 -0
  206. django_cfg/dashboard/sections/overview.py +394 -0
  207. django_cfg/dashboard/sections/stats.py +48 -0
  208. django_cfg/dashboard/sections/system.py +73 -0
  209. django_cfg/management/commands/check_settings.py +6 -2
  210. django_cfg/management/commands/clear_constance.py +6 -1
  211. django_cfg/management/commands/create_token.py +5 -4
  212. django_cfg/management/commands/generate.py +5 -0
  213. django_cfg/management/commands/list_urls.py +7 -2
  214. django_cfg/management/commands/migrate_all.py +6 -2
  215. django_cfg/management/commands/migrator.py +6 -1
  216. django_cfg/management/commands/rundramatiq.py +6 -1
  217. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  218. django_cfg/management/commands/runserver_ngrok.py +9 -7
  219. django_cfg/management/commands/script.py +25 -21
  220. django_cfg/management/commands/show_config.py +6 -1
  221. django_cfg/management/commands/show_urls.py +8 -3
  222. django_cfg/management/commands/superuser.py +5 -4
  223. django_cfg/management/commands/task_clear.py +8 -3
  224. django_cfg/management/commands/task_status.py +8 -3
  225. django_cfg/management/commands/test_email.py +6 -1
  226. django_cfg/management/commands/test_telegram.py +6 -1
  227. django_cfg/management/commands/test_twilio.py +6 -1
  228. django_cfg/management/commands/tree.py +7 -4
  229. django_cfg/models/__init__.py +88 -3
  230. django_cfg/models/api/__init__.py +27 -0
  231. django_cfg/models/{api.py → api/config.py} +1 -1
  232. django_cfg/models/api/drf/__init__.py +21 -0
  233. django_cfg/models/api/drf/config.py +101 -0
  234. django_cfg/models/api/drf/redoc.py +31 -0
  235. django_cfg/models/api/drf/spectacular.py +129 -0
  236. django_cfg/models/api/drf/swagger.py +59 -0
  237. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  238. django_cfg/models/{limits.py → api/limits.py} +0 -1
  239. django_cfg/models/base/__init__.py +14 -0
  240. django_cfg/models/django/__init__.py +16 -0
  241. django_cfg/models/{constance.py → django/constance.py} +1 -1
  242. django_cfg/models/{environment.py → django/environment.py} +1 -1
  243. django_cfg/models/infrastructure/__init__.py +17 -0
  244. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  245. django_cfg/models/infrastructure/database/__init__.py +22 -0
  246. django_cfg/models/infrastructure/database/config.py +265 -0
  247. django_cfg/models/infrastructure/database/converters.py +91 -0
  248. django_cfg/models/infrastructure/database/parsers.py +96 -0
  249. django_cfg/models/infrastructure/database/routing.py +85 -0
  250. django_cfg/models/infrastructure/database/validators.py +170 -0
  251. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  252. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  253. django_cfg/models/ngrok/__init__.py +11 -0
  254. django_cfg/models/ngrok/auth.py +37 -0
  255. django_cfg/models/ngrok/config.py +77 -0
  256. django_cfg/models/ngrok/tunnel.py +35 -0
  257. django_cfg/models/payments/__init__.py +20 -0
  258. django_cfg/models/payments/api_keys.py +57 -0
  259. django_cfg/models/{payments.py → payments/config.py} +56 -154
  260. django_cfg/models/payments/providers/__init__.py +15 -0
  261. django_cfg/models/payments/providers/base.py +25 -0
  262. django_cfg/models/payments/providers/nowpayments.py +48 -0
  263. django_cfg/models/services/__init__.py +18 -0
  264. django_cfg/models/services/base.py +65 -0
  265. django_cfg/models/{email.py → services/email.py} +1 -1
  266. django_cfg/models/services/telegram.py +172 -0
  267. django_cfg/models/tasks/__init__.py +51 -0
  268. django_cfg/models/tasks/backends.py +250 -0
  269. django_cfg/models/tasks/config.py +314 -0
  270. django_cfg/models/tasks/utils.py +174 -0
  271. django_cfg/modules/base.py +18 -3
  272. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  273. django_cfg/modules/django_admin/decorators/display.py +1 -1
  274. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  275. django_cfg/modules/django_currency/examples/__init__.py +3 -0
  276. django_cfg/modules/django_currency/examples/example_database_usage.py +144 -0
  277. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  278. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  279. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  280. django_cfg/modules/django_drf_theme/README.md +207 -0
  281. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  282. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  283. django_cfg/modules/django_drf_theme/apps.py +15 -0
  284. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  285. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  286. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  287. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  288. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  289. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  290. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  291. django_cfg/modules/django_email/__init__.py +14 -0
  292. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  293. django_cfg/modules/django_email/utils.py +40 -0
  294. django_cfg/modules/django_health/__init__.py +9 -0
  295. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  296. django_cfg/modules/django_ipc_client/README.md +346 -0
  297. django_cfg/modules/django_ipc_client/__init__.py +51 -0
  298. django_cfg/modules/django_ipc_client/client.py +540 -0
  299. django_cfg/modules/django_ipc_client/config.py +207 -0
  300. django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
  301. django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  302. django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
  303. django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
  304. django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
  305. django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
  306. django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
  307. django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
  308. django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
  309. django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
  310. django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
  311. django_cfg/modules/django_ipc_client/exceptions.py +201 -0
  312. django_cfg/modules/django_llm/llm/client.py +155 -550
  313. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  314. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  315. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  316. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  317. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  318. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  319. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  320. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  321. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  322. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  323. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  324. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  325. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  326. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  327. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  328. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  329. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  330. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  331. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  332. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  333. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  334. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  335. django_cfg/modules/django_llm/translator/translator.py +150 -603
  336. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  337. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  338. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  339. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  340. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  341. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  342. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  343. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  344. django_cfg/modules/django_logging/__init__.py +14 -0
  345. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  346. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  347. django_cfg/modules/django_ngrok/__init__.py +39 -0
  348. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  349. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  350. django_cfg/modules/django_rpc_old/README.md +397 -0
  351. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  352. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  353. django_cfg/modules/django_rpc_old/client.py +531 -0
  354. django_cfg/modules/django_rpc_old/config.py +279 -0
  355. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  356. django_cfg/modules/django_tailwind/README.md +478 -0
  357. django_cfg/modules/django_tailwind/__init__.py +7 -0
  358. django_cfg/modules/django_tailwind/apps.py +10 -0
  359. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  360. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  361. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  362. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  363. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  364. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  365. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  366. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  367. django_cfg/modules/django_tasks/__init__.py +29 -0
  368. django_cfg/modules/django_tasks/factory.py +127 -0
  369. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  370. django_cfg/modules/django_tasks/settings.py +107 -0
  371. django_cfg/modules/django_telegram/__init__.py +29 -0
  372. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  373. django_cfg/modules/django_telegram/utils.py +62 -0
  374. django_cfg/modules/django_twilio/__init__.py +54 -107
  375. django_cfg/modules/django_twilio/_imports.py +30 -0
  376. django_cfg/modules/django_twilio/base.py +192 -0
  377. django_cfg/modules/django_twilio/email_otp.py +227 -0
  378. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  379. django_cfg/modules/django_twilio/simple_service.py +1 -2
  380. django_cfg/modules/django_twilio/sms.py +94 -0
  381. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  382. django_cfg/modules/django_twilio/unified.py +310 -0
  383. django_cfg/modules/django_twilio/utils.py +190 -0
  384. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  385. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  386. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  387. django_cfg/modules/django_unfold/dashboard.py +65 -43
  388. django_cfg/modules/django_unfold/models/config.py +13 -12
  389. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  390. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  391. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  392. django_cfg/registry/core.py +24 -26
  393. django_cfg/registry/modules.py +5 -2
  394. django_cfg/registry/services.py +20 -3
  395. django_cfg/registry/third_party.py +8 -8
  396. django_cfg/static/admin/css/dashboard.css +260 -0
  397. django_cfg/static/admin/js/commands.js +171 -0
  398. django_cfg/static/admin/js/dashboard.js +126 -0
  399. django_cfg/templates/admin/components/management_commands.js +375 -0
  400. django_cfg/templates/admin/components/progress_bar.html +18 -23
  401. django_cfg/templates/admin/examples/component_class_example.html +156 -0
  402. django_cfg/templates/admin/index.html +48 -20
  403. django_cfg/templates/admin/index_new.html +106 -0
  404. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  405. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  406. django_cfg/templates/admin/sections/commands_section.html +626 -0
  407. django_cfg/templates/admin/sections/overview_section.html +112 -0
  408. django_cfg/templates/admin/sections/stats_section.html +35 -0
  409. django_cfg/templates/admin/sections/system_section.html +99 -0
  410. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  411. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  412. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  413. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  414. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  415. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  416. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  417. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  418. django_cfg/templatetags/django_cfg.py +7 -1
  419. django_cfg/utils/smart_defaults.py +4 -4
  420. django_cfg-1.4.3.dist-info/METADATA +533 -0
  421. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -195
  422. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  423. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  424. django_cfg/core/generation.py +0 -621
  425. django_cfg/management/commands/validate_config.py +0 -189
  426. django_cfg/models/database.py +0 -480
  427. django_cfg/models/drf.py +0 -272
  428. django_cfg/models/ngrok.py +0 -122
  429. django_cfg/models/services.py +0 -440
  430. django_cfg/models/tasks.py +0 -550
  431. django_cfg/modules/django_twilio/service.py +0 -942
  432. django_cfg/template_archive/django_sample.zip +0 -0
  433. django_cfg/templates/rest_framework/api.html +0 -12
  434. django_cfg/utils/toolkit.py +0 -703
  435. django_cfg-1.3.13.dist-info/METADATA +0 -1029
  436. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  437. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  438. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  439. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  440. /django_cfg/models/{base.py → base/config.py} +0 -0
  441. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  442. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  443. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  444. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/WHEEL +0 -0
  445. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
  446. {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,27 @@
1
+ """
2
+ API configuration models for django_cfg.
3
+
4
+ API, authentication, and documentation configuration.
5
+ """
6
+
7
+ from .config import APIConfig
8
+ from .keys import ApiKeys
9
+ from .jwt import JWTConfig
10
+ from .cors import CORSConfig
11
+ from .limits import LimitsConfig
12
+ from .drf.config import DRFConfig
13
+ from .drf.spectacular import SpectacularConfig
14
+ from .drf.swagger import SwaggerUISettings
15
+ from .drf.redoc import RedocUISettings
16
+
17
+ __all__ = [
18
+ "APIConfig",
19
+ "ApiKeys",
20
+ "JWTConfig",
21
+ "CORSConfig",
22
+ "LimitsConfig",
23
+ "DRFConfig",
24
+ "SpectacularConfig",
25
+ "SwaggerUISettings",
26
+ "RedocUISettings",
27
+ ]
@@ -6,7 +6,7 @@ Django REST Framework and API settings with Pydantic 2.
6
6
 
7
7
  from typing import Dict, Any, List
8
8
  from pydantic import Field, field_validator
9
- from .base import BaseConfig
9
+ from ..base import BaseConfig
10
10
 
11
11
 
12
12
  class APIConfig(BaseConfig):
@@ -0,0 +1,21 @@
1
+ """
2
+ Django REST Framework configuration models.
3
+
4
+ Provides type-safe configuration for DRF and API documentation:
5
+ - DRFConfig: Main DRF configuration
6
+ - SpectacularConfig: OpenAPI/Swagger documentation
7
+ - SwaggerUISettings: Swagger UI settings
8
+ - RedocUISettings: Redoc UI settings
9
+ """
10
+
11
+ from .config import DRFConfig
12
+ from .spectacular import SpectacularConfig
13
+ from .swagger import SwaggerUISettings
14
+ from .redoc import RedocUISettings
15
+
16
+ __all__ = [
17
+ "DRFConfig",
18
+ "SpectacularConfig",
19
+ "SwaggerUISettings",
20
+ "RedocUISettings",
21
+ ]
@@ -0,0 +1,101 @@
1
+ """
2
+ Django REST Framework configuration.
3
+ """
4
+
5
+ from typing import Dict, Any, List
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class DRFConfig(BaseModel):
10
+ """
11
+ 🔧 Django REST Framework Configuration
12
+
13
+ Handles REST Framework settings with sensible defaults.
14
+ """
15
+
16
+ # Authentication
17
+ authentication_classes: List[str] = Field(
18
+ default_factory=lambda: [
19
+ 'rest_framework.authentication.TokenAuthentication',
20
+ 'rest_framework.authentication.SessionAuthentication',
21
+ ],
22
+ description="Default authentication classes"
23
+ )
24
+
25
+ # Permissions
26
+ permission_classes: List[str] = Field(
27
+ default_factory=lambda: [
28
+ 'rest_framework.permissions.IsAuthenticated',
29
+ ],
30
+ description="Default permission classes"
31
+ )
32
+
33
+ # Pagination
34
+ pagination_class: str = Field(
35
+ default='django_cfg.middleware.pagination.DefaultPagination',
36
+ description="Default pagination class"
37
+ )
38
+ page_size: int = Field(default=100, description="Default page size")
39
+
40
+ # Schema
41
+ schema_class: str = Field(
42
+ default='drf_spectacular.openapi.AutoSchema',
43
+ description="Default schema class"
44
+ )
45
+
46
+ # Throttling
47
+ throttle_classes: List[str] = Field(
48
+ default_factory=lambda: [
49
+ 'rest_framework.throttling.AnonRateThrottle',
50
+ 'rest_framework.throttling.UserRateThrottle'
51
+ ],
52
+ description="Default throttle classes"
53
+ )
54
+ throttle_rates: Dict[str, str] = Field(
55
+ default_factory=lambda: {
56
+ 'anon': '200/hour',
57
+ 'user': '2000/hour'
58
+ },
59
+ description="Default throttle rates"
60
+ )
61
+
62
+ # Versioning
63
+ versioning_class: str = Field(
64
+ default='rest_framework.versioning.NamespaceVersioning',
65
+ description="Default versioning class"
66
+ )
67
+ default_version: str = Field(default='v1', description="Default API version")
68
+ allowed_versions: List[str] = Field(
69
+ default_factory=lambda: ['v1'],
70
+ description="Allowed API versions"
71
+ )
72
+
73
+ # Renderers
74
+ renderer_classes: List[str] = Field(
75
+ default_factory=lambda: [
76
+ 'rest_framework.renderers.JSONRenderer',
77
+ 'django_cfg.modules.django_drf_theme.renderers.TailwindBrowsableAPIRenderer',
78
+ ],
79
+ description="Default renderer classes (JSON + Tailwind Browsable API)"
80
+ )
81
+
82
+ def get_rest_framework_settings(self) -> Dict[str, Any]:
83
+ """Get complete REST Framework settings."""
84
+ return {
85
+ 'DEFAULT_AUTHENTICATION_CLASSES': self.authentication_classes,
86
+ 'DEFAULT_PERMISSION_CLASSES': self.permission_classes,
87
+ 'DEFAULT_RENDERER_CLASSES': self.renderer_classes,
88
+ 'DEFAULT_PAGINATION_CLASS': self.pagination_class,
89
+ 'PAGE_SIZE': self.page_size,
90
+ 'DEFAULT_SCHEMA_CLASS': self.schema_class,
91
+ 'DEFAULT_THROTTLE_CLASSES': self.throttle_classes,
92
+ 'DEFAULT_THROTTLE_RATES': self.throttle_rates,
93
+ 'DEFAULT_VERSIONING_CLASS': self.versioning_class,
94
+ 'DEFAULT_VERSION': self.default_version,
95
+ 'ALLOWED_VERSIONS': self.allowed_versions,
96
+ }
97
+
98
+
99
+ __all__ = [
100
+ "DRFConfig",
101
+ ]
@@ -0,0 +1,31 @@
1
+ """
2
+ Redoc UI settings for DRF Spectacular.
3
+ """
4
+
5
+ from typing import Dict, Any
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class RedocUISettings(BaseModel):
10
+ """Redoc UI specific settings."""
11
+
12
+ native_scrollbars: bool = Field(default=True, description="Use native scrollbars")
13
+ theme_color: str = Field(default="#7c3aed", description="Primary theme color")
14
+
15
+ def to_dict(self) -> Dict[str, Any]:
16
+ """Convert to dictionary for Redoc UI."""
17
+ return {
18
+ "nativeScrollbars": self.native_scrollbars,
19
+ "theme": {
20
+ "colors": {
21
+ "primary": {
22
+ "main": self.theme_color
23
+ }
24
+ }
25
+ }
26
+ }
27
+
28
+
29
+ __all__ = [
30
+ "RedocUISettings",
31
+ ]
@@ -0,0 +1,129 @@
1
+ """
2
+ DRF Spectacular configuration for OpenAPI/Swagger documentation.
3
+ """
4
+
5
+ from typing import Dict, Any, Optional, List
6
+ from pydantic import BaseModel, Field
7
+ from .swagger import SwaggerUISettings
8
+ from .redoc import RedocUISettings
9
+
10
+
11
+ class SpectacularConfig(BaseModel):
12
+ """
13
+ 📚 Spectacular Configuration
14
+
15
+ Handles DRF Spectacular settings for OpenAPI/Swagger documentation.
16
+ """
17
+
18
+ # API Information
19
+ title: str = Field(default="API Documentation", description="API title")
20
+ description: str = Field(default="RESTful API with modern architecture", description="API description")
21
+ version: str = Field(default="1.0.0", description="API version")
22
+ terms_of_service: Optional[str] = Field(
23
+ default=None, description="Terms of service URL"
24
+ )
25
+
26
+ # Contact Information
27
+ contact_name: Optional[str] = Field(default=None, description="Contact name")
28
+ contact_email: Optional[str] = Field(default=None, description="Contact email")
29
+ contact_url: Optional[str] = Field(default=None, description="Contact URL")
30
+
31
+ # License Information
32
+ license_name: Optional[str] = Field(default=None, description="License name")
33
+ license_url: Optional[str] = Field(default=None, description="License URL")
34
+
35
+ # Schema Settings
36
+ schema_path_prefix: str = Field(default="/api", description="Schema path prefix")
37
+ serve_include_schema: bool = Field(default=False, description="Include schema in UI")
38
+ component_split_request: bool = Field(default=True, description="Split request components")
39
+ sort_operations: bool = Field(default=False, description="Sort operations")
40
+
41
+ # UI Settings
42
+ swagger_ui_settings: SwaggerUISettings = Field(
43
+ default_factory=SwaggerUISettings, description="Swagger UI settings"
44
+ )
45
+ redoc_ui_settings: RedocUISettings = Field(
46
+ default_factory=RedocUISettings, description="Redoc UI settings"
47
+ )
48
+
49
+ # Post-processing
50
+ postprocessing_hooks: List[str] = Field(
51
+ default_factory=lambda: [
52
+ 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields'
53
+ ],
54
+ description="Post-processing hooks"
55
+ )
56
+
57
+ # NOTE: Enum generation settings are handled by django-revolution
58
+ # Only override if you need different values than Revolution defaults
59
+
60
+ # Enum overrides
61
+ enum_name_overrides: Dict[str, str] = Field(
62
+ default_factory=lambda: {
63
+ 'ValidationErrorEnum': 'django.contrib.auth.models.ValidationError',
64
+ },
65
+ description="Enum name overrides"
66
+ )
67
+
68
+ def get_spectacular_settings(self, project_name: Optional[str] = None) -> Dict[str, Any]:
69
+ """
70
+ Get django-cfg Spectacular extensions.
71
+
72
+ NOTE: This extends Revolution's base settings, not replaces them.
73
+ Only include settings that are unique to django-cfg or critical fixes.
74
+
75
+ Args:
76
+ project_name: Project name from DjangoConfig to use as API title
77
+ """
78
+ settings = {
79
+ # django-cfg specific UI enhancements
80
+ "REDOC_UI_SETTINGS": self.redoc_ui_settings.to_dict(), # Revolution doesn't have custom Redoc settings
81
+
82
+ # django-cfg specific processing extensions
83
+ "ENUM_NAME_OVERRIDES": self.enum_name_overrides, # Custom enum overrides
84
+
85
+ # CRITICAL: Ensure enum generation is always enabled (fix Revolution gaps)
86
+ # These settings ensure proper enum generation even if Revolution config changes
87
+ "GENERATE_ENUM_FROM_CHOICES": True,
88
+ "ENUM_GENERATE_CHOICE_FROM_PATH": True,
89
+ "ENUM_NAME_SUFFIX": "Enum",
90
+ "CAMELIZE_NAMES": False,
91
+ "ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE": False,
92
+ }
93
+
94
+ # Use project_name as API title if provided and title is default
95
+ if project_name and self.title == "API Documentation":
96
+ settings["TITLE"] = f"{project_name} API"
97
+ elif self.title != "API Documentation":
98
+ settings["TITLE"] = self.title
99
+
100
+ # Always set description and version
101
+ settings["DESCRIPTION"] = self.description
102
+ settings["VERSION"] = self.version
103
+
104
+ # Add optional fields if present
105
+ if self.terms_of_service:
106
+ settings["TERMS_OF_SERVICE"] = self.terms_of_service
107
+
108
+ # Contact information
109
+ if any([self.contact_name, self.contact_email, self.contact_url]):
110
+ settings["CONTACT"] = {}
111
+ if self.contact_name:
112
+ settings["CONTACT"]["name"] = self.contact_name
113
+ if self.contact_email:
114
+ settings["CONTACT"]["email"] = self.contact_email
115
+ if self.contact_url:
116
+ settings["CONTACT"]["url"] = self.contact_url
117
+
118
+ # License information
119
+ if self.license_name:
120
+ settings["LICENSE"] = {"name": self.license_name}
121
+ if self.license_url:
122
+ settings["LICENSE"]["url"] = self.license_url
123
+
124
+ return settings
125
+
126
+
127
+ __all__ = [
128
+ "SpectacularConfig",
129
+ ]
@@ -0,0 +1,59 @@
1
+ """
2
+ Swagger UI settings for DRF Spectacular.
3
+ """
4
+
5
+ from typing import Dict, Any
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class SwaggerUISettings(BaseModel):
10
+ """Swagger UI specific settings."""
11
+
12
+ try_it_out_enabled: bool = Field(
13
+ default=True, description="Enable Try It Out feature"
14
+ )
15
+ doc_expansion: str = Field(
16
+ default="list", description="Default expansion setting (list, full, none)"
17
+ )
18
+ deep_linking: bool = Field(default=True, description="Enable deep linking")
19
+ persist_authorization: bool = Field(
20
+ default=True, description="Persist authorization data"
21
+ )
22
+ display_operation_id: bool = Field(
23
+ default=True, description="Display operation IDs"
24
+ )
25
+ default_models_expand_depth: int = Field(
26
+ default=1, description="Default expansion depth for models"
27
+ )
28
+ default_model_expand_depth: int = Field(
29
+ default=1, description="Default expansion depth for model"
30
+ )
31
+ default_model_rendering: str = Field(
32
+ default="model", description="Default model rendering"
33
+ )
34
+ filter: bool = Field(default=True, description="Enable filtering")
35
+ show_extensions: bool = Field(default=False, description="Show extensions")
36
+ show_common_extensions: bool = Field(
37
+ default=True, description="Show common extensions"
38
+ )
39
+
40
+ def to_dict(self) -> Dict[str, Any]:
41
+ """Convert to dictionary for Swagger UI."""
42
+ return {
43
+ "tryItOutEnabled": self.try_it_out_enabled,
44
+ "docExpansion": self.doc_expansion,
45
+ "deepLinking": self.deep_linking,
46
+ "persistAuthorization": self.persist_authorization,
47
+ "displayOperationId": self.display_operation_id,
48
+ "defaultModelsExpandDepth": self.default_models_expand_depth,
49
+ "defaultModelExpandDepth": self.default_model_expand_depth,
50
+ "defaultModelRendering": self.default_model_rendering,
51
+ "filter": self.filter,
52
+ "showExtensions": self.show_extensions,
53
+ "showCommonExtensions": self.show_common_extensions,
54
+ }
55
+
56
+
57
+ __all__ = [
58
+ "SwaggerUISettings",
59
+ ]
@@ -51,14 +51,19 @@ class ApiKeys(BaseModel):
51
51
  """Validate OpenAI API key format."""
52
52
  if v is None:
53
53
  return v
54
-
54
+
55
55
  key_str = v.get_secret_value()
56
+
57
+ # Treat empty string as None
58
+ if not key_str or key_str.strip() == "":
59
+ return None
60
+
56
61
  if not key_str.startswith(("sk-", "sk-proj-")):
57
62
  raise ValueError("OpenAI API key must start with 'sk-' or 'sk-proj-'")
58
-
63
+
59
64
  if len(key_str) < 20:
60
65
  raise ValueError("OpenAI API key appears to be too short")
61
-
66
+
62
67
  return v
63
68
 
64
69
  @field_validator("openrouter")
@@ -67,14 +72,19 @@ class ApiKeys(BaseModel):
67
72
  """Validate OpenRouter API key format."""
68
73
  if v is None:
69
74
  return v
70
-
75
+
71
76
  key_str = v.get_secret_value()
77
+
78
+ # Treat empty string as None
79
+ if not key_str or key_str.strip() == "":
80
+ return None
81
+
72
82
  if not key_str.startswith(("sk-or-", "sk-proj-")):
73
83
  raise ValueError("OpenRouter API key must start with 'sk-or-' or 'sk-proj-'")
74
-
84
+
75
85
  if len(key_str) < 20:
76
86
  raise ValueError("OpenRouter API key appears to be too short")
77
-
87
+
78
88
  return v
79
89
 
80
90
  def get_openai_key(self) -> Optional[str]:
@@ -10,7 +10,6 @@ Following CRITICAL_REQUIREMENTS.md:
10
10
 
11
11
  from typing import Optional, Dict, Any, List
12
12
  from pydantic import BaseModel, Field, field_validator, model_validator
13
- from django_cfg.core.exceptions import ConfigurationError
14
13
 
15
14
 
16
15
  class LimitsConfig(BaseModel):
@@ -0,0 +1,14 @@
1
+ """
2
+ Base configuration models for django_cfg.
3
+
4
+ Provides foundation classes for all configuration models.
5
+ """
6
+
7
+ from .config import BaseConfig, BaseSettings
8
+ from .module import BaseCfgAutoModule
9
+
10
+ __all__ = [
11
+ "BaseConfig",
12
+ "BaseSettings",
13
+ "BaseCfgAutoModule",
14
+ ]
@@ -0,0 +1,16 @@
1
+ """
2
+ Django-specific configuration models for django_cfg.
3
+
4
+ Django integrations and extensions.
5
+ """
6
+
7
+ from .environment import EnvironmentConfig
8
+ from .constance import ConstanceConfig, ConstanceField
9
+ from .revolution import RevolutionConfig
10
+
11
+ __all__ = [
12
+ "EnvironmentConfig",
13
+ "ConstanceConfig",
14
+ "ConstanceField",
15
+ "RevolutionConfig",
16
+ ]
@@ -8,7 +8,7 @@ Unfold admin integration and smart field grouping.
8
8
  from typing import Dict, List, Optional, Any, Union, Literal
9
9
  from pydantic import BaseModel, Field, field_validator
10
10
  import traceback
11
- from django_cfg.models.cfg import BaseCfgAutoModule
11
+ from django_cfg.models.base import BaseCfgAutoModule
12
12
 
13
13
 
14
14
  class ConstanceField(BaseModel):
@@ -8,7 +8,7 @@ import os
8
8
  from pathlib import Path
9
9
  from typing import List, Dict, Any
10
10
  from pydantic import Field, field_validator, computed_field
11
- from .base import BaseConfig
11
+ from ..base import BaseConfig
12
12
 
13
13
 
14
14
  class EnvironmentConfig(BaseConfig):
@@ -0,0 +1,17 @@
1
+ """
2
+ Infrastructure configuration models for django_cfg.
3
+
4
+ Core infrastructure components: database, cache, logging, security.
5
+ """
6
+
7
+ from .database import DatabaseConfig
8
+ from .cache import CacheConfig
9
+ from .logging import LoggingConfig
10
+ from .security import SecurityConfig
11
+
12
+ __all__ = [
13
+ "DatabaseConfig",
14
+ "CacheConfig",
15
+ "LoggingConfig",
16
+ "SecurityConfig",
17
+ ]
@@ -12,8 +12,6 @@ from typing import Dict, Optional, Any, Literal, Union
12
12
  from pydantic import BaseModel, Field, field_validator, model_validator
13
13
  from urllib.parse import urlparse
14
14
 
15
- from django_cfg.core.exceptions import CacheError, ValidationError
16
-
17
15
 
18
16
  class CacheConfig(BaseModel):
19
17
  """
@@ -237,6 +235,9 @@ class CacheConfig(BaseModel):
237
235
  Raises:
238
236
  CacheError: If configuration cannot be converted
239
237
  """
238
+ # Import here to avoid circular dependency
239
+ from django_cfg.core.exceptions import CacheError
240
+
240
241
  try:
241
242
  backend = self.get_backend_type(environment, debug)
242
243
 
@@ -0,0 +1,22 @@
1
+ """
2
+ Database configuration for django_cfg.
3
+
4
+ Provides type-safe database configuration with:
5
+ - Connection string parsing
6
+ - Field validation
7
+ - Django settings conversion
8
+ - Database routing
9
+
10
+ Organized into focused modules:
11
+ - config.py - Main DatabaseConfig class
12
+ - validators.py - Field validators
13
+ - parsers.py - Connection string parsers
14
+ - converters.py - Django settings converters
15
+ - routing.py - Database routing utilities
16
+ """
17
+
18
+ from .config import DatabaseConfig
19
+
20
+ __all__ = [
21
+ "DatabaseConfig",
22
+ ]