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
@@ -0,0 +1,14 @@
1
+ """
2
+ Context building for chunks.
3
+
4
+ Models and builders for chunk context metadata.
5
+ """
6
+
7
+ from .models import ChunkContextMetadata, ChunkData
8
+ from .builders import ChunkContextBuilder
9
+
10
+ __all__ = [
11
+ 'ChunkContextMetadata',
12
+ 'ChunkData',
13
+ 'ChunkContextBuilder',
14
+ ]
@@ -0,0 +1,220 @@
1
+ """
2
+ Context metadata builders for chunks.
3
+
4
+ Builds rich context metadata for different types of content chunks.
5
+ """
6
+
7
+ from typing import Dict, Any, Optional, List
8
+ from ....models.archive import ArchiveItem
9
+
10
+
11
+ class ChunkContextBuilder:
12
+ """Build context metadata for different chunk types."""
13
+
14
+ @staticmethod
15
+ def build_code_context(
16
+ item: ArchiveItem,
17
+ chunk_index: int,
18
+ content: str,
19
+ start_line: int,
20
+ end_line: int,
21
+ code_info: Dict[str, Any]
22
+ ) -> Dict[str, Any]:
23
+ """
24
+ Build context metadata for code chunk.
25
+
26
+ Args:
27
+ item: Archive item being chunked
28
+ chunk_index: Index of this chunk
29
+ content: Chunk content
30
+ start_line: Starting line number
31
+ end_line: Ending line number
32
+ code_info: Code analysis info (element_name, type, etc.)
33
+
34
+ Returns:
35
+ Context metadata dictionary
36
+ """
37
+ from ..analyzers import TagGenerator
38
+
39
+ return {
40
+ 'archive_info': {
41
+ 'id': str(item.archive.id),
42
+ 'title': item.archive.title,
43
+ 'description': item.archive.description,
44
+ },
45
+ 'item_info': {
46
+ 'id': str(item.id),
47
+ 'relative_path': item.relative_path,
48
+ 'item_name': item.item_name,
49
+ 'content_type': item.content_type,
50
+ 'language': item.language,
51
+ },
52
+ 'position_info': {
53
+ 'chunk_index': chunk_index,
54
+ 'start_line': start_line + 1,
55
+ 'end_line': end_line,
56
+ 'total_lines': len(item.raw_content.split('\n')),
57
+ },
58
+ 'structure_info': {
59
+ 'element_name': code_info.get('element_name'),
60
+ 'element_type': code_info.get('element_type'),
61
+ 'is_async': code_info.get('is_async', False),
62
+ 'has_docstring': bool(code_info.get('docstring')),
63
+ },
64
+ 'semantic_info': {
65
+ 'chunk_type': 'code',
66
+ 'content_purpose': code_info.get('purpose', 'implementation'),
67
+ 'complexity_score': code_info.get('complexity_score', 0.0),
68
+ 'technical_tags': TagGenerator.generate_code_tags(content, code_info),
69
+ },
70
+ 'processing_info': {
71
+ 'extraction_method': 'ast_parser',
72
+ 'chunking_strategy': 'logical_units',
73
+ 'quality_score': code_info.get('quality_score', 0.5),
74
+ }
75
+ }
76
+
77
+ @staticmethod
78
+ def build_document_context(
79
+ item: ArchiveItem,
80
+ chunk_index: int,
81
+ content: str,
82
+ section_info: Dict[str, Any]
83
+ ) -> Dict[str, Any]:
84
+ """
85
+ Build context metadata for document chunk.
86
+
87
+ Args:
88
+ item: Archive item being chunked
89
+ chunk_index: Index of this chunk
90
+ content: Chunk content
91
+ section_info: Section info (title, level, etc.)
92
+
93
+ Returns:
94
+ Context metadata dictionary
95
+ """
96
+ from ..analyzers import TagGenerator
97
+
98
+ return {
99
+ 'archive_info': {
100
+ 'id': str(item.archive.id),
101
+ 'title': item.archive.title,
102
+ },
103
+ 'item_info': {
104
+ 'id': str(item.id),
105
+ 'relative_path': item.relative_path,
106
+ 'content_type': item.content_type,
107
+ 'language': item.language,
108
+ },
109
+ 'position_info': {
110
+ 'chunk_index': chunk_index,
111
+ },
112
+ 'structure_info': {
113
+ 'section_title': section_info.get('title'),
114
+ 'section_level': section_info.get('level', 0),
115
+ },
116
+ 'semantic_info': {
117
+ 'chunk_type': 'heading' if section_info.get('title') else 'text',
118
+ 'content_purpose': 'documentation',
119
+ 'topic_tags': TagGenerator.generate_document_tags(content),
120
+ },
121
+ 'processing_info': {
122
+ 'extraction_method': 'markdown_parser',
123
+ 'chunking_strategy': 'heading_based',
124
+ }
125
+ }
126
+
127
+ @staticmethod
128
+ def build_data_context(
129
+ item: ArchiveItem,
130
+ chunk_index: int,
131
+ content: str,
132
+ data_type: str,
133
+ key_name: Optional[str] = None
134
+ ) -> Dict[str, Any]:
135
+ """
136
+ Build context metadata for data chunk.
137
+
138
+ Args:
139
+ item: Archive item being chunked
140
+ chunk_index: Index of this chunk
141
+ content: Chunk content
142
+ data_type: Type of data (e.g., 'json_object')
143
+ key_name: Optional key name for object property
144
+
145
+ Returns:
146
+ Context metadata dictionary
147
+ """
148
+ return {
149
+ 'archive_info': {
150
+ 'id': str(item.archive.id),
151
+ 'title': item.archive.title,
152
+ },
153
+ 'item_info': {
154
+ 'id': str(item.id),
155
+ 'relative_path': item.relative_path,
156
+ 'content_type': item.content_type,
157
+ },
158
+ 'position_info': {
159
+ 'chunk_index': chunk_index,
160
+ },
161
+ 'structure_info': {
162
+ 'data_key': key_name,
163
+ 'data_type': data_type,
164
+ },
165
+ 'semantic_info': {
166
+ 'chunk_type': 'metadata',
167
+ 'content_purpose': 'data_definition',
168
+ },
169
+ 'processing_info': {
170
+ 'extraction_method': 'json_parser',
171
+ 'chunking_strategy': 'object_properties',
172
+ }
173
+ }
174
+
175
+ @staticmethod
176
+ def build_generic_context(
177
+ item: ArchiveItem,
178
+ chunk_index: int,
179
+ content: str,
180
+ start_pos: int,
181
+ end_pos: int
182
+ ) -> Dict[str, Any]:
183
+ """
184
+ Build context metadata for generic text chunk.
185
+
186
+ Args:
187
+ item: Archive item being chunked
188
+ chunk_index: Index of this chunk
189
+ content: Chunk content
190
+ start_pos: Starting character position
191
+ end_pos: Ending character position
192
+
193
+ Returns:
194
+ Context metadata dictionary
195
+ """
196
+ return {
197
+ 'archive_info': {
198
+ 'id': str(item.archive.id),
199
+ 'title': item.archive.title,
200
+ },
201
+ 'item_info': {
202
+ 'id': str(item.id),
203
+ 'relative_path': item.relative_path,
204
+ 'content_type': item.content_type,
205
+ },
206
+ 'position_info': {
207
+ 'chunk_index': chunk_index,
208
+ 'start_char': start_pos,
209
+ 'end_char': end_pos,
210
+ 'relative_position': start_pos / len(item.raw_content) if item.raw_content else 0.0,
211
+ },
212
+ 'semantic_info': {
213
+ 'chunk_type': 'text',
214
+ 'content_purpose': 'content',
215
+ },
216
+ 'processing_info': {
217
+ 'extraction_method': 'text_splitting',
218
+ 'chunking_strategy': 'fixed_size_overlap',
219
+ }
220
+ }
@@ -0,0 +1,38 @@
1
+ """
2
+ Pydantic models for chunking context metadata.
3
+
4
+ Data structures for chunk data and context metadata.
5
+ """
6
+
7
+ from pydantic import BaseModel
8
+ from typing import Dict, Any
9
+
10
+
11
+ class ChunkContextMetadata(BaseModel):
12
+ """Rich context metadata for chunks."""
13
+
14
+ # Parent hierarchy
15
+ archive_info: Dict[str, Any]
16
+ item_info: Dict[str, Any]
17
+
18
+ # Position and structure
19
+ position_info: Dict[str, Any]
20
+ structure_info: Dict[str, Any]
21
+
22
+ # Semantic context
23
+ semantic_info: Dict[str, Any]
24
+
25
+ # Relational context (optional)
26
+ relationship_info: Dict[str, Any] = {}
27
+
28
+ # Processing provenance
29
+ processing_info: Dict[str, Any]
30
+
31
+
32
+ class ChunkData(BaseModel):
33
+ """Data structure for created chunk."""
34
+
35
+ content: str
36
+ chunk_index: int
37
+ chunk_type: str
38
+ context_metadata: Dict[str, Any]
@@ -6,7 +6,7 @@ the embedding processing pipeline using Pydantic for type safety.
6
6
  """
7
7
 
8
8
  from typing import List, Dict, Any, Optional
9
- from pydantic import BaseModel, Field, validator
9
+ from pydantic import BaseModel, Field, field_validator, ValidationInfo
10
10
  from enum import Enum
11
11
 
12
12
 
@@ -35,7 +35,8 @@ class ChunkData(BaseModel):
35
35
  description="Type of parent content"
36
36
  )
37
37
 
38
- @validator('content')
38
+ @field_validator('content')
39
+ @classmethod
39
40
  def content_must_not_be_empty(cls, v):
40
41
  if not v or not v.strip():
41
42
  raise ValueError('Content cannot be empty')
@@ -76,7 +77,8 @@ class EmbeddingResult(BaseModel):
76
77
  description="Time taken to process this chunk in seconds"
77
78
  )
78
79
 
79
- @validator('embedding')
80
+ @field_validator('embedding')
81
+ @classmethod
80
82
  def validate_embedding_dimension(cls, v):
81
83
  if v is not None and len(v) > 0 and len(v) not in [1536, 3072]: # Common OpenAI embedding dimensions
82
84
  # Warning, not error - allow different dimensions
@@ -153,22 +155,24 @@ class BatchProcessingResult(BaseModel):
153
155
  return 0.0
154
156
  return self.total_tokens / self.successful_chunks
155
157
 
156
- @validator('successful_chunks', 'failed_chunks')
157
- def validate_chunk_counts(cls, v, values):
158
- if 'total_chunks' in values:
159
- total = values['total_chunks']
158
+ @field_validator('successful_chunks', 'failed_chunks')
159
+ @classmethod
160
+ def validate_chunk_counts(cls, v, info: ValidationInfo):
161
+ if info.data and 'total_chunks' in info.data:
162
+ total = info.data['total_chunks']
160
163
  if v > total:
161
164
  raise ValueError(f'Chunk count cannot exceed total chunks ({total})')
162
165
  return v
163
-
164
- @validator('failed_chunks')
165
- def validate_total_consistency(cls, v, values):
166
- if 'total_chunks' in values and 'successful_chunks' in values:
167
- expected_failed = values['total_chunks'] - values['successful_chunks']
166
+
167
+ @field_validator('failed_chunks')
168
+ @classmethod
169
+ def validate_total_consistency(cls, v, info: ValidationInfo):
170
+ if info.data and 'total_chunks' in info.data and 'successful_chunks' in info.data:
171
+ expected_failed = info.data['total_chunks'] - info.data['successful_chunks']
168
172
  if v != expected_failed:
169
173
  raise ValueError(
170
- f'Failed chunks ({v}) + successful chunks ({values["successful_chunks"]}) '
171
- f'must equal total chunks ({values["total_chunks"]})'
174
+ f'Failed chunks ({v}) + successful chunks ({info.data["successful_chunks"]}) '
175
+ f'must equal total chunks ({info.data["total_chunks"]})'
172
176
  )
173
177
  return v
174
178
 
@@ -86,14 +86,17 @@ class ArchiveChunkProcessor:
86
86
  if len(enhanced_content) > max_length:
87
87
  if context_parts:
88
88
  context_prefix_len = len(context_prefix) + 2 # +2 for \n\n
89
- available_content_len = max_length - context_prefix_len
89
+ # Account for "..." suffix (3 chars)
90
+ available_content_len = max_length - context_prefix_len - 3
90
91
  if available_content_len > 100: # Ensure we have meaningful content
91
92
  truncated_content = content[:available_content_len] + "..."
92
93
  enhanced_content = f"{context_prefix}\n\n{truncated_content}"
93
94
  else:
94
- enhanced_content = content[:max_length] + "..."
95
+ # Subtract 3 for "..." suffix
96
+ enhanced_content = content[:max_length - 3] + "..."
95
97
  else:
96
- enhanced_content = content[:max_length] + "..."
98
+ # Subtract 3 for "..." suffix
99
+ enhanced_content = content[:max_length - 3] + "..."
97
100
 
98
101
  return enhanced_content.strip()
99
102
 
@@ -127,14 +127,22 @@ def process_document_async(
127
127
 
128
128
  # Step 5: Update document status
129
129
  processing_time = time.time() - start_time
130
- document.processing_status = ProcessingStatus.COMPLETED
130
+
131
+ # Check if embedding generation failed
132
+ if embedding_result.successful_chunks == 0 and embedding_result.total_chunks > 0:
133
+ # All embeddings failed
134
+ document.processing_status = ProcessingStatus.FAILED
135
+ document.processing_error = "; ".join(embedding_result.errors) if embedding_result.errors else "All embeddings failed to generate"
136
+ else:
137
+ document.processing_status = ProcessingStatus.COMPLETED
138
+
131
139
  document.processing_completed_at = timezone.now()
132
140
  document.chunks_count = embedding_result.total_chunks
133
141
  document.total_tokens = total_tokens
134
142
  document.total_cost_usd = total_cost
135
143
  document.save(update_fields=[
136
- 'processing_status', 'processing_completed_at', 'chunks_count',
137
- 'total_tokens', 'total_cost_usd'
144
+ 'processing_status', 'processing_completed_at', 'processing_error',
145
+ 'chunks_count', 'total_tokens', 'total_cost_usd'
138
146
  ])
139
147
 
140
148
  return {
@@ -112,7 +112,7 @@ class LeadAPITest(APITestCase):
112
112
 
113
113
  def setUp(self):
114
114
  """Set up test data."""
115
- self.url = reverse('leads:lead-submit')
115
+ self.url = reverse('cfg_leads:lead-submit')
116
116
  self.valid_data = {
117
117
  'name': 'John Doe',
118
118
  'email': 'john@example.com',
@@ -23,7 +23,7 @@ from django_cfg.modules.django_admin import (
23
23
  ActionVariant
24
24
  )
25
25
  from django_cfg.modules.django_admin.utils.badges import StatusBadge
26
- from django_cfg.modules.django_logger import get_logger
26
+ from django_cfg.modules.django_logging import get_logger
27
27
 
28
28
  from ..models import APIKey
29
29
 
@@ -24,7 +24,7 @@ from django_cfg.modules.django_admin import (
24
24
  action,
25
25
  ActionVariant
26
26
  )
27
- from django_cfg.modules.django_logger import get_logger
27
+ from django_cfg.modules.django_logging import get_logger
28
28
 
29
29
  from ..models import UserBalance, Transaction
30
30
  from .filters import BalanceRangeFilter, RecentActivityFilter
@@ -25,7 +25,7 @@ from django_cfg.modules.django_admin import (
25
25
  action
26
26
  )
27
27
  from django_cfg.modules.django_admin.utils.badges import StatusBadge
28
- from django_cfg.modules.django_logger import get_logger
28
+ from django_cfg.modules.django_logging import get_logger
29
29
  from ..models import Currency
30
30
  from .filters import CurrencyTypeFilter, CurrencyProviderFilter, CurrencyRateStatusFilter
31
31
 
@@ -24,7 +24,7 @@ from django_cfg.modules.django_admin import (
24
24
  ActionVariant
25
25
  )
26
26
  from django_cfg.modules.django_admin.utils.badges import StatusBadge
27
- from django_cfg.modules.django_logger import get_logger
27
+ from django_cfg.modules.django_logging import get_logger
28
28
 
29
29
  from ..models import UniversalPayment
30
30
 
@@ -20,7 +20,7 @@ from django_cfg.modules.django_admin import (
20
20
  action
21
21
  )
22
22
  from django_cfg.modules.django_admin.utils.badges import StatusBadge
23
- from django_cfg.modules.django_logger import get_logger
23
+ from django_cfg.modules.django_logging import get_logger
24
24
  from ..models import Subscription
25
25
 
26
26
  logger = get_logger("subscriptions_admin")
@@ -1,127 +1,60 @@
1
+ {% extends 'django_tailwind/app.html' %}
1
2
  {% load static %}
2
- <!DOCTYPE html>
3
- <html lang="en" class="h-full">
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>{% block title %}Payment Admin - Django CFG{% endblock %}</title>
8
-
9
- <!-- Material Icons -->
10
- <link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined" rel="stylesheet">
11
-
12
- <!-- Tailwind CSS -->
13
- <script src="https://cdn.tailwindcss.com"></script>
14
-
15
- <!-- Alpine.js -->
16
- <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
17
-
18
- <style>
19
- [x-cloak] { display: none !important; }
20
- </style>
21
-
22
- <!-- Dark mode initialization script to prevent flash -->
23
- <script>
24
- // Initialize dark mode before Alpine.js loads
25
- if (localStorage.getItem('darkMode') === 'true' ||
26
- (!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
27
- document.documentElement.classList.add('dark');
28
- }
29
- </script>
30
-
31
- {% block extra_head %}{% endblock %}
32
- </head>
33
- <body class="h-full bg-gray-50 dark:bg-gray-900" x-data="{
34
- darkMode: localStorage.getItem('darkMode') === 'true' ||
35
- (!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches),
36
- showNgrokHelp: false
37
- }" x-init="$watch('darkMode', val => {
38
- localStorage.setItem('darkMode', val);
39
- document.documentElement.classList.toggle('dark', val);
40
- })">
41
-
42
- <!-- Navigation -->
43
- <nav class="bg-white dark:bg-gray-800 shadow border-b border-gray-200 dark:border-gray-700">
44
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
45
- <div class="flex justify-between h-16">
46
- <!-- Logo -->
47
- <div class="flex items-center">
48
- <span class="material-icons-outlined text-blue-600 mr-2">payment</span>
49
- <h1 class="text-xl font-semibold text-gray-900 dark:text-white">Payment Admin</h1>
50
- </div>
51
-
52
- <!-- Navigation Links -->
53
- <div class="flex items-center space-x-4">
54
- <a href="{% url 'cfg_payments_admin:dashboard' %}"
55
- class="text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white px-3 py-2 rounded-md text-sm font-medium">
56
- Dashboard
57
- </a>
58
- <a href="{% url 'cfg_payments_admin:payment-list' %}"
59
- class="text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white px-3 py-2 rounded-md text-sm font-medium">
60
- Payments
61
- </a>
62
- <a href="{% url 'cfg_payments_admin:webhook-dashboard' %}"
63
- class="text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white px-3 py-2 rounded-md text-sm font-medium">
64
- Webhooks
65
- </a>
66
-
67
- <!-- Dark Mode Toggle -->
68
- <button @click="darkMode = !darkMode"
69
- class="p-2 text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white transition-colors">
70
- <span x-show="!darkMode" x-cloak class="material-icons-outlined">dark_mode</span>
71
- <span x-show="darkMode" x-cloak class="material-icons-outlined">light_mode</span>
72
- </button>
73
- </div>
74
- </div>
75
- </div>
76
- </nav>
77
-
78
- <!-- Main Content -->
79
- <main class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
80
- <!-- Page Header -->
81
- {% block header %}
82
- <div class="mb-8">
83
- <h2 class="text-2xl font-bold text-gray-900 dark:text-white">
84
- {% block page_title %}Dashboard{% endblock %}
85
- </h2>
86
- {% block page_subtitle %}
87
- <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
88
- Manage payments and webhooks
89
- </p>
90
- {% endblock %}
91
- </div>
92
- {% endblock %}
93
-
94
- <!-- Messages -->
95
- {% if messages %}
96
- <div class="mb-6 space-y-2">
97
- {% for message in messages %}
98
- <div class="rounded-md p-4 {% if message.tags == 'error' %}bg-red-50 text-red-800 border border-red-200 dark:bg-red-900/20 dark:text-red-400 dark:border-red-800{% elif message.tags == 'warning' %}bg-yellow-50 text-yellow-800 border border-yellow-200 dark:bg-yellow-900/20 dark:text-yellow-400 dark:border-yellow-800{% elif message.tags == 'success' %}bg-green-50 text-green-800 border border-green-200 dark:bg-green-900/20 dark:text-green-400 dark:border-green-800{% else %}bg-blue-50 text-blue-800 border border-blue-200 dark:bg-blue-900/20 dark:text-blue-400 dark:border-blue-800{% endif %}">
99
- {{ message }}
100
- </div>
101
- {% endfor %}
102
- </div>
103
- {% endif %}
104
-
105
- <!-- Page Content -->
106
- {% block content %}{% endblock %}
107
- </main>
108
-
109
- <!-- Footer -->
110
- <footer class="bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 mt-12">
111
- <div class="max-w-7xl mx-auto py-4 px-4 sm:px-6 lg:px-8">
112
- <div class="text-center text-sm text-gray-600 dark:text-gray-400">
113
- Payment Admin - Django CFG
114
- </div>
115
- </div>
116
- </footer>
117
-
118
- <!-- Global Dialogs -->
119
- {% include 'payments/components/ngrok_help_dialog.html' %}
120
-
121
- <!-- Payment System JS Components -->
122
- <script src="{% static 'payments/js/api-client.js' %}"></script>
123
- <script src="{% static 'payments/js/ngrok-status.js' %}"></script>
124
-
125
- {% block extra_js %}{% endblock %}
126
- </body>
127
- </html>
3
+
4
+ {% block title %}{% block page_title_text %}Dashboard{% endblock %} - Payment Admin - Django CFG{% endblock %}
5
+
6
+ {# Navbar configuration #}
7
+ {% block header %}
8
+ {% with navbar_items=payment_nav_items %}
9
+ {% include 'django_tailwind/components/navbar.html' with title="Payment Admin" icon='<span class="material-icons-outlined text-blue-600">payment</span>' nav_items=navbar_items %}
10
+ {% endwith %}
11
+ {% endblock %}
12
+
13
+ {% block extra_head %}
14
+ {{ block.super }}
15
+ <!-- Material Icons -->
16
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined" rel="stylesheet">
17
+ {% endblock %}
18
+
19
+ {% block alpine_data_extra %}, showNgrokHelp: false{% endblock %}
20
+
21
+ {% block content %}
22
+ <!-- Page Header -->
23
+ <div class="mb-8">
24
+ <h2 class="text-2xl font-bold text-gray-900 dark:text-white">
25
+ {% block page_title %}Dashboard{% endblock %}
26
+ </h2>
27
+ {% block page_subtitle %}
28
+ <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
29
+ Manage payments and webhooks
30
+ </p>
31
+ {% endblock %}
32
+ </div>
33
+
34
+ <!-- Messages -->
35
+ {% if messages %}
36
+ <div class="mb-6 space-y-2">
37
+ {% for message in messages %}
38
+ <div class="rounded-md p-4 {% if message.tags == 'error' %}bg-red-50 text-red-800 border border-red-200 dark:bg-red-900/20 dark:text-red-400 dark:border-red-800{% elif message.tags == 'warning' %}bg-yellow-50 text-yellow-800 border border-yellow-200 dark:bg-yellow-900/20 dark:text-yellow-400 dark:border-yellow-800{% elif message.tags == 'success' %}bg-green-50 text-green-800 border border-green-200 dark:bg-green-900/20 dark:text-green-400 dark:border-green-800{% else %}bg-blue-50 text-blue-800 border border-blue-200 dark:bg-blue-900/20 dark:text-blue-400 dark:border-blue-800{% endif %}">
39
+ {{ message }}
40
+ </div>
41
+ {% endfor %}
42
+ </div>
43
+ {% endif %}
44
+
45
+ <!-- Page Content -->
46
+ {% block page_content %}{% endblock %}
47
+ {% endblock %}
48
+
49
+ {% block body %}
50
+ {{ block.super }}
51
+
52
+ <!-- Global Dialogs -->
53
+ {% include 'payments/components/ngrok_help_dialog.html' %}
54
+ {% endblock %}
55
+
56
+ {% block extra_js %}
57
+ <!-- Payment System JS Components -->
58
+ <script src="{% static 'payments/js/api-client.js' %}"></script>
59
+ <script src="{% static 'payments/js/ngrok-status.js' %}"></script>
60
+ {% endblock %}
@@ -23,7 +23,7 @@ from django_cfg.apps.payments.admin_interface.serializers import (
23
23
  AdminPaymentUpdateSerializer,
24
24
  AdminPaymentStatsSerializer,
25
25
  )
26
- from django_cfg.modules.django_logger import get_logger
26
+ from django_cfg.modules.django_logging import get_logger
27
27
 
28
28
  logger = get_logger("admin_payment_api")
29
29
 
@@ -12,7 +12,7 @@ from django.utils import timezone
12
12
  from datetime import timedelta
13
13
 
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.apps.payments.models import UniversalPayment
17
17
  from ..base import AdminReadOnlyViewSet
18
18
  from django_cfg.apps.payments.admin_interface.serializers import AdminPaymentStatsSerializer, WebhookStatsSerializer