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,23 @@
1
+ """
2
+ 🎨 Django DRF Tailwind Theme
3
+
4
+ Modern, user-friendly Tailwind CSS theme for Django REST Framework Browsable API.
5
+
6
+ Features:
7
+ - 🌓 Dark/Light mode with smooth transitions
8
+ - 📱 Fully responsive design
9
+ - ⌨️ Keyboard shortcuts
10
+ - 🎯 Glass morphism UI
11
+ - 🚀 Alpine.js powered interactivity
12
+ - 💫 Smooth animations
13
+ - 📋 One-click copy for JSON/URLs
14
+ - 🔍 Advanced JSON tree viewer
15
+ """
16
+
17
+ from .renderers import TailwindBrowsableAPIRenderer
18
+
19
+ __all__ = [
20
+ "TailwindBrowsableAPIRenderer",
21
+ ]
22
+
23
+ __version__ = "1.0.0"
@@ -0,0 +1,15 @@
1
+ """Django DRF Tailwind Theme app configuration."""
2
+
3
+ from django.apps import AppConfig
4
+
5
+
6
+ class DjangoDRFThemeConfig(AppConfig):
7
+ """App configuration for Django DRF Tailwind Theme."""
8
+
9
+ name = "django_cfg.modules.django_drf_theme"
10
+ verbose_name = "Django DRF Tailwind Theme"
11
+ default_auto_field = "django.db.models.BigAutoField"
12
+
13
+ def ready(self):
14
+ """Initialize the app when Django starts."""
15
+ pass
@@ -0,0 +1,58 @@
1
+ """
2
+ Modern Tailwind-styled renderer for Django REST Framework.
3
+ """
4
+
5
+ from rest_framework.renderers import BrowsableAPIRenderer
6
+
7
+
8
+ class TailwindBrowsableAPIRenderer(BrowsableAPIRenderer):
9
+ """
10
+ 🎨 Tailwind CSS Browsable API Renderer
11
+
12
+ Modern, user-friendly renderer with:
13
+ - Dark/Light mode support
14
+ - Glass morphism design
15
+ - Keyboard shortcuts (? to see all)
16
+ - Responsive mobile-first layout
17
+ - Advanced JSON viewer with syntax highlighting
18
+ - One-click copy for JSON/URLs
19
+ - Smooth animations and transitions
20
+
21
+ Extends BrowsableAPIRenderer to preserve all DRF functionality.
22
+ """
23
+
24
+ template = 'rest_framework/tailwind/api.html'
25
+
26
+ def get_context(self, data, accepted_media_type, renderer_context):
27
+ """Extend context with Tailwind-specific variables."""
28
+ context = super().get_context(
29
+ data, accepted_media_type, renderer_context
30
+ )
31
+
32
+ request = renderer_context.get('request')
33
+ if request:
34
+ # Theme from cookie or system preference
35
+ theme = request.COOKIES.get('theme', 'auto')
36
+
37
+ # Determine HTML class based on theme
38
+ if theme == 'dark':
39
+ html_class = 'dark'
40
+ elif theme == 'light':
41
+ html_class = ''
42
+ else: # auto
43
+ html_class = '' # Will use system preference via JS
44
+
45
+ context.update({
46
+ 'theme': theme,
47
+ 'html_class': html_class,
48
+ 'tailwind_version': 4,
49
+ 'enable_dark_mode': True,
50
+ 'enable_shortcuts': True,
51
+ 'enable_animations': True,
52
+ })
53
+
54
+ return context
55
+
56
+ def get_template_names(self):
57
+ """Return only Tailwind template (no fallback)."""
58
+ return [self.template]
@@ -0,0 +1,375 @@
1
+ {% extends "rest_framework/tailwind/base.html" %}
2
+ {% load rest_framework %}
3
+
4
+ {% block content %}
5
+ <div class="grid grid-cols-1 xl:grid-cols-3 gap-6">
6
+
7
+ {# Main Content Column #}
8
+ <div class="xl:col-span-2 space-y-6">
9
+
10
+ {# Endpoint Info Card #}
11
+ {% if description %}
12
+ <div class="card p-6">
13
+ <div class="flex items-start justify-between mb-4">
14
+ <div class="flex-1">
15
+ <h1 class="text-2xl font-bold mb-2 text-gray-900 dark:text-white">
16
+ {{ name }}
17
+ </h1>
18
+ <div class="prose prose-gray dark:prose-invert max-w-none text-gray-700 dark:text-gray-300">
19
+ {{ description }}
20
+ </div>
21
+ </div>
22
+
23
+ {# Copy endpoint button #}
24
+ <button @click="navigator.clipboard.writeText('{{ request.build_absolute_uri }}').then(() => showToast('URL copied!', 'success')).catch(() => showToast('Failed to copy', 'error'))"
25
+ class="btn-icon ml-4"
26
+ title="Copy URL">
27
+ <svg class="w-5 h-5 text-gray-600 dark:text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
28
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
29
+ </svg>
30
+ </button>
31
+ </div>
32
+
33
+ {# Endpoint URL with copy functionality #}
34
+ <div class="mt-4 p-4 bg-gray-100 dark:bg-gray-900 rounded-lg">
35
+ <div class="flex items-center justify-between">
36
+ <code class="text-sm font-mono flex-1 overflow-x-auto text-gray-900 dark:text-gray-100">{{ request.get_full_path }}</code>
37
+ <button @click="navigator.clipboard.writeText('{{ request.build_absolute_uri }}').then(() => showToast('Endpoint URL copied!', 'success')).catch(() => showToast('Failed to copy', 'error'))"
38
+ class="btn-icon ml-2">
39
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
40
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
41
+ </svg>
42
+ </button>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ {% endif %}
47
+
48
+ {# Response Viewer with Tabs #}
49
+ <div class="card overflow-hidden"
50
+ x-data="{ activeTab: 'pretty', expanded: {}, copySuccess: false }">
51
+
52
+ {# Tabs Header #}
53
+ <div class="flex items-center justify-between border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
54
+ <div class="flex">
55
+ <button @click="activeTab = 'pretty'"
56
+ :class="activeTab === 'pretty' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
57
+ class="px-6 py-3 font-medium text-sm transition-all">
58
+ <div class="flex items-center space-x-2">
59
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
60
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"/>
61
+ </svg>
62
+ <span>Response</span>
63
+ </div>
64
+ </button>
65
+
66
+ <button @click="activeTab = 'raw'"
67
+ :class="activeTab === 'raw' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
68
+ class="px-6 py-3 font-medium text-sm transition-all">
69
+ <div class="flex items-center space-x-2">
70
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
71
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
72
+ </svg>
73
+ <span>Raw</span>
74
+ </div>
75
+ </button>
76
+
77
+ {% if display_edit_forms %}
78
+ <button @click="activeTab = 'headers'"
79
+ :class="activeTab === 'headers' ? 'bg-white dark:bg-gray-800 border-b-2 border-blue-600 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'"
80
+ class="px-6 py-3 font-medium text-sm transition-all">
81
+ <div class="flex items-center space-x-2">
82
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
83
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
84
+ </svg>
85
+ <span>Headers</span>
86
+ </div>
87
+ </button>
88
+ {% endif %}
89
+ </div>
90
+
91
+ {# Response Status Badge #}
92
+ {% if response.status_code %}
93
+ <div class="px-4 py-2">
94
+ <span class="badge
95
+ {% if response.status_code < 300 %}status-success
96
+ {% elif response.status_code < 400 %}status-info
97
+ {% elif response.status_code < 500 %}status-warning
98
+ {% else %}status-error{% endif %}">
99
+ {{ response.status_code }} {{ response.status_text }}
100
+ </span>
101
+ </div>
102
+ {% endif %}
103
+ </div>
104
+
105
+ {# Response Content #}
106
+ <div class="p-6">
107
+ {# Pretty JSON View #}
108
+ <div x-show="activeTab === 'pretty'" class="space-y-4">
109
+ {% if content %}
110
+ <div class="relative"
111
+ x-data="{
112
+ jsonData: null,
113
+ init() {
114
+ try {
115
+ this.jsonData = JSON.parse(`{{ content|escapejs }}`);
116
+ } catch(e) {
117
+ console.error('Failed to parse JSON:', e);
118
+ }
119
+ }
120
+ }">
121
+ {# Toolbar #}
122
+ <div class="flex items-center justify-between mb-3">
123
+ <div class="flex items-center space-x-2">
124
+ <button @click="$event.target.closest('[x-data]').querySelectorAll('.json-toggle').forEach(el => el.dataset.expanded = 'true'); $event.target.closest('[x-data]').querySelectorAll('.json-content').forEach(el => el.style.display = 'block')"
125
+ class="px-3 py-1.5 text-xs rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 transition-all">
126
+ Expand All
127
+ </button>
128
+ <button @click="$event.target.closest('[x-data]').querySelectorAll('.json-toggle').forEach(el => el.dataset.expanded = 'false'); $event.target.closest('[x-data]').querySelectorAll('.json-content').forEach(el => el.style.display = 'none')"
129
+ class="px-3 py-1.5 text-xs rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 transition-all">
130
+ Collapse All
131
+ </button>
132
+ </div>
133
+
134
+ {# Copy button #}
135
+ <button @click="navigator.clipboard.writeText(JSON.stringify(jsonData, null, 2)).then(() => { copySuccess = true; showToast('JSON copied!', 'success'); setTimeout(() => copySuccess = false, 2000) }).catch(() => showToast('Failed to copy', 'error'))"
136
+ class="px-3 py-1.5 rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 text-sm font-medium transition-all">
137
+ <div class="flex items-center space-x-1.5">
138
+ <svg x-show="!copySuccess" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
139
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
140
+ </svg>
141
+ <svg x-show="copySuccess" class="w-4 h-4 text-green-500" fill="currentColor" viewBox="0 0 20 20">
142
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
143
+ </svg>
144
+ <span x-text="copySuccess ? 'Copied!' : 'Copy'"></span>
145
+ </div>
146
+ </button>
147
+ </div>
148
+
149
+ {# Interactive JSON Tree #}
150
+ <div class="bg-gray-50 dark:bg-gray-900 rounded-lg p-6 overflow-x-auto border border-gray-200 dark:border-gray-700 font-mono text-sm"
151
+ x-html="renderJSON(jsonData, 0)">
152
+ </div>
153
+ </div>
154
+ {% else %}
155
+ <div class="text-center py-12 text-gray-500 dark:text-gray-400">
156
+ <svg class="w-16 h-16 mx-auto mb-4 opacity-50" fill="none" stroke="currentColor" viewBox="0 0 24 24">
157
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"/>
158
+ </svg>
159
+ <p class="font-medium">No response data</p>
160
+ </div>
161
+ {% endif %}
162
+ </div>
163
+
164
+ {# Raw View #}
165
+ <div x-show="activeTab === 'raw'">
166
+ <pre class="bg-gray-50 dark:bg-gray-900 rounded-lg p-6 overflow-x-auto border border-gray-200 dark:border-gray-700 text-sm font-mono text-gray-800 dark:text-gray-300">{{ content }}</pre>
167
+ </div>
168
+
169
+ {# Headers View #}
170
+ {% if display_edit_forms %}
171
+ <div x-show="activeTab === 'headers'">
172
+ <div class="space-y-2">
173
+ {% for key, val in response.items %}
174
+ <div class="flex items-start border-b border-gray-200 dark:border-gray-700 pb-2">
175
+ <span class="font-mono text-sm text-blue-600 dark:text-blue-400 w-1/3">{{ key }}:</span>
176
+ <span class="font-mono text-sm text-gray-700 dark:text-gray-300 flex-1">{{ val }}</span>
177
+ </div>
178
+ {% endfor %}
179
+ </div>
180
+ </div>
181
+ {% endif %}
182
+ </div>
183
+ </div>
184
+
185
+ {# Request Forms #}
186
+ {% if display_edit_forms %}
187
+ <div class="card overflow-hidden">
188
+ <div class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 px-6 py-4">
189
+ <h2 class="text-lg font-bold flex items-center text-gray-900 dark:text-white">
190
+ <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
191
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/>
192
+ </svg>
193
+ Make a Request
194
+ </h2>
195
+ </div>
196
+
197
+ <div class="p-6">
198
+ {# Request method tabs #}
199
+ <div x-data="{ method: '{{ request.method|default:'GET' }}' }" class="space-y-6">
200
+
201
+ {# Method selector #}
202
+ <div class="flex flex-wrap gap-2">
203
+ {% for method in allowed_methods %}
204
+ {% if method != "OPTIONS" %}
205
+ <button @click="method = '{{ method }}'"
206
+ :class="method === '{{ method }}' ? 'ring-2 ring-offset-1' : 'opacity-60'"
207
+ class="badge px-4 py-2
208
+ {% if method == 'GET' %}badge-get ring-blue-500
209
+ {% elif method == 'POST' %}badge-post ring-green-500
210
+ {% elif method == 'PUT' %}badge-put ring-orange-500
211
+ {% elif method == 'PATCH' %}badge-patch ring-purple-500
212
+ {% elif method == 'DELETE' %}badge-delete ring-red-500
213
+ {% else %}bg-gray-500 text-white ring-gray-500{% endif %}">
214
+ {{ method }}
215
+ </button>
216
+ {% endif %}
217
+ {% endfor %}
218
+ </div>
219
+
220
+ {# Forms for each method #}
221
+ {% for method in allowed_methods %}
222
+ {% if method != "OPTIONS" %}
223
+ <div x-show="method === '{{ method }}'" x-transition>
224
+ {% with form=raw_data_put_or_patch_form %}
225
+ {% if method == "PUT" or method == "PATCH" %}
226
+ {% include "rest_framework/tailwind/forms/raw_data_form.html" %}
227
+ {% endif %}
228
+ {% endwith %}
229
+
230
+ {% with form=raw_data_post_form %}
231
+ {% if method == "POST" %}
232
+ {% include "rest_framework/tailwind/forms/raw_data_form.html" %}
233
+ {% endif %}
234
+ {% endwith %}
235
+
236
+ {% if method == "DELETE" %}
237
+ <form method="POST" action="{{ request.get_full_path }}" class="space-y-4">
238
+ {% csrf_token %}
239
+ <input type="hidden" name="_method" value="DELETE">
240
+ <div class="p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg">
241
+ <p class="text-red-800 dark:text-red-300 font-medium mb-4">
242
+ Are you sure you want to delete this resource?
243
+ </p>
244
+ <button type="submit"
245
+ class="px-6 py-2.5 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-all shadow-sm hover:shadow-md">
246
+ Confirm Delete
247
+ </button>
248
+ </div>
249
+ </form>
250
+ {% endif %}
251
+
252
+ {% if method == "GET" %}
253
+ <div class="p-4 bg-gray-50 dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg">
254
+ <p class="text-gray-700 dark:text-gray-300">
255
+ Use the filters sidebar or query parameters to customize your GET request.
256
+ </p>
257
+ </div>
258
+ {% endif %}
259
+ </div>
260
+ {% endif %}
261
+ {% endfor %}
262
+ </div>
263
+ </div>
264
+ </div>
265
+ {% endif %}
266
+
267
+ {# Pagination #}
268
+ {% if paginator %}
269
+ <div class="flex items-center justify-between card p-4">
270
+ <div class="text-sm text-gray-600 dark:text-gray-400">
271
+ Showing {{ paginator.start_index }} - {{ paginator.end_index }} of {{ paginator.count }} results
272
+ </div>
273
+
274
+ <div class="flex items-center space-x-2">
275
+ {% if page.has_previous %}
276
+ <a href="?page={{ page.previous_page_number }}"
277
+ class="px-4 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-600">
278
+ Previous
279
+ </a>
280
+ {% endif %}
281
+
282
+ <span class="px-4 py-2 bg-blue-600 text-white rounded-lg font-medium">
283
+ {{ page.number }}
284
+ </span>
285
+
286
+ {% if page.has_next %}
287
+ <a href="?page={{ page.next_page_number }}"
288
+ class="px-4 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-600">
289
+ Next
290
+ </a>
291
+ {% endif %}
292
+ </div>
293
+ </div>
294
+ {% endif %}
295
+
296
+ </div>
297
+
298
+ {# Sidebar with Info & Filters #}
299
+ <div class="xl:col-span-1 space-y-6">
300
+
301
+ {# API Info Card #}
302
+ <div class="card p-6 sticky top-24">
303
+ <h3 class="text-lg font-bold mb-4 flex items-center text-gray-900 dark:text-white">
304
+ <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
305
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
306
+ </svg>
307
+ API Info
308
+ </h3>
309
+
310
+ <div class="space-y-3 text-sm">
311
+ {# Allowed methods #}
312
+ <div>
313
+ <span class="text-gray-500 dark:text-gray-400 font-medium block mb-2">Allowed Methods</span>
314
+ <div class="flex flex-wrap gap-2">
315
+ {% for method in allowed_methods %}
316
+ <span class="badge px-2 py-0.5 text-xs
317
+ {% if method == 'GET' %}badge-get
318
+ {% elif method == 'POST' %}badge-post
319
+ {% elif method == 'PUT' %}badge-put
320
+ {% elif method == 'PATCH' %}badge-patch
321
+ {% elif method == 'DELETE' %}badge-delete
322
+ {% else %}bg-gradient-to-r from-gray-500 to-gray-600 text-white{% endif %}">
323
+ {{ method }}
324
+ </span>
325
+ {% endfor %}
326
+ </div>
327
+ </div>
328
+
329
+ {# Content type #}
330
+ {% if available_formats %}
331
+ <div>
332
+ <span class="text-gray-500 dark:text-gray-400 font-medium block mb-2">Response Formats</span>
333
+ <div class="flex flex-wrap gap-1.5">
334
+ {% for format in available_formats %}
335
+ <a href="{% add_query_param request api_settings.URL_FORMAT_OVERRIDE format %}"
336
+ class="px-2 py-1 rounded text-xs font-mono bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600">
337
+ {{ format }}
338
+ </a>
339
+ {% endfor %}
340
+ </div>
341
+ </div>
342
+ {% endif %}
343
+
344
+ {# Version info if available #}
345
+ {% if api_version %}
346
+ <div>
347
+ <span class="text-gray-500 dark:text-gray-400 font-medium">API Version</span>
348
+ <p class="font-mono text-blue-600 dark:text-blue-400">{{ api_version }}</p>
349
+ </div>
350
+ {% endif %}
351
+ </div>
352
+ </div>
353
+
354
+ {# Filters #}
355
+ {% if filter_form %}
356
+ <div class="card overflow-hidden">
357
+ <div class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 px-6 py-4">
358
+ <h3 class="text-lg font-bold flex items-center text-gray-900 dark:text-white">
359
+ <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
360
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"/>
361
+ </svg>
362
+ Filters
363
+ </h3>
364
+ </div>
365
+
366
+ <div class="p-6">
367
+ {% include "rest_framework/tailwind/forms/filter_form.html" %}
368
+ </div>
369
+ </div>
370
+ {% endif %}
371
+
372
+ </div>
373
+ </div>
374
+
375
+ {% endblock %}