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,107 @@
1
+ """
2
+ Dramatiq settings generation.
3
+
4
+ Functions to generate Dramatiq settings from DjangoConfig.
5
+ """
6
+
7
+ from typing import Optional, Dict, Any
8
+ import logging
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ def generate_dramatiq_settings_from_config(config=None) -> Optional[Dict[str, Any]]:
14
+ """
15
+ Generate Dramatiq settings from DjangoConfig instance.
16
+
17
+ Args:
18
+ config: DjangoConfig instance (optional, will auto-discover if not provided)
19
+
20
+ Returns:
21
+ Dict[str, Any]: Dramatiq settings dictionary or None if not enabled
22
+ """
23
+ # If config provided, use it directly
24
+ if config is not None:
25
+ try:
26
+ if not hasattr(config, "tasks") or not config.tasks or not config.tasks.enabled:
27
+ return None
28
+
29
+ # Get Redis URL from cache configuration
30
+ redis_url = None
31
+ if config.cache_default and hasattr(config.cache_default, 'redis_url'):
32
+ redis_url = config.cache_default.redis_url
33
+ elif config.cache_default and hasattr(config.cache_default, 'location'):
34
+ redis_url = config.cache_default.location
35
+ else:
36
+ redis_url = "redis://localhost:6379"
37
+
38
+ if redis_url:
39
+ dramatiq_settings = config.tasks.get_dramatiq_settings(redis_url)
40
+ logger.debug(f"Generated Dramatiq settings with Redis URL: {redis_url}")
41
+ return dramatiq_settings
42
+ else:
43
+ logger.warning("Tasks enabled but no Redis URL available for Dramatiq")
44
+ return None
45
+
46
+ except Exception as e:
47
+ logger.error(f"Failed to generate Dramatiq settings: {e}")
48
+ return None
49
+
50
+ # Auto-discover config if not provided
51
+ try:
52
+ from ..base import BaseCfgModule
53
+
54
+ base_module = BaseCfgModule()
55
+ config = base_module.get_config()
56
+
57
+ if not config or not hasattr(config, 'tasks') or not config.tasks or not config.tasks.enabled:
58
+ return None
59
+
60
+ # Get Redis URL from cache config or environment
61
+ redis_url = None
62
+ if hasattr(config, 'cache_default') and config.cache_default:
63
+ redis_url = getattr(config.cache_default, 'redis_url', None)
64
+
65
+ if not redis_url:
66
+ # Fallback to environment or default
67
+ import os
68
+ redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379/1')
69
+
70
+ # Generate Dramatiq settings
71
+ dramatiq_settings = config.tasks.get_dramatiq_settings(redis_url)
72
+
73
+ # Ensure we only use Redis broker (no RabbitMQ)
74
+ if 'DRAMATIQ_BROKER' in dramatiq_settings:
75
+ dramatiq_settings['DRAMATIQ_BROKER']['BROKER'] = 'dramatiq.brokers.redis.RedisBroker'
76
+
77
+ logger.info(f"✅ Generated Dramatiq settings with Redis broker and {len(config.tasks.dramatiq.queues)} queues")
78
+ return dramatiq_settings
79
+
80
+ except Exception as e:
81
+ logger.error(f"Failed to generate Dramatiq settings: {e}")
82
+ return None
83
+
84
+
85
+ def extend_constance_config_with_tasks():
86
+ """Extend Constance configuration with Dramatiq task fields if tasks are enabled."""
87
+ try:
88
+ from .factory import get_task_service
89
+
90
+ service = get_task_service()
91
+ if not service.is_enabled():
92
+ logger.debug("Task system not enabled, skipping Constance extension")
93
+ return []
94
+
95
+ fields = service.get_constance_fields()
96
+ logger.info(f"🔧 Extended Constance with {len(fields)} task configuration fields")
97
+ return fields
98
+
99
+ except Exception as e:
100
+ logger.error(f"Failed to extend Constance config with tasks: {e}")
101
+ return []
102
+
103
+
104
+ __all__ = [
105
+ "generate_dramatiq_settings_from_config",
106
+ "extend_constance_config_with_tasks",
107
+ ]
@@ -0,0 +1,29 @@
1
+ """
2
+ Django Telegram Service for django_cfg.
3
+
4
+ Auto-configuring Telegram notification service that integrates with DjangoConfig.
5
+ """
6
+
7
+ from .service import (
8
+ TelegramParseMode,
9
+ TelegramError,
10
+ TelegramConfigError,
11
+ TelegramSendError,
12
+ DjangoTelegram,
13
+ )
14
+ from .utils import (
15
+ send_telegram_message,
16
+ send_telegram_photo,
17
+ send_telegram_document,
18
+ )
19
+
20
+ __all__ = [
21
+ "TelegramParseMode",
22
+ "TelegramError",
23
+ "TelegramConfigError",
24
+ "TelegramSendError",
25
+ "DjangoTelegram",
26
+ "send_telegram_message",
27
+ "send_telegram_photo",
28
+ "send_telegram_document",
29
+ ]
@@ -5,11 +5,10 @@ Auto-configuring Telegram notification service that integrates with DjangoConfig
5
5
  """
6
6
 
7
7
  import logging
8
- import time
9
- from typing import Optional, Dict, Any, Union, List, BinaryIO
8
+ from typing import Optional, Dict, Any, Union, BinaryIO
10
9
  from enum import Enum
11
10
  import yaml
12
- from django_cfg.modules import BaseCfgModule
11
+ from ..base import BaseCfgModule
13
12
  from django_cfg.core.exceptions import ConfigurationError
14
13
  import telebot
15
14
 
@@ -26,19 +25,16 @@ class TelegramParseMode(Enum):
26
25
 
27
26
  class TelegramError(Exception):
28
27
  """Base exception for Telegram-related errors."""
29
-
30
28
  pass
31
29
 
32
30
 
33
31
  class TelegramConfigError(TelegramError):
34
32
  """Raised when configuration is missing or invalid."""
35
-
36
33
  pass
37
34
 
38
35
 
39
36
  class TelegramSendError(TelegramError):
40
37
  """Raised when message sending fails."""
41
-
42
38
  pass
43
39
 
44
40
 
@@ -91,7 +87,6 @@ class DjangoTelegram(BaseCfgModule):
91
87
 
92
88
  if self._bot is None:
93
89
  try:
94
-
95
90
  telegram_config = self.config.telegram
96
91
  self._bot = telebot.TeleBot(telegram_config.bot_token)
97
92
  except ImportError:
@@ -116,7 +111,7 @@ class DjangoTelegram(BaseCfgModule):
116
111
  "configured": True,
117
112
  "bot_token": f"{telegram_config.bot_token[:10]}..." if telegram_config.bot_token else "Not set",
118
113
  "chat_id": telegram_config.chat_id or "Not set",
119
- "enabled": True, # Always enabled if configured
114
+ "enabled": True,
120
115
  "parse_mode": telegram_config.parse_mode or "None",
121
116
  }
122
117
 
@@ -152,8 +147,6 @@ class DjangoTelegram(BaseCfgModule):
152
147
  return False
153
148
 
154
149
  telegram_config = self.config.telegram
155
-
156
- # Use provided chat_id or fall back to config
157
150
  target_chat_id = chat_id or telegram_config.chat_id
158
151
  if not target_chat_id:
159
152
  error_msg = "No chat_id provided and none configured"
@@ -162,20 +155,17 @@ class DjangoTelegram(BaseCfgModule):
162
155
  raise TelegramConfigError(error_msg)
163
156
  return False
164
157
 
165
- # Use provided parse_mode or fall back to config
166
158
  target_parse_mode = parse_mode or telegram_config.parse_mode
167
-
159
+
168
160
  # Handle both enum and string parse modes
169
161
  if target_parse_mode:
170
162
  if isinstance(target_parse_mode, TelegramParseMode):
171
163
  parse_mode_str = target_parse_mode.value
172
164
  else:
173
- # If it's already a string from config, use it directly
174
165
  parse_mode_str = target_parse_mode
175
166
  else:
176
167
  parse_mode_str = None
177
168
 
178
- # Send message
179
169
  self.bot.send_message(
180
170
  chat_id=target_chat_id,
181
171
  text=message,
@@ -234,13 +224,12 @@ class DjangoTelegram(BaseCfgModule):
234
224
  return False
235
225
 
236
226
  target_parse_mode = parse_mode or telegram_config.parse_mode
237
-
227
+
238
228
  # Handle both enum and string parse modes
239
229
  if target_parse_mode:
240
230
  if isinstance(target_parse_mode, TelegramParseMode):
241
231
  parse_mode_str = target_parse_mode.value
242
232
  else:
243
- # If it's already a string from config, use it directly
244
233
  parse_mode_str = target_parse_mode
245
234
  else:
246
235
  parse_mode_str = None
@@ -302,13 +291,12 @@ class DjangoTelegram(BaseCfgModule):
302
291
  return False
303
292
 
304
293
  target_parse_mode = parse_mode or telegram_config.parse_mode
305
-
294
+
306
295
  # Handle both enum and string parse modes
307
296
  if target_parse_mode:
308
297
  if isinstance(target_parse_mode, TelegramParseMode):
309
298
  parse_mode_str = target_parse_mode.value
310
299
  else:
311
- # If it's already a string from config, use it directly
312
300
  parse_mode_str = target_parse_mode
313
301
  else:
314
302
  parse_mode_str = None
@@ -360,8 +348,6 @@ class DjangoTelegram(BaseCfgModule):
360
348
  def _format_to_yaml(cls, data: Dict[str, Any]) -> str:
361
349
  """Format dictionary data as YAML string."""
362
350
  try:
363
- import yaml
364
-
365
351
  yaml_str = yaml.safe_dump(
366
352
  data,
367
353
  default_flow_style=False,
@@ -372,59 +358,50 @@ class DjangoTelegram(BaseCfgModule):
372
358
  return yaml_str
373
359
  except Exception as e:
374
360
  logger.error(f"Error formatting to YAML: {str(e)}")
375
- # Final fallback to string representation
376
361
  return str(data)
377
362
 
378
363
  @classmethod
379
364
  def send_error(cls, error: str, context: Optional[Dict[str, Any]] = None) -> None:
380
- """Send error notification.
381
-
382
- Args:
383
- error: Error message
384
- context: Optional context data
385
- """
386
- telegram = cls()
387
- text = f"{cls.EMOJI_MAP['error']} <b>Error</b>\n\n{error}"
388
- if context:
389
- text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
390
- telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
365
+ """Send error notification."""
366
+ try:
367
+ telegram = cls()
368
+ text = f"{cls.EMOJI_MAP['error']} <b>Error</b>\n\n{error}"
369
+ if context:
370
+ text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
371
+ telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
372
+ except Exception:
373
+ # Silently fail - error notifications should not cause cascading failures
374
+ pass
391
375
 
392
376
  @classmethod
393
377
  def send_success(cls, message: str, details: Optional[Dict[str, Any]] = None) -> None:
394
- """Send success notification.
395
-
396
- Args:
397
- message: Success message
398
- details: Optional details
399
- """
400
- telegram = cls()
401
- text = f"{cls.EMOJI_MAP['success']} <b>Success</b>\n\n{message}"
402
- if details:
403
- text += "\n\n<pre>" + cls._format_to_yaml(details) + "</pre>"
404
- telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
378
+ """Send success notification."""
379
+ try:
380
+ telegram = cls()
381
+ text = f"{cls.EMOJI_MAP['success']} <b>Success</b>\n\n{message}"
382
+ if details:
383
+ text += "\n\n<pre>" + cls._format_to_yaml(details) + "</pre>"
384
+ telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
385
+ except Exception:
386
+ # Silently fail - success notifications should not cause failures
387
+ pass
405
388
 
406
389
  @classmethod
407
390
  def send_warning(cls, warning: str, context: Optional[Dict[str, Any]] = None) -> None:
408
- """Send warning notification.
409
-
410
- Args:
411
- warning: Warning message
412
- context: Optional context data
413
- """
414
- telegram = cls()
415
- text = f"{cls.EMOJI_MAP['warning']} <b>Warning</b>\n\n{warning}"
416
- if context:
417
- text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
418
- telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
391
+ """Send warning notification."""
392
+ try:
393
+ telegram = cls()
394
+ text = f"{cls.EMOJI_MAP['warning']} <b>Warning</b>\n\n{warning}"
395
+ if context:
396
+ text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
397
+ telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
398
+ except Exception:
399
+ # Silently fail - warning notifications should not cause failures
400
+ pass
419
401
 
420
402
  @classmethod
421
403
  def send_info(cls, message: str, data: Optional[Dict[str, Any]] = None) -> None:
422
- """Send informational message.
423
-
424
- Args:
425
- message: Info message
426
- data: Optional data
427
- """
404
+ """Send informational message."""
428
405
  telegram = cls()
429
406
  text = f"{cls.EMOJI_MAP['info']} <b>Info</b>\n\n{message}"
430
407
  if data:
@@ -433,62 +410,17 @@ class DjangoTelegram(BaseCfgModule):
433
410
 
434
411
  @classmethod
435
412
  def send_stats(cls, title: str, stats: Dict[str, Any]) -> None:
436
- """Send statistics data.
437
-
438
- Args:
439
- title: Stats title
440
- stats: Statistics data
441
- """
413
+ """Send statistics data."""
442
414
  telegram = cls()
443
415
  text = f"{cls.EMOJI_MAP['stats']} <b>{title}</b>"
444
416
  text += "\n\n<pre>" + cls._format_to_yaml(stats) + "</pre>"
445
417
  telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
446
418
 
447
419
 
448
- # Convenience functions for direct usage
449
- def send_telegram_message(
450
- message: str,
451
- chat_id: Optional[Union[int, str]] = None,
452
- parse_mode: Optional[TelegramParseMode] = None,
453
- fail_silently: bool = False,
454
- ) -> bool:
455
- """Send a Telegram message using auto-configured service."""
456
- telegram = DjangoTelegram()
457
- return telegram.send_message(
458
- message=message,
459
- chat_id=chat_id,
460
- parse_mode=parse_mode,
461
- fail_silently=fail_silently,
462
- )
463
-
464
-
465
- def send_telegram_photo(
466
- photo: Union[str, BinaryIO],
467
- caption: Optional[str] = None,
468
- chat_id: Optional[Union[int, str]] = None,
469
- fail_silently: bool = False,
470
- ) -> bool:
471
- """Send a Telegram photo using auto-configured service."""
472
- telegram = DjangoTelegram()
473
- return telegram.send_photo(
474
- photo=photo,
475
- caption=caption,
476
- chat_id=chat_id,
477
- fail_silently=fail_silently,
478
- )
479
-
480
-
481
- def send_telegram_document(
482
- document: Union[str, BinaryIO],
483
- caption: Optional[str] = None,
484
- chat_id: Optional[Union[int, str]] = None,
485
- fail_silently: bool = False,
486
- ) -> bool:
487
- """Send a Telegram document using auto-configured service."""
488
- telegram = DjangoTelegram()
489
- return telegram.send_document(
490
- document=document,
491
- caption=caption,
492
- chat_id=chat_id,
493
- fail_silently=fail_silently,
494
- )
420
+ __all__ = [
421
+ "TelegramParseMode",
422
+ "TelegramError",
423
+ "TelegramConfigError",
424
+ "TelegramSendError",
425
+ "DjangoTelegram",
426
+ ]
@@ -0,0 +1,62 @@
1
+ """
2
+ Telegram utilities and convenience functions.
3
+ """
4
+
5
+ from typing import Optional, Union, BinaryIO
6
+
7
+ from .service import DjangoTelegram, TelegramParseMode
8
+
9
+
10
+ def send_telegram_message(
11
+ message: str,
12
+ chat_id: Optional[Union[int, str]] = None,
13
+ parse_mode: Optional[TelegramParseMode] = None,
14
+ fail_silently: bool = False,
15
+ ) -> bool:
16
+ """Send a Telegram message using auto-configured service."""
17
+ telegram = DjangoTelegram()
18
+ return telegram.send_message(
19
+ message=message,
20
+ chat_id=chat_id,
21
+ parse_mode=parse_mode,
22
+ fail_silently=fail_silently,
23
+ )
24
+
25
+
26
+ def send_telegram_photo(
27
+ photo: Union[str, BinaryIO],
28
+ caption: Optional[str] = None,
29
+ chat_id: Optional[Union[int, str]] = None,
30
+ fail_silently: bool = False,
31
+ ) -> bool:
32
+ """Send a Telegram photo using auto-configured service."""
33
+ telegram = DjangoTelegram()
34
+ return telegram.send_photo(
35
+ photo=photo,
36
+ caption=caption,
37
+ chat_id=chat_id,
38
+ fail_silently=fail_silently,
39
+ )
40
+
41
+
42
+ def send_telegram_document(
43
+ document: Union[str, BinaryIO],
44
+ caption: Optional[str] = None,
45
+ chat_id: Optional[Union[int, str]] = None,
46
+ fail_silently: bool = False,
47
+ ) -> bool:
48
+ """Send a Telegram document using auto-configured service."""
49
+ telegram = DjangoTelegram()
50
+ return telegram.send_document(
51
+ document=document,
52
+ caption=caption,
53
+ chat_id=chat_id,
54
+ fail_silently=fail_silently,
55
+ )
56
+
57
+
58
+ __all__ = [
59
+ "send_telegram_message",
60
+ "send_telegram_photo",
61
+ "send_telegram_document",
62
+ ]
@@ -13,134 +13,81 @@ Features:
13
13
  - Type-safe configuration with Pydantic v2
14
14
  """
