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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  3. django_cfg/apps/accounts/serializers/profile.py +1 -1
  4. django_cfg/apps/accounts/services/otp_service.py +18 -11
  5. django_cfg/apps/accounts/signals.py +15 -24
  6. django_cfg/apps/accounts/utils/notifications.py +217 -358
  7. django_cfg/apps/accounts/views/otp.py +2 -2
  8. django_cfg/apps/accounts/views/webhook.py +1 -1
  9. django_cfg/apps/agents/core/django_agent.py +1 -1
  10. django_cfg/apps/api/commands/views.py +66 -83
  11. django_cfg/apps/api/health/drf_views.py +269 -0
  12. django_cfg/apps/api/health/serializers.py +45 -0
  13. django_cfg/apps/api/health/urls.py +6 -1
  14. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  15. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  16. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  17. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  18. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  19. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  20. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  21. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  22. django_cfg/apps/knowbase/config/settings.py +2 -2
  23. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  24. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  25. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  26. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  27. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  28. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  29. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  30. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  31. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  32. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  33. django_cfg/apps/knowbase/mixins/service.py +2 -2
  34. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  35. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  40. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  46. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  47. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  48. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  49. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  50. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  51. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  52. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  53. django_cfg/apps/leads/tests.py +1 -1
  54. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  55. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  56. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  57. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  58. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  59. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  60. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  61. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  66. django_cfg/apps/payments/apps.py +1 -1
  67. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  68. django_cfg/apps/payments/config/helpers.py +3 -2
  69. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  70. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  71. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  73. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  74. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  75. django_cfg/apps/payments/middleware/api_access.py +1 -1
  76. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  77. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  78. django_cfg/apps/payments/models/balance.py +2 -2
  79. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  80. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  84. django_cfg/apps/payments/models/payments.py +2 -2
  85. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  86. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  87. django_cfg/apps/payments/services/core/base.py +1 -1
  88. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  89. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  90. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  91. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  92. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  93. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  94. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  95. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  96. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  97. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  98. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  99. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  100. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  101. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  102. django_cfg/apps/payments/services/providers/base.py +1 -1
  103. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  104. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  111. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  112. django_cfg/apps/payments/services/providers/registry.py +1 -1
  113. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  114. django_cfg/apps/payments/signals/__init__.py +1 -1
  115. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  116. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  117. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  118. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  119. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  120. django_cfg/apps/payments/views/api/balances.py +1 -1
  121. django_cfg/apps/payments/views/api/base.py +1 -1
  122. django_cfg/apps/payments/views/api/currencies.py +1 -1
  123. django_cfg/apps/payments/views/api/payments.py +1 -1
  124. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  125. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  126. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  127. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  128. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  129. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  130. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  131. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  132. django_cfg/apps/support/admin/support_admin.py +21 -13
  133. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  134. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  135. django_cfg/apps/support/utils/support_email_service.py +1 -1
  136. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  137. django_cfg/apps/tasks/utils/simulator.py +1 -1
  138. django_cfg/apps/tasks/views/dashboard.py +33 -3
  139. django_cfg/apps/urls.py +5 -1
  140. django_cfg/cli/README.md +57 -471
  141. django_cfg/cli/commands/create_project.py +140 -529
  142. django_cfg/cli/main.py +13 -10
  143. django_cfg/core/__init__.py +63 -6
  144. django_cfg/core/base/__init__.py +5 -0
  145. django_cfg/core/base/config_model.py +652 -0
  146. django_cfg/core/builders/__init__.py +11 -0
  147. django_cfg/core/builders/apps_builder.py +258 -0
  148. django_cfg/core/builders/middleware_builder.py +115 -0
  149. django_cfg/core/builders/security_builder.py +96 -0
  150. django_cfg/core/config.py +20 -892
  151. django_cfg/core/constants.py +69 -0
  152. django_cfg/core/environment/__init__.py +9 -0
  153. django_cfg/core/exceptions.py +45 -298
  154. django_cfg/core/generation/__init__.py +51 -0
  155. django_cfg/core/generation/core_generators/__init__.py +0 -0
  156. django_cfg/core/generation/core_generators/settings.py +90 -0
  157. django_cfg/core/generation/core_generators/static.py +82 -0
  158. django_cfg/core/generation/core_generators/templates.py +141 -0
  159. django_cfg/core/generation/data_generators/__init__.py +15 -0
  160. django_cfg/core/generation/data_generators/cache.py +132 -0
  161. django_cfg/core/generation/data_generators/database.py +117 -0
  162. django_cfg/core/generation/generation.py +92 -0
  163. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  164. django_cfg/core/generation/integration_generators/api.py +237 -0
  165. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  166. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  167. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  168. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  169. django_cfg/core/generation/orchestrator.py +285 -0
  170. django_cfg/core/generation/protocols.py +30 -0
  171. django_cfg/core/generation/security_generators/__init__.py +0 -0
  172. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  173. django_cfg/core/generation/utility_generators/email.py +58 -0
  174. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  175. django_cfg/core/generation/utility_generators/limits.py +58 -0
  176. django_cfg/core/generation/utility_generators/logging.py +66 -0
  177. django_cfg/core/generation/utility_generators/security.py +101 -0
  178. django_cfg/core/generation/utils/__init__.py +0 -0
  179. django_cfg/core/generation/utils/helpers.py +32 -0
  180. django_cfg/core/integration/__init__.py +18 -25
  181. django_cfg/core/integration/display/startup.py +146 -133
  182. django_cfg/core/integration/url_integration.py +13 -2
  183. django_cfg/core/services/__init__.py +5 -0
  184. django_cfg/core/services/config_service.py +121 -0
  185. django_cfg/core/state/__init__.py +9 -0
  186. django_cfg/core/state/registry.py +84 -0
  187. django_cfg/core/types/__init__.py +15 -0
  188. django_cfg/core/types/aliases.py +15 -0
  189. django_cfg/core/types/enums.py +49 -0
  190. django_cfg/dashboard/DEBUG_README.md +105 -0
  191. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  192. django_cfg/dashboard/__init__.py +24 -0
  193. django_cfg/dashboard/components.py +308 -0
  194. django_cfg/dashboard/debug.py +176 -0
  195. django_cfg/dashboard/management/__init__.py +0 -0
  196. django_cfg/dashboard/management/commands/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  198. django_cfg/dashboard/sections/__init__.py +1 -0
  199. django_cfg/dashboard/sections/base.py +128 -0
  200. django_cfg/dashboard/sections/commands.py +32 -0
  201. django_cfg/dashboard/sections/overview.py +394 -0
  202. django_cfg/dashboard/sections/stats.py +48 -0
  203. django_cfg/dashboard/sections/system.py +73 -0
  204. django_cfg/management/commands/check_settings.py +6 -2
  205. django_cfg/management/commands/clear_constance.py +6 -1
  206. django_cfg/management/commands/create_token.py +5 -4
  207. django_cfg/management/commands/generate.py +5 -0
  208. django_cfg/management/commands/list_urls.py +7 -2
  209. django_cfg/management/commands/migrate_all.py +6 -2
  210. django_cfg/management/commands/migrator.py +6 -1
  211. django_cfg/management/commands/rundramatiq.py +6 -1
  212. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  213. django_cfg/management/commands/runserver_ngrok.py +9 -7
  214. django_cfg/management/commands/script.py +25 -21
  215. django_cfg/management/commands/show_config.py +6 -1
  216. django_cfg/management/commands/show_urls.py +8 -3
  217. django_cfg/management/commands/superuser.py +5 -4
  218. django_cfg/management/commands/task_clear.py +8 -3
  219. django_cfg/management/commands/task_status.py +8 -3
  220. django_cfg/management/commands/test_email.py +6 -1
  221. django_cfg/management/commands/test_telegram.py +6 -1
  222. django_cfg/management/commands/test_twilio.py +6 -1
  223. django_cfg/management/commands/tree.py +7 -4
  224. django_cfg/models/__init__.py +88 -3
  225. django_cfg/models/api/__init__.py +27 -0
  226. django_cfg/models/{api.py → api/config.py} +1 -1
  227. django_cfg/models/api/drf/__init__.py +21 -0
  228. django_cfg/models/api/drf/config.py +101 -0
  229. django_cfg/models/api/drf/redoc.py +31 -0
  230. django_cfg/models/api/drf/spectacular.py +129 -0
  231. django_cfg/models/api/drf/swagger.py +59 -0
  232. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  233. django_cfg/models/{limits.py → api/limits.py} +0 -1
  234. django_cfg/models/base/__init__.py +14 -0
  235. django_cfg/models/django/__init__.py +16 -0
  236. django_cfg/models/{constance.py → django/constance.py} +1 -1
  237. django_cfg/models/{environment.py → django/environment.py} +1 -1
  238. django_cfg/models/infrastructure/__init__.py +17 -0
  239. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  240. django_cfg/models/infrastructure/database/__init__.py +22 -0
  241. django_cfg/models/infrastructure/database/config.py +265 -0
  242. django_cfg/models/infrastructure/database/converters.py +91 -0
  243. django_cfg/models/infrastructure/database/parsers.py +96 -0
  244. django_cfg/models/infrastructure/database/routing.py +85 -0
  245. django_cfg/models/infrastructure/database/validators.py +170 -0
  246. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  247. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  248. django_cfg/models/ngrok/__init__.py +11 -0
  249. django_cfg/models/ngrok/auth.py +37 -0
  250. django_cfg/models/ngrok/config.py +77 -0
  251. django_cfg/models/ngrok/tunnel.py +35 -0
  252. django_cfg/models/payments/__init__.py +20 -0
  253. django_cfg/models/payments/api_keys.py +57 -0
  254. django_cfg/models/{payments.py → payments/config.py} +56 -154
  255. django_cfg/models/payments/providers/__init__.py +15 -0
  256. django_cfg/models/payments/providers/base.py +25 -0
  257. django_cfg/models/payments/providers/nowpayments.py +48 -0
  258. django_cfg/models/services/__init__.py +18 -0
  259. django_cfg/models/services/base.py +65 -0
  260. django_cfg/models/{email.py → services/email.py} +1 -1
  261. django_cfg/models/services/telegram.py +172 -0
  262. django_cfg/models/tasks/__init__.py +51 -0
  263. django_cfg/models/tasks/backends.py +250 -0
  264. django_cfg/models/tasks/config.py +314 -0
  265. django_cfg/models/tasks/utils.py +174 -0
  266. django_cfg/modules/base.py +18 -3
  267. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  268. django_cfg/modules/django_admin/decorators/display.py +1 -1
  269. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  270. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  271. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  272. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  273. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  274. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  285. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  286. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  287. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  288. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  289. django_cfg/modules/django_drf_theme/README.md +207 -0
  290. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  291. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  292. django_cfg/modules/django_drf_theme/apps.py +15 -0
  293. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  294. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  298. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  299. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  300. django_cfg/modules/django_email/__init__.py +14 -0
  301. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  302. django_cfg/modules/django_email/utils.py +40 -0
  303. django_cfg/modules/django_health/__init__.py +9 -0
  304. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  305. django_cfg/modules/django_llm/llm/client.py +155 -550
  306. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  307. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  308. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  309. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  310. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  311. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  312. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  313. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  315. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  316. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  317. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  318. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  319. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  320. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  321. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  322. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  323. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  324. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  325. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  326. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  327. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  328. django_cfg/modules/django_llm/translator/translator.py +150 -603
  329. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  330. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  331. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  332. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  333. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  334. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  335. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  336. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  337. django_cfg/modules/django_logging/__init__.py +14 -0
  338. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  339. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  340. django_cfg/modules/django_ngrok/__init__.py +39 -0
  341. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  342. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  343. django_cfg/modules/django_rpc_old/README.md +397 -0
  344. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  345. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  346. django_cfg/modules/django_rpc_old/client.py +531 -0
  347. django_cfg/modules/django_rpc_old/config.py +279 -0
  348. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  349. django_cfg/modules/django_tailwind/README.md +478 -0
  350. django_cfg/modules/django_tailwind/__init__.py +7 -0
  351. django_cfg/modules/django_tailwind/apps.py +10 -0
  352. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  358. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  359. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  360. django_cfg/modules/django_tasks/__init__.py +29 -0
  361. django_cfg/modules/django_tasks/factory.py +127 -0
  362. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  363. django_cfg/modules/django_tasks/settings.py +107 -0
  364. django_cfg/modules/django_telegram/__init__.py +29 -0
  365. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  366. django_cfg/modules/django_telegram/utils.py +62 -0
  367. django_cfg/modules/django_twilio/__init__.py +54 -107
  368. django_cfg/modules/django_twilio/_imports.py +30 -0
  369. django_cfg/modules/django_twilio/base.py +192 -0
  370. django_cfg/modules/django_twilio/email_otp.py +227 -0
  371. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  372. django_cfg/modules/django_twilio/simple_service.py +1 -2
  373. django_cfg/modules/django_twilio/sms.py +94 -0
  374. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  375. django_cfg/modules/django_twilio/unified.py +310 -0
  376. django_cfg/modules/django_twilio/utils.py +190 -0
  377. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  378. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  379. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  380. django_cfg/modules/django_unfold/dashboard.py +65 -43
  381. django_cfg/modules/django_unfold/models/config.py +13 -12
  382. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  383. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  384. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  385. django_cfg/registry/core.py +24 -26
  386. django_cfg/registry/modules.py +5 -2
  387. django_cfg/registry/services.py +20 -3
  388. django_cfg/registry/third_party.py +8 -8
  389. django_cfg/static/admin/css/dashboard.css +260 -0
  390. django_cfg/static/admin/js/commands.js +171 -0
  391. django_cfg/static/admin/js/dashboard.js +126 -0
  392. django_cfg/templates/admin/components/management_commands.js +375 -0
  393. django_cfg/templates/admin/components/progress_bar.html +18 -23
  394. django_cfg/templates/admin/index.html +48 -20
  395. django_cfg/templates/admin/index_new.html +106 -0
  396. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  397. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  398. django_cfg/templates/admin/sections/commands_section.html +626 -0
  399. django_cfg/templates/admin/sections/overview_section.html +112 -0
  400. django_cfg/templates/admin/sections/stats_section.html +35 -0
  401. django_cfg/templates/admin/sections/system_section.html +99 -0
  402. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  403. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  404. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  405. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  406. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  407. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  408. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  409. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  410. django_cfg/templatetags/django_cfg.py +7 -1
  411. django_cfg/utils/smart_defaults.py +4 -4
  412. django_cfg-1.4.0.dist-info/METADATA +920 -0
  413. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
  414. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  415. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  416. django_cfg/core/generation.py +0 -621
  417. django_cfg/management/commands/validate_config.py +0 -189
  418. django_cfg/models/database.py +0 -480
  419. django_cfg/models/drf.py +0 -272
  420. django_cfg/models/ngrok.py +0 -122
  421. django_cfg/models/services.py +0 -440
  422. django_cfg/models/tasks.py +0 -550
  423. django_cfg/modules/django_twilio/service.py +0 -942
  424. django_cfg/template_archive/django_sample.zip +0 -0
  425. django_cfg/templates/rest_framework/api.html +0 -12
  426. django_cfg/utils/toolkit.py +0 -703
  427. django_cfg-1.3.13.dist-info/METADATA +0 -1029
  428. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  429. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  430. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  431. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  432. /django_cfg/models/{base.py → base/config.py} +0 -0
  433. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  434. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  435. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  436. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  437. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  438. {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,237 @@
1
+ """
2
+ API frameworks generator.
3
+
4
+ Handles JWT, DRF, Spectacular, and Django Revolution configuration.
5
+ Size: ~250 lines (focused on API frameworks)
6
+ """
7
+
8
+ from typing import Dict, Any, TYPE_CHECKING
9
+ import logging
10
+
11
+ if TYPE_CHECKING:
12
+ from ...base.config_model import DjangoConfig
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class APIFrameworksGenerator:
18
+ """
19
+ Generates API framework settings.
20
+
21
+ Responsibilities:
22
+ - JWT authentication configuration
23
+ - Django Revolution framework
24
+ - Django REST Framework (DRF)
25
+ - DRF Spectacular (OpenAPI/Swagger)
26
+ - Auto-configuration and extensions
27
+
28
+ Example:
29
+ ```python
30
+ generator = APIFrameworksGenerator(config)
31
+ settings = generator.generate()
32
+ ```
33
+ """
34
+
35
+ def __init__(self, config: "DjangoConfig"):
36
+ """
37
+ Initialize generator with configuration.
38
+
39
+ Args:
40
+ config: DjangoConfig instance
41
+ """
42
+ self.config = config
43
+
44
+ def generate(self) -> Dict[str, Any]:
45
+ """
46
+ Generate API framework settings.
47
+
48
+ Returns:
49
+ Dictionary with API configurations
50
+
51
+ Example:
52
+ >>> generator = APIFrameworksGenerator(config)
53
+ >>> settings = generator.generate()
54
+ """
55
+ settings = {}
56
+
57
+ # Generate settings for each API framework
58
+ settings.update(self._generate_jwt_settings())
59
+ settings.update(self._generate_revolution_settings())
60
+ settings.update(self._apply_drf_spectacular_extensions())
61
+
62
+ return settings
63
+
64
+ def _generate_jwt_settings(self) -> Dict[str, Any]:
65
+ """
66
+ Generate JWT authentication settings.
67
+
68
+ Returns:
69
+ Dictionary with JWT configuration
70
+ """
71
+ if not hasattr(self.config, "jwt") or not self.config.jwt:
72
+ return {}
73
+
74
+ jwt_settings = self.config.jwt.to_django_settings(self.config.secret_key)
75
+ return jwt_settings
76
+
77
+ def _generate_revolution_settings(self) -> Dict[str, Any]:
78
+ """
79
+ Generate Django Revolution framework settings.
80
+
81
+ Returns:
82
+ Dictionary with Revolution and auto-generated DRF configuration
83
+ """
84
+ if not hasattr(self.config, "revolution") or not self.config.revolution:
85
+ return {}
86
+
87
+ settings = {}
88
+
89
+ # Revolution configuration
90
+ revolution_settings = {
91
+ "DJANGO_REVOLUTION": {
92
+ "api_prefix": self.config.revolution.api_prefix,
93
+ "debug": getattr(self.config.revolution, "debug", self.config.debug),
94
+ "auto_install_deps": getattr(self.config.revolution, "auto_install_deps", True),
95
+ "zones": {
96
+ zone_name: zone_config.model_dump()
97
+ for zone_name, zone_config in self.config.revolution.get_zones_with_defaults().items()
98
+ },
99
+ }
100
+ }
101
+ settings.update(revolution_settings)
102
+
103
+ # Auto-generate DRF configuration using Revolution's core_config
104
+ drf_settings = self._generate_drf_from_revolution()
105
+ if drf_settings:
106
+ settings.update(drf_settings)
107
+
108
+ return settings
109
+
110
+ def _generate_drf_from_revolution(self) -> Dict[str, Any]:
111
+ """
112
+ Generate DRF + Spectacular settings from Revolution config.
113
+
114
+ Returns:
115
+ Dictionary with DRF and Spectacular configuration
116
+ """
117
+ try:
118
+ from django_revolution import create_drf_spectacular_config
119
+
120
+ # Extract DRF parameters from RevolutionConfig
121
+ drf_kwargs = {
122
+ "title": getattr(self.config.revolution, "drf_title", "API"),
123
+ "description": getattr(self.config.revolution, "drf_description", "RESTful API"),
124
+ "version": getattr(self.config.revolution, "drf_version", "1.0.0"),
125
+ "schema_path_prefix": f"/{self.config.revolution.api_prefix}/",
126
+ "enable_browsable_api": getattr(self.config.revolution, "drf_enable_browsable_api", False),
127
+ "enable_throttling": getattr(self.config.revolution, "drf_enable_throttling", False),
128
+ }
129
+
130
+ # Create DRF + Spectacular config with Revolution's comprehensive settings
131
+ drf_settings = create_drf_spectacular_config(**drf_kwargs)
132
+
133
+ logger.info("🚀 Generated DRF + Spectacular settings using Revolution's create_drf_spectacular_config")
134
+
135
+ return drf_settings
136
+
137
+ except ImportError as e:
138
+ logger.warning(f"Could not import django_revolution.create_drf_spectacular_config: {e}")
139
+ return {}
140
+ except Exception as e:
141
+ logger.warning(f"Could not generate DRF config from Revolution: {e}")
142
+ return {}
143
+
144
+ def _apply_drf_spectacular_extensions(self) -> Dict[str, Any]:
145
+ """
146
+ Apply django-cfg DRF and Spectacular extensions.
147
+
148
+ This method extends existing DRF/Spectacular settings or creates them if they don't exist.
149
+
150
+ Returns:
151
+ Dictionary with extended DRF and Spectacular configuration
152
+ """
153
+ settings = {}
154
+
155
+ try:
156
+ # Apply Spectacular extensions
157
+ spectacular_settings = self._apply_spectacular_extensions()
158
+ if spectacular_settings:
159
+ settings.update(spectacular_settings)
160
+
161
+ # Apply DRF extensions
162
+ drf_settings = self._apply_drf_extensions()
163
+ if drf_settings:
164
+ settings.update(drf_settings)
165
+
166
+ except Exception as e:
167
+ logger.warning(f"Could not apply DRF/Spectacular extensions from django-cfg: {e}")
168
+
169
+ return settings
170
+
171
+ def _apply_spectacular_extensions(self) -> Dict[str, Any]:
172
+ """
173
+ Apply Spectacular settings extensions.
174
+
175
+ Returns:
176
+ Dictionary with Spectacular settings
177
+ """
178
+ # Check if Spectacular settings exist (from Revolution or elsewhere)
179
+ if not hasattr(self, '_has_spectacular_settings'):
180
+ return {}
181
+
182
+ settings = {"SPECTACULAR_SETTINGS": {}}
183
+
184
+ if self.config.spectacular:
185
+ # User provided explicit spectacular config
186
+ spectacular_extensions = self.config.spectacular.get_spectacular_settings(
187
+ project_name=self.config.project_name
188
+ )
189
+ settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
190
+ logger.info("🔧 Extended SPECTACULAR_SETTINGS with django-cfg Spectacular config")
191
+ else:
192
+ # Auto-create minimal spectacular config to set project name
193
+ from django_cfg.models.api.drf import SpectacularConfig
194
+
195
+ auto_spectacular = SpectacularConfig()
196
+ spectacular_extensions = auto_spectacular.get_spectacular_settings(
197
+ project_name=self.config.project_name
198
+ )
199
+ settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
200
+ logger.info(f"🚀 Auto-configured API title as '{self.config.project_name} API'")
201
+
202
+ return settings
203
+
204
+ def _apply_drf_extensions(self) -> Dict[str, Any]:
205
+ """
206
+ Apply DRF settings extensions.
207
+
208
+ Returns:
209
+ Dictionary with DRF settings
210
+ """
211
+ settings = {}
212
+
213
+ if self.config.drf:
214
+ # User provided explicit DRF config
215
+ drf_extensions = self.config.drf.get_rest_framework_settings()
216
+ settings["REST_FRAMEWORK"] = drf_extensions
217
+ logger.info("🔧 Extended REST_FRAMEWORK settings with django-cfg DRF config")
218
+ else:
219
+ # Auto-create minimal DRF config to set default pagination
220
+ from django_cfg.models.api.drf import DRFConfig
221
+
222
+ auto_drf = DRFConfig()
223
+ drf_extensions = auto_drf.get_rest_framework_settings()
224
+
225
+ # Only apply pagination settings
226
+ pagination_settings = {
227
+ 'DEFAULT_PAGINATION_CLASS': drf_extensions['DEFAULT_PAGINATION_CLASS'],
228
+ 'PAGE_SIZE': drf_extensions['PAGE_SIZE'],
229
+ }
230
+ settings["REST_FRAMEWORK"] = pagination_settings
231
+
232
+ logger.info(f"🚀 Auto-configured default pagination: {drf_extensions['DEFAULT_PAGINATION_CLASS']}")
233
+
234
+ return settings
235
+
236
+
237
+ __all__ = ["APIFrameworksGenerator"]
@@ -0,0 +1,65 @@
1
+ """
2
+ Session settings generator.
3
+
4
+ Handles Django session configuration.
5
+ Size: ~60 lines (focused on session settings)
6
+ """
7
+
8
+ from typing import Dict, Any, TYPE_CHECKING
9
+
10
+ if TYPE_CHECKING:
11
+ from ...base.config_model import DjangoConfig
12
+
13
+
14
+ class SessionSettingsGenerator:
15
+ """
16
+ Generates Django session settings.
17
+
18
+ Responsibilities:
19
+ - Configure session backend (database/cache)
20
+ - Set session cookie parameters
21
+ - Session timeout and security
22
+
23
+ Example:
24
+ ```python
25
+ generator = SessionSettingsGenerator(config)
26
+ settings = generator.generate()
27
+ ```
28
+ """
29
+
30
+ def __init__(self, config: "DjangoConfig"):
31
+ """
32
+ Initialize generator with configuration.
33
+
34
+ Args:
35
+ config: DjangoConfig instance
36
+ """
37
+ self.config = config
38
+
39
+ def generate(self) -> Dict[str, Any]:
40
+ """
41
+ Generate session settings.
42
+
43
+ Returns:
44
+ Dictionary with session configuration
45
+
46
+ Example:
47
+ >>> generator = SessionSettingsGenerator(config)
48
+ >>> settings = generator.generate()
49
+ >>> "SESSION_ENGINE" in settings
50
+ True
51
+ """
52
+ # Default session configuration - use database for persistence
53
+ settings = {
54
+ "SESSION_ENGINE": "django.contrib.sessions.backends.db",
55
+ "SESSION_COOKIE_AGE": 86400 * 7, # 7 days
56
+ "SESSION_SAVE_EVERY_REQUEST": True,
57
+ }
58
+
59
+ # Note: If cache_sessions is configured, CacheSettingsGenerator will override
60
+ # SESSION_ENGINE to use cache backend
61
+
62
+ return settings
63
+
64
+
65
+ __all__ = ["SessionSettingsGenerator"]
@@ -0,0 +1,54 @@
1
+ """
2
+ Tailwind CSS settings generator for django-cfg.
3
+
4
+ Generates Django settings for django-tailwind integration.
5
+ """
6
+
7
+ from typing import Dict, Any, TYPE_CHECKING
8
+
9
+ if TYPE_CHECKING:
10
+ from django_cfg.core.base.config_model import DjangoConfig
11
+
12
+
13
+ class TailwindSettingsGenerator:
14
+ """
15
+ Generates Django settings for Tailwind CSS integration.
16
+
17
+ Responsibilities:
18
+ - Add Tailwind-specific Django settings
19
+ - Configure TAILWIND_APP_NAME
20
+
21
+ Example:
22
+ ```python
23
+ generator = TailwindSettingsGenerator(config)
24
+ settings = generator.generate()
25
+ ```
26
+ """
27
+
28
+ def __init__(self, config: "DjangoConfig"):
29
+ """
30
+ Initialize generator with configuration.
31
+
32
+ Args:
33
+ config: DjangoConfig instance
34
+ """
35
+ self.config = config
36
+
37
+ def generate(self) -> Dict[str, Any]:
38
+ """
39
+ Generate Tailwind CSS settings.
40
+
41
+ Returns:
42
+ Dictionary with Tailwind-specific settings
43
+ """
44
+ settings = {}
45
+
46
+ # Tailwind is always enabled - add app name setting
47
+ settings["TAILWIND_APP_NAME"] = self.config.tailwind_app_name
48
+
49
+ return settings
50
+
51
+
52
+ __all__ = [
53
+ "TailwindSettingsGenerator",
54
+ ]
@@ -0,0 +1,92 @@
1
+ """
2
+ Background tasks generator.
3
+
4
+ Handles Dramatiq task queue configuration.
5
+ Size: ~100 lines (focused on task processing)
6
+ """
7
+
8
+ from typing import Dict, Any, TYPE_CHECKING
9
+ import logging
10
+
11
+ if TYPE_CHECKING:
12
+ from ...base.config_model import DjangoConfig
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class TasksSettingsGenerator:
18
+ """
19
+ Generates background task processing settings.
20
+
21
+ Responsibilities:
22
+ - Configure Dramatiq task queue
23
+ - Auto-detect if tasks should be enabled
24
+ - Set up task configuration
25
+
26
+ Example:
27
+ ```python
28
+ generator = TasksSettingsGenerator(config)
29
+ settings = generator.generate()
30
+ ```
31
+ """
32
+
33
+ def __init__(self, config: "DjangoConfig"):
34
+ """
35
+ Initialize generator with configuration.
36
+
37
+ Args:
38
+ config: DjangoConfig instance
39
+ """
40
+ self.config = config
41
+
42
+ def generate(self) -> Dict[str, Any]:
43
+ """
44
+ Generate task processing settings.
45
+
46
+ Returns:
47
+ Dictionary with Dramatiq configuration
48
+
49
+ Example:
50
+ >>> generator = TasksSettingsGenerator(config)
51
+ >>> settings = generator.generate()
52
+ """
53
+ # Check if tasks should be enabled
54
+ if not self.config.should_enable_tasks():
55
+ logger.debug("⏭️ Dramatiq disabled (no tasks/knowbase/agents)")
56
+ return {}
57
+
58
+ try:
59
+ return self._generate_dramatiq_settings()
60
+ except ImportError as e:
61
+ logger.warning(f"Failed to import django_tasks module: {e}")
62
+ return {}
63
+ except Exception as e:
64
+ logger.error(f"Failed to generate Dramatiq settings: {e}")
65
+ return {}
66
+
67
+ def _generate_dramatiq_settings(self) -> Dict[str, Any]:
68
+ """
69
+ Generate Dramatiq-specific settings.
70
+
71
+ Returns:
72
+ Dictionary with Dramatiq configuration
73
+ """
74
+ from django_cfg.models.tasks import TaskConfig
75
+ from django_cfg.modules.django_tasks import generate_dramatiq_settings_from_config
76
+
77
+ # Auto-initialize TaskConfig if needed
78
+ task_config = TaskConfig.auto_initialize_if_needed()
79
+ if task_config is None:
80
+ return {}
81
+
82
+ # Generate Dramatiq settings
83
+ dramatiq_settings = generate_dramatiq_settings_from_config()
84
+ if not dramatiq_settings:
85
+ return {}
86
+
87
+ logger.info("✅ Dramatiq enabled (tasks/knowbase/agents required)")
88
+
89
+ return dramatiq_settings
90
+
91
+
92
+ __all__ = ["TasksSettingsGenerator"]
@@ -0,0 +1,144 @@
1
+ """
2
+ Third-party integrations generator.
3
+
4
+ Handles external service integrations like Telegram, Unfold, Constance.
5
+ Size: ~150 lines (focused on third-party services)
6
+ """
7
+
8
+ from typing import Dict, Any, List, TYPE_CHECKING
9
+ import logging
10
+
11
+ if TYPE_CHECKING:
12
+ from ...base.config_model import DjangoConfig
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class ThirdPartyIntegrationsGenerator:
18
+ """
19
+ Generates third-party integration settings.
20
+
21
+ Responsibilities:
22
+ - Telegram bot configuration
23
+ - Unfold admin theme
24
+ - Constance dynamic settings
25
+ - Track enabled integrations
26
+
27
+ Example:
28
+ ```python
29
+ generator = ThirdPartyIntegrationsGenerator(config)
30
+ settings = generator.generate()
31
+ ```
32
+ """
33
+
34
+ def __init__(self, config: "DjangoConfig"):
35
+ """
36
+ Initialize generator with configuration.
37
+
38
+ Args:
39
+ config: DjangoConfig instance
40
+ """
41
+ self.config = config
42
+ self.integrations: List[str] = []
43
+
44
+ def generate(self) -> Dict[str, Any]:
45
+ """
46
+ Generate third-party integration settings.
47
+
48
+ Returns:
49
+ Dictionary with integration configurations
50
+
51
+ Example:
52
+ >>> generator = ThirdPartyIntegrationsGenerator(config)
53
+ >>> settings = generator.generate()
54
+ >>> "DJANGO_CFG_INTEGRATIONS" in settings
55
+ True
56
+ """
57
+ settings = {}
58
+
59
+ # Generate settings for each integration
60
+ settings.update(self._generate_telegram_settings())
61
+ settings.update(self._generate_unfold_settings())
62
+ settings.update(self._generate_constance_settings())
63
+ settings.update(self._generate_rpc_settings())
64
+
65
+ # Track enabled integrations
66
+ if self.integrations:
67
+ settings["DJANGO_CFG_INTEGRATIONS"] = self.integrations
68
+
69
+ return settings
70
+
71
+ def _generate_telegram_settings(self) -> Dict[str, Any]:
72
+ """
73
+ Generate Telegram bot settings.
74
+
75
+ Returns:
76
+ Dictionary with Telegram configuration
77
+ """
78
+ if not self.config.telegram:
79
+ return {}
80
+
81
+ telegram_settings = self.config.telegram.to_config_dict()
82
+ self.integrations.append("telegram")
83
+
84
+ return {"TELEGRAM_CONFIG": telegram_settings}
85
+
86
+ def _generate_unfold_settings(self) -> Dict[str, Any]:
87
+ """
88
+ Generate Unfold admin theme settings.
89
+
90
+ Returns:
91
+ Dictionary with Unfold configuration
92
+ """
93
+ if not self.config.unfold:
94
+ return {}
95
+
96
+ unfold_settings = self.config.unfold.to_django_settings()
97
+ self.integrations.append("unfold")
98
+
99
+ return unfold_settings
100
+
101
+ def _generate_constance_settings(self) -> Dict[str, Any]:
102
+ """
103
+ Generate Constance dynamic settings configuration.
104
+
105
+ Returns:
106
+ Dictionary with Constance configuration
107
+ """
108
+ if not hasattr(self.config, "constance") or not self.config.constance:
109
+ return {}
110
+
111
+ # Set config reference for app fields detection
112
+ self.config.constance.set_config(self.config)
113
+
114
+ constance_settings = self.config.constance.to_django_settings()
115
+ self.integrations.append("constance")
116
+
117
+ return constance_settings
118
+
119
+ def _generate_rpc_settings(self) -> Dict[str, Any]:
120
+ """
121
+ Generate RPC Client settings.
122
+
123
+ Returns:
124
+ Dictionary with RPC configuration
125
+ """
126
+ if not hasattr(self.config, "django_cfg_rpc") or not self.config.django_cfg_rpc:
127
+ return {}
128
+
129
+ rpc_settings = self.config.django_cfg_rpc.to_django_settings()
130
+ self.integrations.append("django_cfg_rpc")
131
+
132
+ return rpc_settings
133
+
134
+ def get_enabled_integrations(self) -> List[str]:
135
+ """
136
+ Get list of enabled integrations.
137
+
138
+ Returns:
139
+ List of integration names
140
+ """
141
+ return self.integrations
142
+
143
+
144
+ __all__ = ["ThirdPartyIntegrationsGenerator"]