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,511 @@
1
+ """
2
+ Parsing patterns for NowPayments currency recognition.
3
+
4
+ Contains precise patterns, fallback patterns, and provider code patterns
5
+ for extracting base currency codes from various data sources.
6
+ """
7
+
8
+ # Precise patterns from real NowPayments API data
9
+ PRECISE_PATTERNS = {
10
+ # Stablecoins - most common
11
+ 'tether usd': 'USDT',
12
+ 'tether (': 'USDT', # "Tether (Arbitrum One)"
13
+ 'tether ': 'USDT', # "Tether USD (Algorand)"
14
+ 'usd coin': 'USDC', # "USD Coin (Ethereum)"
15
+ 'usd coin bridged': 'USDC', # "USD Coin Bridged (Polygon)"
16
+ 'trueusd': 'TUSD', # "TrueUSD (Tron)"
17
+ 'binance usd': 'BUSD', # "Binance USD (Polygon)"
18
+ 'paxos standard': 'PAX', # "Paxos Standard"
19
+ 'gemini dollar': 'GUSD', # "Gemini Dollar"
20
+
21
+ # Major cryptocurrencies
22
+ 'bitcoin': 'BTC',
23
+ 'ethereum': 'ETH',
24
+ 'cardano': 'ADA',
25
+ 'dogecoin': 'DOGE',
26
+ 'litecoin': 'LTC',
27
+ 'bitcoin cash': 'BCH',
28
+ 'ripple': 'XRP',
29
+ 'polkadot': 'DOT',
30
+ 'avalanche': 'AVAX',
31
+ 'chainlink': 'LINK',
32
+ 'uniswap': 'UNI',
33
+ 'ethereum classic': 'ETC',
34
+ 'stellar': 'XLM',
35
+ 'monero': 'XMR',
36
+ 'zcash': 'ZEC',
37
+ 'dash': 'DASH',
38
+ 'tezos': 'XTZ',
39
+ 'cosmos': 'ATOM',
40
+ 'algorand': 'ALGO',
41
+ 'eos': 'EOS',
42
+ 'tron': 'TRX',
43
+ 'vechain': 'VET',
44
+ 'theta network': 'THETA',
45
+ 'filecoin': 'FIL',
46
+ 'internet computer': 'ICP',
47
+ 'hedera': 'HBAR',
48
+ 'multiversx': 'EGLD',
49
+ 'elrond': 'EGLD',
50
+ 'flow': 'FLOW',
51
+ 'near protocol': 'NEAR',
52
+ 'solana': 'SOL',
53
+ 'fantom': 'FTM',
54
+ 'harmony': 'ONE',
55
+ 'zilliqa': 'ZIL',
56
+ 'ontology': 'ONT',
57
+ 'icon': 'ICX',
58
+ 'qtum': 'QTUM',
59
+ 'waves': 'WAVES',
60
+ 'lisk': 'LSK',
61
+ 'nano': 'NANO',
62
+ 'digibyte': 'DGB',
63
+ 'ravencoin': 'RVN',
64
+ 'siacoin': 'SC',
65
+ 'decred': 'DCR',
66
+ 'horizen': 'ZEN',
67
+ 'komodo': 'KMD',
68
+ 'stratis': 'STRAT',
69
+ 'ark': 'ARK',
70
+ 'nxt': 'NXT',
71
+ 'bitshares': 'BTS',
72
+ 'steem': 'STEEM',
73
+
74
+ # Exchange tokens
75
+ 'binance coin': 'BNB',
76
+ 'bnb': 'BNB',
77
+ 'kucoin shares': 'KCS',
78
+ 'huobi token': 'HT',
79
+ 'okb': 'OKB',
80
+ 'crypto.com coin': 'CRO',
81
+ 'ftx token': 'FTT',
82
+ 'binance usd': 'BUSD',
83
+
84
+ # Layer 1/2 tokens
85
+ 'polygon': 'MATIC',
86
+ 'matic network': 'MATIC',
87
+ 'avalanche': 'AVAX',
88
+ 'solana': 'SOL',
89
+ 'chainlink': 'LINK',
90
+ 'uniswap': 'UNI',
91
+ 'aave': 'AAVE',
92
+ 'compound': 'COMP',
93
+ 'maker': 'MKR',
94
+ 'synthetix': 'SNX',
95
+ 'yearn.finance': 'YFI',
96
+ 'sushiswap': 'SUSHI',
97
+ 'curve dao token': 'CRV',
98
+ 'balancer': 'BAL',
99
+ 'ren': 'REN',
100
+ 'kyber network': 'KNC',
101
+ '0x': 'ZRX',
102
+ 'basic attention token': 'BAT',
103
+ 'enjin coin': 'ENJ',
104
+ 'decentraland': 'MANA',
105
+ 'the sandbox': 'SAND',
106
+ 'axie infinity': 'AXS',
107
+
108
+ # Other stablecoins
109
+ 'dai stablecoin': 'DAI',
110
+ 'frax': 'FRAX',
111
+ 'liquity usd': 'LUSD',
112
+ 'susd': 'SUSD',
113
+ 'neutrino usd': 'USDN',
114
+ 'reserve rights': 'RSR',
115
+ 'ampleforth': 'AMPL',
116
+ 'tribe': 'TRIBE',
117
+ 'fei usd': 'FEI',
118
+
119
+ # Meme coins
120
+ 'shiba inu': 'SHIB',
121
+ 'dogecoin': 'DOGE',
122
+ 'safemoon': 'SAFEMOON',
123
+ 'floki inu': 'FLOKI',
124
+ 'baby doge coin': 'BABYDOGE',
125
+
126
+ # Gaming tokens
127
+ 'axie infinity': 'AXS',
128
+ 'smooth love potion': 'SLP',
129
+ 'the sandbox': 'SAND',
130
+ 'decentraland': 'MANA',
131
+ 'enjin coin': 'ENJ',
132
+ 'gala': 'GALA',
133
+ 'illuvium': 'ILV',
134
+ 'star atlas': 'ATLAS',
135
+ 'yield guild games': 'YGG',
136
+
137
+ # NFT tokens
138
+ 'opensea': 'OS',
139
+ 'looks rare': 'LOOKS',
140
+ 'x2y2': 'X2Y2',
141
+
142
+ # Privacy coins
143
+ 'monero': 'XMR',
144
+ 'zcash': 'ZEC',
145
+ 'dash': 'DASH',
146
+ 'verge': 'XVG',
147
+ 'beam': 'BEAM',
148
+ 'grin': 'GRIN',
149
+
150
+ # Oracle tokens
151
+ 'chainlink': 'LINK',
152
+ 'band protocol': 'BAND',
153
+ 'api3': 'API3',
154
+ 'tellor': 'TRB',
155
+
156
+ # Storage tokens
157
+ 'filecoin': 'FIL',
158
+ 'storj': 'STORJ',
159
+ 'siacoin': 'SC',
160
+ 'arweave': 'AR',
161
+
162
+ # Cross-chain tokens
163
+ 'thorchain': 'RUNE',
164
+ 'cosmos': 'ATOM',
165
+ 'polkadot': 'DOT',
166
+ 'kusama': 'KSM',
167
+ 'ren': 'REN',
168
+ 'anyswap': 'ANY',
169
+
170
+ # Yield farming tokens
171
+ 'yearn.finance': 'YFI',
172
+ 'harvest finance': 'FARM',
173
+ 'pickle finance': 'PICKLE',
174
+ 'cream finance': 'CREAM',
175
+ 'alpha finance lab': 'ALPHA',
176
+
177
+ # Lending tokens
178
+ 'aave': 'AAVE',
179
+ 'compound': 'COMP',
180
+ 'maker': 'MKR',
181
+ 'venus': 'XVS',
182
+ 'justlend': 'JST',
183
+
184
+ # Insurance tokens
185
+ 'nexus mutual': 'NXM',
186
+ 'cover protocol': 'COVER',
187
+ 'nsure network': 'NSURE',
188
+
189
+ # Prediction market tokens
190
+ 'augur': 'REP',
191
+ 'gnosis': 'GNO',
192
+ 'polymarket': 'POLY',
193
+
194
+ # Social tokens
195
+ 'rally': 'RLY',
196
+ 'whale': 'WHALE',
197
+ 'friends with benefits': 'FWB',
198
+
199
+ # Fan tokens
200
+ 'chiliz': 'CHZ',
201
+ 'socios.com': 'CHZ',
202
+
203
+ # Metaverse tokens
204
+ 'decentraland': 'MANA',
205
+ 'the sandbox': 'SAND',
206
+ 'enjin coin': 'ENJ',
207
+ 'bloktopia': 'BLOK',
208
+ 'star atlas': 'ATLAS',
209
+ 'illuvium': 'ILV',
210
+ 'gala': 'GALA',
211
+ 'axie infinity': 'AXS',
212
+ 'smooth love potion': 'SLP',
213
+ 'yield guild games': 'YGG',
214
+ 'merit circle': 'MC',
215
+ 'ultra': 'UOS',
216
+ 'wax': 'WAXP',
217
+ 'alien worlds': 'TLM',
218
+ 'my neighbor alice': 'ALICE',
219
+ 'radio caca': 'RACA',
220
+ 'derace': 'DERC',
221
+ 'vulcan forged': 'PYR',
222
+ 'mobox': 'MBOX',
223
+ 'cryptoblades': 'SKILL',
224
+ 'thetan arena': 'THG',
225
+ 'gods unchained': 'GODS',
226
+ 'immutable x': 'IMX',
227
+ 'ecomi': 'OMI',
228
+ 'veve': 'VVV',
229
+ 'efinity token': 'EFI',
230
+ 'chromia': 'CHR',
231
+ 'phantasma': 'SOUL',
232
+ 'wax': 'WAXP',
233
+ 'enjin coin': 'ENJ',
234
+ 'flow': 'FLOW',
235
+ 'dapper labs': 'FLOW',
236
+ 'nba top shot': 'FLOW',
237
+ 'cryptokitties': 'ETH',
238
+ 'cryptopunks': 'ETH',
239
+ 'bored ape yacht club': 'ETH',
240
+ 'mutant ape yacht club': 'ETH',
241
+ 'cool cats': 'ETH',
242
+ 'world of women': 'ETH',
243
+ 'pudgy penguins': 'ETH',
244
+ 'azuki': 'ETH',
245
+ 'clone x': 'ETH',
246
+ 'moonbirds': 'ETH',
247
+ 'otherdeeds for otherside': 'ETH',
248
+ 'yuga labs': 'ETH',
249
+ }
250
+
251
+ # Fallback patterns for edge cases
252
+ FALLBACK_PATTERNS = {
253
+ 'usdt': 'USDT',
254
+ 'usdc': 'USDC',
255
+ 'tusd': 'TUSD',
256
+ 'busd': 'BUSD',
257
+ 'dai': 'DAI',
258
+ 'frax': 'FRAX',
259
+ 'btc': 'BTC',
260
+ 'eth ': 'ETH',
261
+ 'ada': 'ADA',
262
+ 'doge': 'DOGE',
263
+ 'matic': 'MATIC',
264
+ 'avax': 'AVAX',
265
+ 'sol': 'SOL',
266
+ 'dot': 'DOT',
267
+ 'atom': 'ATOM',
268
+ 'near': 'NEAR',
269
+ 'algo': 'ALGO',
270
+ 'xtz': 'XTZ',
271
+ 'eos': 'EOS',
272
+ 'trx': 'TRX',
273
+ 'xlm': 'XLM',
274
+ 'xrp': 'XRP',
275
+ 'ltc': 'LTC',
276
+ 'bch': 'BCH',
277
+ 'etc': 'ETC',
278
+ 'xmr': 'XMR',
279
+ 'zec': 'ZEC',
280
+ 'dash': 'DASH',
281
+ 'bnb': 'BNB',
282
+ 'link': 'LINK',
283
+ 'uni': 'UNI',
284
+ 'aave': 'AAVE',
285
+ 'comp': 'COMP',
286
+ 'mkr': 'MKR',
287
+ 'snx': 'SNX',
288
+ 'yfi': 'YFI',
289
+ 'sushi': 'SUSHI',
290
+ 'crv': 'CRV',
291
+ 'bal': 'BAL',
292
+ 'ren': 'REN',
293
+ 'knc': 'KNC',
294
+ 'zrx': 'ZRX',
295
+ 'bat': 'BAT',
296
+ 'enj': 'ENJ',
297
+ 'mana': 'MANA',
298
+ 'sand': 'SAND',
299
+ 'axs': 'AXS',
300
+ 'ftm': 'FTM',
301
+ 'one': 'ONE',
302
+ 'zil': 'ZIL',
303
+ 'ont': 'ONT',
304
+ 'icx': 'ICX',
305
+ 'qtum': 'QTUM',
306
+ 'waves': 'WAVES',
307
+ 'lsk': 'LSK',
308
+ 'nano': 'NANO',
309
+ 'dgb': 'DGB',
310
+ 'rvn': 'RVN',
311
+ 'sc': 'SC',
312
+ 'dcr': 'DCR',
313
+ 'zen': 'ZEN',
314
+ 'kmd': 'KMD',
315
+ 'strat': 'STRAT',
316
+ 'ark': 'ARK',
317
+ 'nxt': 'NXT',
318
+ 'bts': 'BTS',
319
+ 'steem': 'STEEM',
320
+ 'vet': 'VET',
321
+ 'theta': 'THETA',
322
+ 'fil': 'FIL',
323
+ 'icp': 'ICP',
324
+ 'hbar': 'HBAR',
325
+ 'egld': 'EGLD',
326
+ 'flow': 'FLOW',
327
+ 'iota': 'IOTA',
328
+ 'shib': 'SHIB',
329
+ 'floki': 'FLOKI',
330
+ 'safemoon': 'SAFEMOON',
331
+ 'babydoge': 'BABYDOGE',
332
+ 'slp': 'SLP',
333
+ 'gala': 'GALA',
334
+ 'ilv': 'ILV',
335
+ 'atlas': 'ATLAS',
336
+ 'ygg': 'YGG',
337
+ 'rune': 'RUNE',
338
+ 'ksm': 'KSM',
339
+ 'any': 'ANY',
340
+ 'farm': 'FARM',
341
+ 'pickle': 'PICKLE',
342
+ 'cream': 'CREAM',
343
+ 'alpha': 'ALPHA',
344
+ 'xvs': 'XVS',
345
+ 'jst': 'JST',
346
+ 'nxm': 'NXM',
347
+ 'cover': 'COVER',
348
+ 'nsure': 'NSURE',
349
+ 'rep': 'REP',
350
+ 'gno': 'GNO',
351
+ 'poly': 'POLY',
352
+ 'rly': 'RLY',
353
+ 'whale': 'WHALE',
354
+ 'fwb': 'FWB',
355
+ 'chz': 'CHZ',
356
+ 'blok': 'BLOK',
357
+ 'mc': 'MC',
358
+ 'uos': 'UOS',
359
+ 'waxp': 'WAXP',
360
+ 'tlm': 'TLM',
361
+ 'alice': 'ALICE',
362
+ 'raca': 'RACA',
363
+ 'derc': 'DERC',
364
+ 'pyr': 'PYR',
365
+ 'mbox': 'MBOX',
366
+ 'skill': 'SKILL',
367
+ 'thg': 'THG',
368
+ 'gods': 'GODS',
369
+ 'imx': 'IMX',
370
+ 'omi': 'OMI',
371
+ 'vvv': 'VVV',
372
+ 'efi': 'EFI',
373
+ 'chr': 'CHR',
374
+ 'soul': 'SOUL',
375
+ }
376
+
377
+ # Provider code exact matches
378
+ PROVIDER_CODE_PATTERNS = {
379
+ # Stablecoins with network suffixes
380
+ 'USDTERC20': 'USDT',
381
+ 'USDTTRC20': 'USDT',
382
+ 'USDTBSC': 'USDT',
383
+ 'USDTMATIC': 'USDT',
384
+ 'USDTARB': 'USDT',
385
+ 'USDTALGO': 'USDT',
386
+ 'USDTARC20': 'USDT', # Avalanche
387
+ 'USDTOP': 'USDT', # Optimism
388
+ 'USDTSOL': 'USDT', # Solana
389
+ 'USDTTON': 'USDT', # TON
390
+ 'USDTNEAR': 'USDT', # NEAR
391
+ 'USDTEOS': 'USDT', # EOS
392
+ 'USDTDOT': 'USDT', # Polkadot
393
+ 'USDTCELO': 'USDT', # Celo
394
+ 'USDTKAVA': 'USDT', # Kava
395
+ 'USDTXTZ': 'USDT', # Tezos
396
+
397
+ # USDC variants
398
+ 'USDCERC20': 'USDC',
399
+ 'USDCBSC': 'USDC',
400
+ 'USDCMATIC': 'USDC',
401
+ 'USDCARB': 'USDC',
402
+ 'USDCALGO': 'USDC',
403
+ 'USDCARC20': 'USDC', # Avalanche
404
+ 'USDCOP': 'USDC', # Optimism
405
+ 'USDCSOL': 'USDC', # Solana
406
+ 'USDCBASE': 'USDC', # Base
407
+ 'USDCKCC': 'USDC', # KCC
408
+ 'USDCXLM': 'USDC', # Stellar
409
+
410
+ # ETH variants
411
+ 'ETHBSC': 'ETH',
412
+ 'ETHARB': 'ETH',
413
+ 'ETHBASE': 'ETH',
414
+ 'ETHLNA': 'ETH', # Linea
415
+
416
+ # Other common patterns
417
+ 'BTCBSC': 'BTC', # Wrapped BTC
418
+ 'WBTC': 'BTC', # Wrapped Bitcoin
419
+ 'WETH': 'ETH', # Wrapped Ethereum
420
+
421
+ # Network-specific tokens with suffixes
422
+ 'BNBBSC': 'BNB',
423
+ 'MATICMATIC': 'MATIC',
424
+ 'AVAXARC20': 'AVAX',
425
+ 'SOLANASOL': 'SOL',
426
+
427
+ # Additional patterns from NowPayments
428
+ '1INCHBSC': '1INCH',
429
+ '1INCHERC20': '1INCH',
430
+ 'AAVEERC20': 'AAVE',
431
+ 'AAVEBSC': 'AAVE',
432
+ 'ADABSC': 'ADA',
433
+ 'ALGOERC20': 'ALGO',
434
+ 'APEERC20': 'APE',
435
+ 'APEBSC': 'APE',
436
+ 'ATOMCOSMOS': 'ATOM',
437
+ 'AVAXBSC': 'AVAX',
438
+ 'AXSERC20': 'AXS',
439
+ 'AXSBSC': 'AXS',
440
+ 'BATERC20': 'BAT',
441
+ 'BATBSC': 'BAT',
442
+ 'BCHBSC': 'BCH',
443
+ 'BNBERC20': 'BNB',
444
+ 'BUSDBSC': 'BUSD',
445
+ 'BUSDERC20': 'BUSD',
446
+ 'CAKEBSC': 'CAKE',
447
+ 'COMPBSC': 'COMP',
448
+ 'COMPERC20': 'COMP',
449
+ 'CRVERC20': 'CRV',
450
+ 'CRVBSC': 'CRV',
451
+ 'DAIBSC': 'DAI',
452
+ 'DAIERC20': 'DAI',
453
+ 'DOGEERC20': 'DOGE',
454
+ 'DOGEBSC': 'DOGE',
455
+ 'DOTBSC': 'DOT',
456
+ 'DOTERC20': 'DOT',
457
+ 'ENJERC20': 'ENJ',
458
+ 'ENJBSC': 'ENJ',
459
+ 'ETCBSC': 'ETC',
460
+ 'ETCERC20': 'ETC',
461
+ 'FILBSC': 'FIL',
462
+ 'FILERC20': 'FIL',
463
+ 'FTMBSC': 'FTM',
464
+ 'FTMERC20': 'FTM',
465
+ 'GALAERC20': 'GALA',
466
+ 'GALABSC': 'GALA',
467
+ 'GRTERC20': 'GRT',
468
+ 'GRTBSC': 'GRT',
469
+ 'ICPERC20': 'ICP',
470
+ 'ICPBSC': 'ICP',
471
+ 'LINKERC20': 'LINK',
472
+ 'LINKBSC': 'LINK',
473
+ 'LTCBSC': 'LTC',
474
+ 'LTCERC20': 'LTC',
475
+ 'MANAERC20': 'MANA',
476
+ 'MANABSC': 'MANA',
477
+ 'MKRBSC': 'MKR',
478
+ 'MKRERC20': 'MKR',
479
+ 'NEARERC20': 'NEAR',
480
+ 'NEARBSC': 'NEAR',
481
+ 'ONEERC20': 'ONE',
482
+ 'ONEBSC': 'ONE',
483
+ 'SANDERC20': 'SAND',
484
+ 'SANDBSC': 'SAND',
485
+ 'SHIBERC20': 'SHIB',
486
+ 'SHIBBSC': 'SHIB',
487
+ 'SNXERC20': 'SNX',
488
+ 'SNXBSC': 'SNX',
489
+ 'SOLERC20': 'SOL',
490
+ 'SOLBSC': 'SOL',
491
+ 'SUSHIERC20': 'SUSHI',
492
+ 'SUSHIBSC': 'SUSHI',
493
+ 'TRXBSC': 'TRX',
494
+ 'TRXERC20': 'TRX',
495
+ 'TUSDTRC20': 'TUSD',
496
+ 'TUSDBSC': 'TUSD',
497
+ 'TUSDERC20': 'TUSD',
498
+ 'UNIERC20': 'UNI',
499
+ 'UNIBSC': 'UNI',
500
+ 'VETBSC': 'VET',
501
+ 'VETERC20': 'VET',
502
+ 'XLMBSC': 'XLM',
503
+ 'XLMERC20': 'XLM',
504
+ 'XRPBSC': 'XRP',
505
+ 'XRPERC20': 'XRP',
506
+ 'XTZXTZ': 'XTZ',
507
+ 'YFIIERC20': 'YFI',
508
+ 'YFIIBSC': 'YFI',
509
+ 'ZRXERC20': 'ZRX',
510
+ 'ZRXBSC': 'ZRX',
511
+ }
@@ -0,0 +1,168 @@
1
+ """
2
+ NowPayments currency parser.
3
+
4
+ Handles parsing and normalization of NowPayments currency data using
5
+ pattern matching and data-driven approach.
6
+ """
7
+
8
+ from typing import Optional
9
+ from django_cfg.modules.django_logging import get_logger
10
+
11
+ from .data import (
12
+ CURRENCY_NAMES,
13
+ NETWORK_NAMES,
14
+ PRECISE_PATTERNS,
15
+ FALLBACK_PATTERNS,
16
+ PROVIDER_CODE_PATTERNS,
17
+ NETWORK_SUFFIXES,
18
+ )
19
+
20
+ logger = get_logger("nowpayments_parsers")
21
+
22
+
23
+ class NowPaymentsCurrencyParser:
24
+ """Parser for NowPayments currency data."""
25
+
26
+ def __init__(self):
27
+ """Initialize currency parser with data from data module."""
28
+ self.precise_patterns = PRECISE_PATTERNS
29
+ self.fallback_patterns = FALLBACK_PATTERNS
30
+ self.provider_code_patterns = PROVIDER_CODE_PATTERNS
31
+ self.network_suffixes = NETWORK_SUFFIXES
32
+
33
+ def parse_currency_code(
34
+ self,
35
+ provider_code: str,
36
+ currency_name: str,
37
+ network_code: Optional[str] = None,
38
+ ticker: str = ''
39
+ ) -> tuple[str, Optional[str]]:
40
+ """
41
+ Smart parsing using API data, prioritizing ticker field.
42
+
43
+ Uses ticker as primary source for base currency, then falls back to name parsing.
44
+
45
+ Args:
46
+ provider_code: Provider's currency code (e.g., "USDTERC20")
47
+ currency_name: Human-readable currency name (e.g., "Tether USD")
48
+ network_code: Network code (e.g., "eth")
49
+ ticker: Ticker symbol (e.g., "usdt")
50
+
51
+ Returns:
52
+ Tuple of (base_currency, network_code) or (None, None) if should skip
53
+
54
+ Examples:
55
+ >>> parser.parse_currency_code("1INCHBSC", "1Inch Network (BSC)", "bsc", "1inch")
56
+ ("1INCH", "bsc")
57
+ >>> parser.parse_currency_code("USDTERC20", "Tether USD (ERC-20)", "eth", "usdt")
58
+ ("USDT", "eth")
59
+ >>> parser.parse_currency_code("BTC", "Bitcoin", "btc", "btc")
60
+ ("BTC", "btc")
61
+ """
62
+ # Skip currencies with empty network - they are duplicates
63
+ if network_code is not None and network_code.strip() == "":
64
+ return None, None
65
+
66
+ # Priority 1: Use ticker if available and meaningful
67
+ if ticker and len(ticker.strip()) > 0:
68
+ base_currency = ticker.upper().strip()
69
+ return base_currency, network_code
70
+
71
+ # Priority 2: Extract from provider code patterns
72
+ base_currency = self.extract_base_currency_from_provider_code(provider_code)
73
+ if base_currency != provider_code:
74
+ return base_currency, network_code
75
+
76
+ # Priority 3: Extract from name using patterns
77
+ base_currency = self.extract_base_currency_from_name(currency_name, provider_code)
78
+ return base_currency, network_code
79
+
80
+ def extract_base_currency_from_name(self, currency_name: str, fallback_code: str) -> str:
81
+ """
82
+ Extract base currency from human-readable name using real API patterns.
83
+
84
+ Args:
85
+ currency_name: Human-readable currency name
86
+ fallback_code: Code to use if no pattern matches
87
+
88
+ Returns:
89
+ Base currency code (e.g., "USDT", "BTC")
90
+ """
91
+ if not currency_name:
92
+ return fallback_code
93
+
94
+ name_lower = currency_name.lower()
95
+
96
+ # Check precise patterns first (most reliable)
97
+ for pattern, base in self.precise_patterns.items():
98
+ if pattern in name_lower:
99
+ return base
100
+
101
+ # Fallback patterns for edge cases
102
+ for pattern, base in self.fallback_patterns.items():
103
+ if pattern in name_lower:
104
+ return base
105
+
106
+ # Last resort: use the provider code as-is
107
+ return fallback_code
108
+
109
+ def extract_base_currency_from_provider_code(self, provider_code: str) -> str:
110
+ """
111
+ Extract base currency from NowPayments provider code patterns.
112
+
113
+ Args:
114
+ provider_code: Provider's currency code (e.g., "USDTERC20")
115
+
116
+ Returns:
117
+ Base currency code (e.g., "USDT")
118
+ """
119
+ if not provider_code:
120
+ return provider_code
121
+
122
+ code_upper = provider_code.upper()
123
+
124
+ # Check exact matches first
125
+ if code_upper in self.provider_code_patterns:
126
+ return self.provider_code_patterns[code_upper]
127
+
128
+ # Pattern matching for common suffixes
129
+ for suffix in self.network_suffixes:
130
+ if code_upper.endswith(suffix):
131
+ base_part = code_upper[:-len(suffix)]
132
+ if len(base_part) >= 2: # Ensure we have a meaningful base
133
+ return base_part
134
+
135
+ # Return original if no pattern matches
136
+ return provider_code
137
+
138
+ def generate_currency_name(
139
+ self,
140
+ base_currency_code: str,
141
+ network_code: Optional[str],
142
+ original_name: str
143
+ ) -> str:
144
+ """
145
+ Generate proper currency name based on base currency and network.
146
+
147
+ Args:
148
+ base_currency_code: Base currency code (e.g., "USDT")
149
+ network_code: Network code (e.g., "eth")
150
+ original_name: Original name as fallback
151
+
152
+ Returns:
153
+ Formatted currency name (e.g., "Tether USD (Ethereum)")
154
+
155
+ Examples:
156
+ >>> parser.generate_currency_name("USDT", "eth", "Tether USD")
157
+ "Tether USD (Ethereum)"
158
+ >>> parser.generate_currency_name("BTC", "btc", "Bitcoin")
159
+ "Bitcoin"
160
+ """
161
+ base_name = CURRENCY_NAMES.get(base_currency_code, original_name)
162
+
163
+ if not network_code or network_code == base_currency_code.lower():
164
+ # Native currency on its own network
165
+ return base_name
166
+
167
+ network_name = NETWORK_NAMES.get(network_code.lower(), network_code.title())
168
+ return f"{base_name} ({network_name})"
@@ -11,7 +11,7 @@ from typing import Optional, List, Dict, Any
11
11
  from decimal import Decimal
12
12
  from datetime import datetime
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 ..base import BaseProvider
16
16
  from ..models import PaymentRequest
17
17
  from ...types import ProviderResponse, ServiceOperationResult
@@ -8,7 +8,7 @@ from typing import Optional, Tuple, List
8
8
  from django.db import transaction
9
9
  from django.utils import timezone
10
10
 
11
- from django_cfg.modules.django_logger import get_logger
11
+ from django_cfg.modules.django_logging import get_logger
12
12
  from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency
13
13
  from ..models import UniversalCurrency, CurrencySyncResult
14
14
  from .config import NowPaymentsConfig as Config