15
15
 
16
- from typing import TYPE_CHECKING
16
+ # Configuration
17
+ from django_cfg.modules.django_twilio.models import TwilioConfig
17
18
 
18
- if TYPE_CHECKING:
19
- from django_cfg.modules.django_twilio.models import TwilioConfig
20
- from django_cfg.modules.django_twilio.service import (
21
- DjangoTwilioService,
22
- WhatsAppOTPService,
23
- EmailOTPService,
24
- SMSOTPService,
25
- UnifiedOTPService,
26
- )
27
- from django_cfg.modules.django_twilio.simple_service import SimpleTwilioService
28
- from django_cfg.modules.django_twilio.exceptions import (
29
- TwilioError,
30
- TwilioConfigurationError,
31
- TwilioVerificationError,
32
- TwilioSendError,
33
- )
19
+ # Services
20
+ from django_cfg.modules.django_twilio.base import BaseTwilioService, is_async_context
21
+ from django_cfg.modules.django_twilio.whatsapp import WhatsAppOTPService
22
+ from django_cfg.modules.django_twilio.email_otp import EmailOTPService
23
+ from django_cfg.modules.django_twilio.sms import SMSOTPService
24
+ from django_cfg.modules.django_twilio.unified import UnifiedOTPService, DjangoTwilioService
34
25
 
