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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/inlines.py +11 -5
  3. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  4. django_cfg/apps/accounts/serializers/profile.py +1 -1
  5. django_cfg/apps/accounts/services/otp_service.py +18 -11
  6. django_cfg/apps/accounts/signals.py +15 -24
  7. django_cfg/apps/accounts/utils/notifications.py +217 -358
  8. django_cfg/apps/accounts/views/otp.py +2 -2
  9. django_cfg/apps/accounts/views/webhook.py +1 -1
  10. django_cfg/apps/agents/core/django_agent.py +1 -1
  11. django_cfg/apps/api/commands/views.py +66 -83
  12. django_cfg/apps/api/health/drf_views.py +269 -0
  13. django_cfg/apps/api/health/serializers.py +45 -0
  14. django_cfg/apps/api/health/urls.py +6 -1
  15. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  16. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  17. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  18. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  19. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  20. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  21. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  22. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  23. django_cfg/apps/knowbase/config/settings.py +2 -2
  24. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  25. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  26. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  27. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  28. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  29. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  30. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  31. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  32. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  33. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  34. django_cfg/apps/knowbase/mixins/service.py +2 -2
  35. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  47. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  48. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  49. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  50. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  51. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  52. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  53. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  54. django_cfg/apps/leads/tests.py +1 -1
  55. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  56. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  57. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  58. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  59. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  60. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  61. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  67. django_cfg/apps/payments/apps.py +1 -1
  68. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  69. django_cfg/apps/payments/config/helpers.py +3 -2
  70. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  71. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  73. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  74. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  75. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  76. django_cfg/apps/payments/middleware/api_access.py +1 -1
  77. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  78. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  79. django_cfg/apps/payments/models/balance.py +2 -2
  80. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  84. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  85. django_cfg/apps/payments/models/payments.py +2 -2
  86. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  87. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  88. django_cfg/apps/payments/services/core/base.py +1 -1
  89. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  90. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  91. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  92. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  93. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  94. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  95. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  96. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  97. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  98. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  99. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  100. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  101. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  102. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  103. django_cfg/apps/payments/services/providers/base.py +1 -1
  104. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  112. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  113. django_cfg/apps/payments/services/providers/registry.py +1 -1
  114. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  115. django_cfg/apps/payments/signals/__init__.py +1 -1
  116. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  117. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  118. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  119. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  120. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  121. django_cfg/apps/payments/views/api/balances.py +1 -1
  122. django_cfg/apps/payments/views/api/base.py +1 -1
  123. django_cfg/apps/payments/views/api/currencies.py +1 -1
  124. django_cfg/apps/payments/views/api/payments.py +1 -1
  125. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  126. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  127. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  128. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  129. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  130. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  131. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  132. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  133. django_cfg/apps/support/admin/support_admin.py +21 -13
  134. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  135. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  136. django_cfg/apps/support/utils/support_email_service.py +1 -1
  137. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  138. django_cfg/apps/tasks/utils/simulator.py +1 -1
  139. django_cfg/apps/tasks/views/dashboard.py +33 -3
  140. django_cfg/apps/urls.py +5 -1
  141. django_cfg/cli/README.md +57 -471
  142. django_cfg/cli/commands/create_project.py +140 -529
  143. django_cfg/cli/main.py +13 -10
  144. django_cfg/core/__init__.py +63 -6
  145. django_cfg/core/base/__init__.py +5 -0
  146. django_cfg/core/base/config_model.py +652 -0
  147. django_cfg/core/builders/__init__.py +11 -0
  148. django_cfg/core/builders/apps_builder.py +258 -0
  149. django_cfg/core/builders/middleware_builder.py +115 -0
  150. django_cfg/core/builders/security_builder.py +96 -0
  151. django_cfg/core/config.py +20 -892
  152. django_cfg/core/constants.py +69 -0
  153. django_cfg/core/environment/__init__.py +9 -0
  154. django_cfg/core/exceptions.py +45 -298
  155. django_cfg/core/generation/__init__.py +51 -0
  156. django_cfg/core/generation/core_generators/__init__.py +0 -0
  157. django_cfg/core/generation/core_generators/settings.py +90 -0
  158. django_cfg/core/generation/core_generators/static.py +82 -0
  159. django_cfg/core/generation/core_generators/templates.py +141 -0
  160. django_cfg/core/generation/data_generators/__init__.py +15 -0
  161. django_cfg/core/generation/data_generators/cache.py +132 -0
  162. django_cfg/core/generation/data_generators/database.py +117 -0
  163. django_cfg/core/generation/generation.py +92 -0
  164. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  165. django_cfg/core/generation/integration_generators/api.py +237 -0
  166. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  167. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  168. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  169. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  170. django_cfg/core/generation/orchestrator.py +285 -0
  171. django_cfg/core/generation/protocols.py +30 -0
  172. django_cfg/core/generation/security_generators/__init__.py +0 -0
  173. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  174. django_cfg/core/generation/utility_generators/email.py +58 -0
  175. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  176. django_cfg/core/generation/utility_generators/limits.py +58 -0
  177. django_cfg/core/generation/utility_generators/logging.py +66 -0
  178. django_cfg/core/generation/utility_generators/security.py +101 -0
  179. django_cfg/core/generation/utils/__init__.py +0 -0
  180. django_cfg/core/generation/utils/helpers.py +32 -0
  181. django_cfg/core/integration/__init__.py +18 -25
  182. django_cfg/core/integration/display/startup.py +146 -133
  183. django_cfg/core/integration/url_integration.py +13 -2
  184. django_cfg/core/services/__init__.py +5 -0
  185. django_cfg/core/services/config_service.py +121 -0
  186. django_cfg/core/state/__init__.py +9 -0
  187. django_cfg/core/state/registry.py +84 -0
  188. django_cfg/core/types/__init__.py +15 -0
  189. django_cfg/core/types/aliases.py +15 -0
  190. django_cfg/core/types/enums.py +49 -0
  191. django_cfg/dashboard/DEBUG_README.md +105 -0
  192. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  193. django_cfg/dashboard/__init__.py +24 -0
  194. django_cfg/dashboard/components.py +308 -0
  195. django_cfg/dashboard/debug.py +176 -0
  196. django_cfg/dashboard/management/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/__init__.py +0 -0
  198. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  199. django_cfg/dashboard/sections/__init__.py +1 -0
  200. django_cfg/dashboard/sections/base.py +128 -0
  201. django_cfg/dashboard/sections/commands.py +32 -0
  202. django_cfg/dashboard/sections/overview.py +394 -0
  203. django_cfg/dashboard/sections/stats.py +48 -0
  204. django_cfg/dashboard/sections/system.py +73 -0
  205. django_cfg/management/commands/check_settings.py +6 -2
  206. django_cfg/management/commands/clear_constance.py +6 -1
  207. django_cfg/management/commands/create_token.py +5 -4
  208. django_cfg/management/commands/generate.py +5 -0
  209. django_cfg/management/commands/list_urls.py +7 -2
  210. django_cfg/management/commands/migrate_all.py +6 -2
  211. django_cfg/management/commands/migrator.py +6 -1
  212. django_cfg/management/commands/rundramatiq.py +6 -1
  213. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  214. django_cfg/management/commands/runserver_ngrok.py +9 -7
  215. django_cfg/management/commands/script.py +25 -21
  216. django_cfg/management/commands/show_config.py +6 -1
  217. django_cfg/management/commands/show_urls.py +8 -3
  218. django_cfg/management/commands/superuser.py +5 -4
  219. django_cfg/management/commands/task_clear.py +8 -3
  220. django_cfg/management/commands/task_status.py +8 -3
  221. django_cfg/management/commands/test_email.py +6 -1
  222. django_cfg/management/commands/test_telegram.py +6 -1
  223. django_cfg/management/commands/test_twilio.py +6 -1
  224. django_cfg/management/commands/tree.py +7 -4
  225. django_cfg/models/__init__.py +88 -3
  226. django_cfg/models/api/__init__.py +27 -0
  227. django_cfg/models/{api.py → api/config.py} +1 -1
  228. django_cfg/models/api/drf/__init__.py +21 -0
  229. django_cfg/models/api/drf/config.py +101 -0
  230. django_cfg/models/api/drf/redoc.py +31 -0
  231. django_cfg/models/api/drf/spectacular.py +129 -0
  232. django_cfg/models/api/drf/swagger.py +59 -0
  233. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  234. django_cfg/models/{limits.py → api/limits.py} +0 -1
  235. django_cfg/models/base/__init__.py +14 -0
  236. django_cfg/models/django/__init__.py +16 -0
  237. django_cfg/models/{constance.py → django/constance.py} +1 -1
  238. django_cfg/models/{environment.py → django/environment.py} +1 -1
  239. django_cfg/models/infrastructure/__init__.py +17 -0
  240. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  241. django_cfg/models/infrastructure/database/__init__.py +22 -0
  242. django_cfg/models/infrastructure/database/config.py +265 -0
  243. django_cfg/models/infrastructure/database/converters.py +91 -0
  244. django_cfg/models/infrastructure/database/parsers.py +96 -0
  245. django_cfg/models/infrastructure/database/routing.py +85 -0
  246. django_cfg/models/infrastructure/database/validators.py +170 -0
  247. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  248. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  249. django_cfg/models/ngrok/__init__.py +11 -0
  250. django_cfg/models/ngrok/auth.py +37 -0
  251. django_cfg/models/ngrok/config.py +77 -0
  252. django_cfg/models/ngrok/tunnel.py +35 -0
  253. django_cfg/models/payments/__init__.py +20 -0
  254. django_cfg/models/payments/api_keys.py +57 -0
  255. django_cfg/models/{payments.py → payments/config.py} +56 -154
  256. django_cfg/models/payments/providers/__init__.py +15 -0
  257. django_cfg/models/payments/providers/base.py +25 -0
  258. django_cfg/models/payments/providers/nowpayments.py +48 -0
  259. django_cfg/models/services/__init__.py +18 -0
  260. django_cfg/models/services/base.py +65 -0
  261. django_cfg/models/{email.py → services/email.py} +1 -1
  262. django_cfg/models/services/telegram.py +172 -0
  263. django_cfg/models/tasks/__init__.py +51 -0
  264. django_cfg/models/tasks/backends.py +250 -0
  265. django_cfg/models/tasks/config.py +314 -0
  266. django_cfg/models/tasks/utils.py +174 -0
  267. django_cfg/modules/base.py +18 -3
  268. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  269. django_cfg/modules/django_admin/decorators/display.py +1 -1
  270. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  271. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  272. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  273. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  274. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  285. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  286. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  287. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  288. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  289. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  290. django_cfg/modules/django_drf_theme/README.md +207 -0
  291. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  292. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  293. django_cfg/modules/django_drf_theme/apps.py +15 -0
  294. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  298. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  299. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  300. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  301. django_cfg/modules/django_email/__init__.py +14 -0
  302. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  303. django_cfg/modules/django_email/utils.py +40 -0
  304. django_cfg/modules/django_health/__init__.py +9 -0
  305. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  306. django_cfg/modules/django_llm/llm/client.py +155 -550
  307. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  308. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  309. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  310. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  311. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  312. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  313. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  315. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  316. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  317. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  318. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  319. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  320. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  321. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  322. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  323. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  324. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  325. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  326. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  327. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  328. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  329. django_cfg/modules/django_llm/translator/translator.py +150 -603
  330. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  331. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  332. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  333. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  334. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  335. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  336. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  337. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  338. django_cfg/modules/django_logging/__init__.py +14 -0
  339. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  340. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  341. django_cfg/modules/django_ngrok/__init__.py +39 -0
  342. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  343. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  344. django_cfg/modules/django_rpc_old/README.md +397 -0
  345. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  346. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  347. django_cfg/modules/django_rpc_old/client.py +531 -0
  348. django_cfg/modules/django_rpc_old/config.py +279 -0
  349. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  350. django_cfg/modules/django_tailwind/README.md +478 -0
  351. django_cfg/modules/django_tailwind/__init__.py +7 -0
  352. django_cfg/modules/django_tailwind/apps.py +10 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  358. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  359. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  360. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  361. django_cfg/modules/django_tasks/__init__.py +29 -0
  362. django_cfg/modules/django_tasks/factory.py +127 -0
  363. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  364. django_cfg/modules/django_tasks/settings.py +107 -0
  365. django_cfg/modules/django_telegram/__init__.py +29 -0
  366. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  367. django_cfg/modules/django_telegram/utils.py +62 -0
  368. django_cfg/modules/django_twilio/__init__.py +54 -107
  369. django_cfg/modules/django_twilio/_imports.py +30 -0
  370. django_cfg/modules/django_twilio/base.py +192 -0
  371. django_cfg/modules/django_twilio/email_otp.py +227 -0
  372. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  373. django_cfg/modules/django_twilio/simple_service.py +1 -2
  374. django_cfg/modules/django_twilio/sms.py +94 -0
  375. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  376. django_cfg/modules/django_twilio/unified.py +310 -0
  377. django_cfg/modules/django_twilio/utils.py +190 -0
  378. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  379. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  380. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  381. django_cfg/modules/django_unfold/dashboard.py +65 -43
  382. django_cfg/modules/django_unfold/models/config.py +13 -12
  383. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  384. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  385. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  386. django_cfg/registry/core.py +24 -26
  387. django_cfg/registry/modules.py +5 -2
  388. django_cfg/registry/services.py +20 -3
  389. django_cfg/registry/third_party.py +8 -8
  390. django_cfg/static/admin/css/dashboard.css +260 -0
  391. django_cfg/static/admin/js/commands.js +171 -0
  392. django_cfg/static/admin/js/dashboard.js +126 -0
  393. django_cfg/templates/admin/components/management_commands.js +375 -0
  394. django_cfg/templates/admin/components/progress_bar.html +18 -23
  395. django_cfg/templates/admin/index.html +48 -20
  396. django_cfg/templates/admin/index_new.html +106 -0
  397. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  398. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  399. django_cfg/templates/admin/sections/commands_section.html +626 -0
  400. django_cfg/templates/admin/sections/overview_section.html +112 -0
  401. django_cfg/templates/admin/sections/stats_section.html +35 -0
  402. django_cfg/templates/admin/sections/system_section.html +99 -0
  403. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  404. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  405. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  406. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  407. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  408. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  409. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  410. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  411. django_cfg/templatetags/django_cfg.py +7 -1
  412. django_cfg/utils/smart_defaults.py +4 -4
  413. django_cfg-1.4.0.dist-info/METADATA +920 -0
  414. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
  415. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  416. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  417. django_cfg/core/generation.py +0 -621
  418. django_cfg/management/commands/validate_config.py +0 -189
  419. django_cfg/models/database.py +0 -480
  420. django_cfg/models/drf.py +0 -272
  421. django_cfg/models/ngrok.py +0 -122
  422. django_cfg/models/services.py +0 -440
  423. django_cfg/models/tasks.py +0 -550
  424. django_cfg/modules/django_twilio/service.py +0 -942
  425. django_cfg/template_archive/django_sample.zip +0 -0
  426. django_cfg/templates/rest_framework/api.html +0 -12
  427. django_cfg/utils/toolkit.py +0 -703
  428. django_cfg-1.3.11.dist-info/METADATA +0 -1029
  429. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  430. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  431. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  432. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  433. /django_cfg/models/{base.py → base/config.py} +0 -0
  434. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  435. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  436. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  437. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  438. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  439. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -13,7 +13,7 @@ from rest_framework.filters import SearchFilter, OrderingFilter