26
+ # Simple messaging service
27
+ from django_cfg.modules.django_twilio.simple_service import SimpleTwilioService
35
28
 
36
- def __getattr__(name: str):
37
- """Lazy import mechanism for Twilio module components."""
38
-
39
- # Configuration model
40
- if name == "TwilioConfig":
41
- from django_cfg.modules.django_twilio.models import TwilioConfig
42
- return TwilioConfig
43
-
44
- # Main service
45
- elif name == "DjangoTwilioService":
46
- from django_cfg.modules.django_twilio.service import DjangoTwilioService
47
- return DjangoTwilioService
48
-
49
- # Simple service
50
- elif name == "SimpleTwilioService":
51
- from django_cfg.modules.django_twilio.simple_service import SimpleTwilioService
52
- return SimpleTwilioService
53
-
54
- # Specialized services
55
- elif name == "WhatsAppOTPService":
56
- from django_cfg.modules.django_twilio.service import WhatsAppOTPService
57
- return WhatsAppOTPService
58
-
59
- elif name == "EmailOTPService":
60
- from django_cfg.modules.django_twilio.service import EmailOTPService
61
- return EmailOTPService
62
-
63
- elif name == "SMSOTPService":
64
- from django_cfg.modules.django_twilio.service import SMSOTPService
65
- return SMSOTPService
66
-
67
- elif name == "UnifiedOTPService":
68
- from django_cfg.modules.django_twilio.service import UnifiedOTPService
69
- return UnifiedOTPService
70
-
71
- # Exceptions
72
- elif name == "TwilioError":
73
- from django_cfg.modules.django_twilio.exceptions import TwilioError
74
- return TwilioError
75
-
76
- elif name == "TwilioConfigurationError":
77
- from django_cfg.modules.django_twilio.exceptions import TwilioConfigurationError
78
- return TwilioConfigurationError
79
-
80
- elif name == "TwilioVerificationError":
81
- from django_cfg.modules.django_twilio.exceptions import TwilioVerificationError
82
- return TwilioVerificationError
83
-
84
- elif name == "TwilioSendError":
85
- from django_cfg.modules.django_twilio.exceptions import TwilioSendError
86
- return TwilioSendError
87
-
88
- # Convenience functions
89
- elif name == "send_whatsapp_otp":
90
- from django_cfg.modules.django_twilio.service import send_whatsapp_otp
91
- return send_whatsapp_otp
92
-
93
- elif name == "send_email_otp":
94
- from django_cfg.modules.django_twilio.service import send_email_otp
95
- return send_email_otp
96
-
97
- elif name == "send_sms_otp":
98
- from django_cfg.modules.django_twilio.service import send_sms_otp
99
- return send_sms_otp
100
-
101
- elif name == "verify_otp":
102
- from django_cfg.modules.django_twilio.service import verify_otp
103
- return verify_otp
104
-
105
- # Simple service convenience functions
106
- elif name == "send_whatsapp":
107
- from django_cfg.modules.django_twilio.simple_service import send_whatsapp
108
- return send_whatsapp
109
-
110
- elif name == "send_sms":
111
- from django_cfg.modules.django_twilio.simple_service import send_sms
112
- return send_sms
113
-
114
- else:
115
- raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
29
+ # Exceptions
30
+ from django_cfg.modules.django_twilio.exceptions import (
31
+ TwilioError,
32
+ TwilioConfigurationError,
33
+ TwilioVerificationError,
34
+ TwilioSendError,
35
+ )
36
+
37
+ # Convenience functions
38
+ from django_cfg.modules.django_twilio.utils import (
39
+ send_whatsapp_otp,
40
+ send_email_otp,
41
+ send_sms_otp,
42
+ verify_otp,
43
+ asend_whatsapp_otp,
44
+ asend_email_otp,
45
+ asend_sms_otp,
46
+ averify_otp,
47
+ )
48
+
49
+ # Simple messaging convenience functions
50
+ try:
51
+ from django_cfg.modules.django_twilio.simple_service import send_whatsapp, send_sms
52
+ except ImportError:
53
+ send_whatsapp = None
54
+ send_sms = None
116
55
 
117
56
 
118
57
  # Public API
119
58
  __all__ = [
120
59
  # Configuration
121
60
  "TwilioConfig",
122
-
61
+
123
62
  # Services
124
63
  "DjangoTwilioService",
125
64
  "SimpleTwilioService",
126
- "WhatsAppOTPService",
65
+ "WhatsAppOTPService",
127
66
  "EmailOTPService",
128
67
  "SMSOTPService",
129
68
  "UnifiedOTPService",
130
-
69
+ "BaseTwilioService",
70
+
131
71
  # Exceptions
132
72
  "TwilioError",
133
- "TwilioConfigurationError",
73
+ "TwilioConfigurationError",
134
74
  "TwilioVerificationError",
135
75
  "TwilioSendError",
136
-
76
+
137
77
  # OTP functions
138
78
  "send_whatsapp_otp",
139
- "send_email_otp",
79
+ "send_email_otp",
140
80
  "send_sms_otp",
141
81
  "verify_otp",
142
-
143
- # Simple messaging functions
144
- "send_whatsapp",
145
- "send_sms",
82
+ "asend_whatsapp_otp",
83
+ "asend_email_otp",
84
+ "asend_sms_otp",
85
+ "averify_otp",
86
+
87
+ # Utility functions
88
+ "is_async_context",
146
89
  ]
90
+
91
+ # Add simple messaging if available
92
+ if send_whatsapp is not None:
93
+ __all__.extend(["send_whatsapp", "send_sms"])