13
13
 
14
14
  from django_cfg.apps.payments.admin_interface.views.base import AdminReadOnlyViewSet
15
15
  from django_cfg.apps.payments.admin_interface.serializers import AdminUserSerializer
16
- from django_cfg.modules.django_logger import get_logger
16
+ from django_cfg.modules.django_logging import get_logger
17
17
 
18
18
  logger = get_logger("admin_user_api")
19
19
 
@@ -24,7 +24,7 @@ from django_cfg.apps.payments.admin_interface.serializers import (
24
24
  WebhookActionResultSerializer,
25
25
  )
26
26
  from django_cfg.apps.payments.models import UniversalPayment
27
- from django_cfg.modules.django_logger import get_logger
27
+ from django_cfg.modules.django_logging import get_logger
28
28
  from django_cfg.apps.payments.services.integrations.ngrok_service import (
29
29
  get_all_webhook_urls,
30
30
  get_api_base_url,
@@ -12,7 +12,7 @@ from rest_framework.permissions import AllowAny
12
12
  from django.utils import timezone
13
13
 
14
14
  from django_cfg.apps.payments.admin_interface.serializers import WebhookStatsSerializer
15
- from django_cfg.modules.django_logger import get_logger
15
+ from django_cfg.modules.django_logging import get_logger
16
16
 
17
17
  logger = get_logger("webhook_public_api")
18
18
 
@@ -16,7 +16,7 @@ from django.utils import timezone
16
16
  from datetime import timedelta
17
17
 
18
18
 
19
- from django_cfg.modules.django_logger import get_logger
19
+ from django_cfg.modules.django_logging import get_logger
20
20
 
21
21
  logger = get_logger("admin_api")
22
22
 
@@ -103,12 +103,39 @@ class AdminTemplateViewMixin:
103
103
  """
104
104
  Mixin for template views requiring staff access.
105
105
  """
106
-
106
+
107
107
  def get_context_data(self, **kwargs):
108
108
  """Add admin-specific context."""
109
+ from django.urls import reverse
110
+
109
111
  context = super().get_context_data(**kwargs)
112
+
113
+ # Build navigation items for navbar
114
+ dashboard_url = reverse('cfg_payments_admin:dashboard')
115
+ payments_url = reverse('cfg_payments_admin:payment-list')
116
+ webhooks_url = reverse('cfg_payments_admin:webhook-dashboard')
117
+
118
+ payment_nav_items = [
119
+ {
120
+ 'label': 'Dashboard',
121
+ 'url': dashboard_url,
122
+ 'active': self.request.path == dashboard_url or self.request.path.rstrip('/') == dashboard_url.rstrip('/'),
123
+ },
124
+ {
125
+ 'label': 'Payments',
126
+ 'url': payments_url,
127
+ 'active': self.request.path.startswith(payments_url.rstrip('/')),
128
+ },
129
+ {
130
+ 'label': 'Webhooks',
131
+ 'url': webhooks_url,
132
+ 'active': self.request.path.startswith(webhooks_url.rstrip('/')),
133
+ },
134
+ ]
135
+
110
136
  context.update({
111
137
  'is_admin_interface': True,
112
138
  'admin_user': self.request.user,
139
+ 'payment_nav_items': payment_nav_items,
113
140
  })
114
141
  return context
@@ -5,7 +5,7 @@ Simplified payment system focused on NowPayments with extensible architecture.
5
5
  """
6
6
 
7
7
  from django.apps import AppConfig
8
- from django_cfg.modules.django_logger import get_logger
8
+ from django_cfg.modules.django_logging import get_logger
9
9
 
10
10
  logger = get_logger("payments")
11
11
 
@@ -6,8 +6,8 @@ and caching. All payments modules should use this for configuration access.
6
6
  """
7
7
 
8
8
  from typing import Optional
9
- from django_cfg.core.config import get_current_config
10
- from django_cfg.modules.django_logger import get_logger
9
+ from django_cfg.core.state import get_current_config
10
+ from django_cfg.modules.django_logging import get_logger
11
11
 
12
12
  logger = get_logger("payments_django_cfg_integration")
13
13
 
@@ -8,7 +8,7 @@ from typing import Dict, Any
8
8
  from django.conf import settings
9
9
 
10
10
  from .django_cfg_integration import PaymentsConfigMixin
11
- from django_cfg.modules.django_logger import get_logger
11
+ from django_cfg.modules.django_logging import get_logger
12
12
 
13
13
  logger = get_logger("payments_config_helpers")
14
14
 
@@ -24,6 +24,7 @@ class MiddlewareConfigHelper(PaymentsConfigMixin):
24
24
  return {
25
25
  # All settings from BaseCfgAutoModule (django-cfg)
26
26
  'enabled': config.enabled and config.middleware_enabled,
27
+ 'api_prefixes': getattr(config, 'api_prefixes', ['/api/']),
27
28
  'protected_paths': config.protected_paths,
28
29
  'protected_patterns': config.protected_patterns,
29
30
  'rate_limiting_enabled': config.rate_limiting_enabled,
@@ -31,7 +32,7 @@ class MiddlewareConfigHelper(PaymentsConfigMixin):
31
32
  'usage_tracking_enabled': config.usage_tracking_enabled,
32
33
  'track_anonymous_usage': config.track_anonymous_usage,
33
34
  'cache_timeouts': config.cache_timeouts,
34
-
35
+
35
36
  # Provider API configurations
36
37
  'enabled_providers': config.get_enabled_providers(),
37
38
  'provider_configs': {
@@ -13,7 +13,7 @@ from django.db import transaction
13
13
  from django.db.models import Q, Count
14
14
  from django.core.cache import cache
15
15
 
16
- from django_cfg.modules.django_logger import get_logger
16
+ from django_cfg.modules.django_logging import get_logger
17
17
  from django_cfg.apps.payments.models import UniversalPayment, APIKey, Transaction
18
18
  from django_cfg.apps.payments.services.cache_service import get_cache_service
19
19
 
@@ -13,7 +13,7 @@ from django.utils import timezone
13
13
  from django.db.models import Q, Count, Avg, Sum, Max, Min
14
14
  from django.contrib.humanize.templatetags.humanize import intcomma
15
15
 
16
- from django_cfg.modules.django_logger import get_logger
16
+ from django_cfg.modules.django_logging import get_logger
17
17
  from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency, UniversalPayment
18
18
  from django_cfg.apps.payments.services.providers.registry import get_provider_registry
19
19
 
@@ -12,7 +12,7 @@ import time
12
12
  import concurrent.futures
13
13
  from threading import Lock
14
14
 
15
- from django_cfg.modules.django_logger import get_logger
15
+ from django_cfg.modules.django_logging import get_logger
16
16
  from django_cfg.modules.django_currency import CurrencyConverter, CurrencyError
17
17
  from django_cfg.apps.payments.models import Currency
18
18
 
@@ -11,7 +11,7 @@ from datetime import timedelta
11
11
  from typing import List, Optional, Dict
12
12
  import time
13
13
 
14
- from django_cfg.modules.django_logger import get_logger
14
+ from django_cfg.modules.django_logging import get_logger
15
15
  from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency
16
16
  from django_cfg.apps.payments.services.providers import (
17
17
  get_provider_registry,
@@ -13,7 +13,7 @@ from django.utils import timezone
13
13
  from django.db import transaction
14
14
  from django.db.models import Q
15
15
 
16
- from django_cfg.modules.django_logger import get_logger
16
+ from django_cfg.modules.django_logging import get_logger
17
17
  from django_cfg.apps.payments.models import UniversalPayment
18
18
  from django_cfg.apps.payments.services.providers.registry import get_provider_registry
19
19
  from django_cfg.apps.payments.services.core.payment_service import PaymentService
@@ -11,7 +11,7 @@ import time
11
11
  from django.core.management.base import BaseCommand, CommandError
12
12
  from django.utils import timezone
13
13
 
14
- from django_cfg.modules.django_logger import get_logger
14
+ from django_cfg.modules.django_logging import get_logger
15
15
  from django_cfg.apps.payments.services.providers.registry import get_provider_registry
16
16
  from django_cfg.apps.payments.models import Currency, Network
17
17
  from django_cfg.apps.payments.services.types.requests import PaymentCreateRequest
@@ -15,7 +15,7 @@ from django.contrib.auth import get_user_model
15
15
 
16
16
  from ..models import APIKey, Subscription
17
17
  from ..config.helpers import MiddlewareConfigHelper
18
- from django_cfg.modules.django_logger import get_logger
18
+ from django_cfg.modules.django_logging import get_logger
19
19
  from ..tasks.usage_tracking import (
20
20
  update_api_key_usage_async,
21
21
  update_subscription_usage_async
@@ -14,7 +14,7 @@ from django.core.cache import cache
14
14
  from datetime import datetime, timedelta
15
15
 
16
16
  from ..config.helpers import MiddlewareConfigHelper
17
- from django_cfg.modules.django_logger import get_logger
17
+ from django_cfg.modules.django_logging import get_logger
18
18
 
19
19
  logger = get_logger("rate_limiting_middleware")
20
20
 
@@ -12,7 +12,7 @@ from django.utils import timezone
12
12
  from django.core.cache import cache
13
13
 
14
14
  from ..config.helpers import MiddlewareConfigHelper
15
- from django_cfg.modules.django_logger import get_logger
15
+ from django_cfg.modules.django_logging import get_logger
16
16
 
17
17
  logger = get_logger("usage_tracking_middleware")
18
18
 
@@ -78,11 +78,11 @@ class UserBalance(models.Model):
78
78
  ]
79
79
  constraints = [
80
80
  models.CheckConstraint(
81
- check=models.Q(balance_usd__gte=0.0),
81
+ condition=models.Q(balance_usd__gte=0.0),
82
82
  name='balance_non_negative_check'
83
83
  ),
84
84
  models.CheckConstraint(
85
- check=models.Q(reserved_usd__gte=0.0),
85
+ condition=models.Q(reserved_usd__gte=0.0),
86
86
  name='reserved_non_negative_check'
87
87
  ),
88
88
  ]
@@ -7,7 +7,7 @@ Optimized querysets and managers for API key operations.
7
7
  from django.db import models
8
8
  from django.utils import timezone
9
9
  from datetime import timedelta
10
- from django_cfg.modules.django_logger import get_logger
10
+ from django_cfg.modules.django_logging import get_logger
11
11
 
12
12
  logger = get_logger("api_key_managers")
13
13
 
@@ -6,7 +6,7 @@ Optimized querysets and managers for balance and transaction operations.
6
6
 
7
7
  from django.db import models, transaction
8
8
  from django.utils import timezone
9
- from django_cfg.modules.django_logger import get_logger
9
+ from django_cfg.modules.django_logging import get_logger
10
10
 
11
11
  logger = get_logger("balance_managers")
12
12
 
@@ -5,7 +5,7 @@ Optimized querysets and managers for currency operations with django_currency in
5
5
  """
6
6
 
7
7
  from django.db import models
8
- from django_cfg.modules.django_logger import get_logger
8
+ from django_cfg.modules.django_logging import get_logger
9
9
 
10
10
  logger = get_logger("currency_managers")
11
11
 
@@ -10,7 +10,7 @@ from datetime import datetime
10
10
  from django.db import models
11
11
  from django.utils import timezone
12
12
  from pydantic import BaseModel, Field, ConfigDict
13
- from django_cfg.modules.django_logger import get_logger
13
+ from django_cfg.modules.django_logging import get_logger
14
14
 
15
15
  logger = get_logger("payment_managers")
16
16
 
@@ -7,7 +7,7 @@ Optimized querysets and managers for subscription and endpoint group operations.
7
7
  from django.db import models
8
8
  from django.utils import timezone
9
9
  from datetime import timedelta
10
- from django_cfg.modules.django_logger import get_logger
10
+ from django_cfg.modules.django_logging import get_logger
11
11
 
12
12
  logger = get_logger("subscription_managers")
13
13
 
@@ -238,11 +238,11 @@ class UniversalPayment(UUIDTimestampedModel):
238
238
  ]
239
239
  constraints = [
240
240
  models.CheckConstraint(
241
- check=models.Q(amount_usd__gte=1.0),
241
+ condition=models.Q(amount_usd__gte=1.0),
242
242
  name='payments_min_amount_check'
243
243
  ),
244
244
  models.CheckConstraint(
245
- check=models.Q(amount_usd__lte=50000.0),
245
+ condition=models.Q(amount_usd__lte=50000.0),
246
246
  name='payments_max_amount_check'
247
247
  ),
248
248
  ]
@@ -8,7 +8,7 @@ ONLY for API access control - NOT payment data!
8
8
 
9
9
  from typing import Dict, Any
10
10
  from django.core.cache import cache
11
- from django_cfg.modules.django_logger import get_logger
11
+ from django_cfg.modules.django_logging import get_logger
12
12
 
13
13
  from .interfaces import CacheInterface
14
14
  from .simple_cache import SimpleCache
@@ -6,7 +6,7 @@ Basic cache functionality with graceful fallback.
6
6
 
7
7
  from typing import Optional, Any
8
8
  from django.core.cache import cache
9
- from django_cfg.modules.django_logger import get_logger
9
+ from django_cfg.modules.django_logging import get_logger
10
10
 
11
11
  from .interfaces import CacheInterface
12
12
 
@@ -29,15 +29,20 @@ class SimpleCache(CacheInterface):
29
29
  """Check if cache is enabled via PaymentsConfig."""
30
30
  from django.conf import settings
31
31
  import sys
32
-
32
+ import os
33
+
33
34
  # For tests, always enable cache (detect test environment)
34
- if 'test' in sys.argv or hasattr(settings, 'TESTING'):
35
+ # Check multiple ways to detect test environment
36
+ if ('test' in sys.argv or
37
+ hasattr(settings, 'TESTING') or
38
+ 'pytest' in sys.modules or
39
+ 'PYTEST_CURRENT_TEST' in os.environ):
35
40
  return True
36
-
41
+
37
42
  # For development, enable by default
38
43
  if settings.DEBUG:
39
44
  return True
40
-
45
+
41
46
  try:
42
47
  from django_cfg.models.payments import PaymentsConfig
43
48
  config = PaymentsConfig.get_current_config()
@@ -7,7 +7,7 @@ Provides common functionality for all services.
7
7
  from abc import ABC
8
8
  from typing import Optional, Dict, Any, Type
9
9
  from django.db import transaction
10
- from django_cfg.modules.django_logger import get_logger
10
+ from django_cfg.modules.django_logging import get_logger
11
11
 
12
12
  from ..types import ServiceOperationResult
13
13
  from ...config.django_cfg_integration import PaymentsConfigManager
@@ -0,0 +1,13 @@
1
+ """
2
+ Currency operations for payment service.
3
+
4
+ Provides currency validation and conversion functionality.
5
+ """
6
+
7
+ from .currency_validator import CurrencyValidator
8
+ from .currency_converter import CurrencyConverter
9
+
10
+ __all__ = [
11
+ 'CurrencyValidator',
12
+ 'CurrencyConverter',
13
+ ]
@@ -0,0 +1,57 @@
1
+ """
2
+ Currency conversion.
3
+
4
+ Converts between USD and cryptocurrencies using exchange rates.
5
+ """
6
+
7
+ from decimal import Decimal
8
+ from django_cfg.modules.django_currency import convert_currency, get_exchange_rate
9
+ from ...types import ServiceOperationResult
10
+
11
+
12
+ class CurrencyConverter:
13
+ """Convert between currencies."""
14
+
15
+ def __init__(self, base_service):
16
+ """
17
+ Initialize converter.
18
+
19
+ Args:
20
+ base_service: Base service instance for error/success result creation
21
+ """
22
+ self.base_service = base_service
23
+
24
+ def convert_usd_to_crypto(
25
+ self,
26
+ amount_usd: float,
27
+ currency_code: str
28
+ ) -> ServiceOperationResult:
29
+ """
30
+ Convert USD amount to cryptocurrency.
31
+
32
+ Args:
33
+ amount_usd: Amount in USD
34
+ currency_code: Target cryptocurrency code
35
+
36
+ Returns:
37
+ ServiceOperationResult with conversion data or error
38
+ """
39
+ try:
40
+ # Use django_currency module for conversion
41
+ crypto_amount = convert_currency(amount_usd, 'USD', currency_code)
42
+
43
+ return self.base_service._create_success_result(
44
+ "Currency converted successfully",
45
+ {
46
+ 'amount_usd': amount_usd,
47
+ 'crypto_amount': Decimal(str(crypto_amount)),
48
+ 'currency_code': currency_code,
49
+ 'exchange_rate': get_exchange_rate('USD', currency_code)
50
+ }
51
+ )
52
+
53
+ except Exception as e:
54
+ return self.base_service._create_error_result(
55
+ f"Currency conversion failed: {e}",
56
+ "conversion_failed"
57
+ )
@@ -0,0 +1,61 @@
1
+ """
2
+ Currency validation.
3
+
4
+ Validates that currencies are active and supported by providers.
5
+ """
6
+
7
+ from ....models import Currency, ProviderCurrency
8
+ from ...types import ServiceOperationResult
9
+
10
+
11
+ class CurrencyValidator:
12
+ """Validate currencies for payment operations."""
13
+
14
+ def __init__(self, base_service):
15
+ """
16
+ Initialize validator.
17
+
18
+ Args:
19
+ base_service: Base service instance for error/success result creation
20
+ """
21
+ self.base_service = base_service
22
+
23
+ def validate_currency(self, currency_code: str) -> ServiceOperationResult:
24
+ """
25
+ Validate currency is supported.
26
+
27
+ Checks that:
28
+ 1. Currency exists and is active
29
+ 2. Currency is supported by at least one provider
30
+
31
+ Args:
32
+ currency_code: Currency code to validate (e.g., 'BTC', 'ETH')
33
+
34
+ Returns:
35
+ ServiceOperationResult with currency data or error
36
+ """
37
+ try:
38
+ currency = Currency.objects.get(code=currency_code, is_active=True)
39
+
40
+ # Check if currency is supported by any provider
41
+ provider_currency = ProviderCurrency.objects.filter(
42
+ currency=currency,
43
+ is_enabled=True
44
+ ).first()
45
+
46
+ if not provider_currency:
47
+ return self.base_service._create_error_result(
48
+ f"Currency {currency_code} not supported by any provider",
49
+ "currency_not_supported"
50
+ )
51
+
52
+ return self.base_service._create_success_result(
53
+ "Currency is valid",
54
+ {'currency': currency} # Wrap in dict for Pydantic
55
+ )
56
+
57
+ except Currency.DoesNotExist:
58
+ return self.base_service._create_error_result(
59
+ f"Currency {currency_code} not found",
60
+ "currency_not_found"
61
+ )
@@ -0,0 +1,15 @@
1
+ """
2
+ Payment operations.
3
+
4
+ Core payment business logic operations.
5
+ """
6
+
7
+ from .payment_creator import PaymentCreator
8
+ from .payment_canceller import PaymentCanceller
9
+ from .status_checker import StatusChecker
10
+
11
+ __all__ = [
12
+ 'PaymentCreator',
13
+ 'PaymentCanceller',
14
+ 'StatusChecker',
15
+ ]
@@ -0,0 +1,100 @@
1
+ """
2
+ Payment cancellation logic.
3
+
4
+ Handles payment cancellation with validation.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING
8
+ from ...types import PaymentResult
9
+ from ..utils import DataConverter
10
+
11
+ if TYPE_CHECKING:
12
+ from ....models import UniversalPayment
13
+
14
+
15
+ class PaymentCanceller:
16
+ """Handle payment cancellation."""
17
+
18
+ def __init__(self, base_service):
19
+ """
20
+ Initialize canceller.
21
+
22
+ Args:
23
+ base_service: Base service for transactions, logging, and result creation
24
+ """
25
+ self.base_service = base_service
26
+ self.logger = base_service.logger
27
+
28
+ def cancel_payment(self, payment_id: str, reason: str = None) -> PaymentResult:
29
+ """
30
+ Cancel payment if possible.
31
+
32
+ Args:
33
+ payment_id: Payment ID to cancel
34
+ reason: Cancellation reason
35
+
36
+ Returns:
37
+ PaymentResult: Cancellation result
38
+ """
39
+ try:
40
+ from ....models import UniversalPayment
41
+
42
+ self.logger.info("Cancelling payment", extra={
43
+ 'payment_id': payment_id,
44
+ 'reason': reason
45
+ })
46
+
47
+ # Get payment
48
+ try:
49
+ payment = UniversalPayment.objects.get(id=payment_id)
50
+ except UniversalPayment.DoesNotExist:
51
+ return PaymentResult(
52
+ success=False,
53
+ message=f"Payment {payment_id} not found",
54
+ error_code="payment_not_found"
55
+ )
56
+
57
+ # Check if payment can be cancelled
58
+ if not payment.can_be_cancelled():
59
+ return PaymentResult(
60
+ success=False,
61
+ message=f"Payment {payment_id} cannot be cancelled (status: {payment.status})",
62
+ error_code="cannot_cancel"
63
+ )
64
+
65
+ # Cancel using manager
66
+ def cancel_payment_transaction():
67
+ return payment.cancel(reason)
68
+
69
+ success = self.base_service._execute_with_transaction(cancel_payment_transaction)
70
+
71
+ if success:
72
+ payment.refresh_from_db()
73
+ payment_data = DataConverter.payment_to_data(payment)
74
+
75
+ self.base_service._log_operation(
76
+ "cancel_payment",
77
+ True,
78
+ payment_id=payment_id,
79
+ reason=reason
80
+ )
81
+
82
+ return PaymentResult(
83
+ success=True,
84
+ message="Payment cancelled successfully",
85
+ payment_id=str(payment.id),
86
+ status=payment.status,
87
+ data={'payment': payment_data.model_dump()}
88
+ )
89
+ else:
90
+ return PaymentResult(
91
+ success=False,
92
+ message="Failed to cancel payment",
93
+ error_code="cancel_failed"
94
+ )
95
+
96
+ except Exception as e:
97
+ return PaymentResult(**self.base_service._handle_exception(
98
+ "cancel_payment", e,
99
+ payment_id=payment_id
100
+ ).model_dump())