django-cfg 1.4.10__py3-none-any.whl → 1.4.13__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 (225) hide show
  1. django_cfg/apps/agents/management/commands/create_agent.py +1 -1
  2. django_cfg/apps/agents/management/commands/orchestrator_status.py +3 -3
  3. django_cfg/apps/newsletter/serializers.py +40 -3
  4. django_cfg/apps/newsletter/views/campaigns.py +12 -3
  5. django_cfg/apps/newsletter/views/emails.py +14 -3
  6. django_cfg/apps/newsletter/views/subscriptions.py +12 -2
  7. django_cfg/apps/payments/views/api/currencies.py +49 -6
  8. django_cfg/apps/payments/views/api/webhooks.py +72 -7
  9. django_cfg/apps/payments/views/overview/serializers.py +34 -1
  10. django_cfg/apps/payments/views/overview/views.py +2 -1
  11. django_cfg/apps/payments/views/serializers/payments.py +6 -6
  12. django_cfg/apps/urls.py +106 -45
  13. django_cfg/core/base/config_model.py +2 -2
  14. django_cfg/core/constants.py +1 -1
  15. django_cfg/core/generation/integration_generators/__init__.py +1 -1
  16. django_cfg/core/generation/integration_generators/api.py +73 -49
  17. django_cfg/core/integration/display/startup.py +30 -22
  18. django_cfg/core/integration/url_integration.py +15 -16
  19. django_cfg/management/commands/check_endpoints.py +11 -160
  20. django_cfg/management/commands/check_settings.py +13 -348
  21. django_cfg/management/commands/clear_constance.py +13 -201
  22. django_cfg/management/commands/create_token.py +13 -321
  23. django_cfg/management/commands/generate_clients.py +23 -0
  24. django_cfg/management/commands/list_urls.py +13 -306
  25. django_cfg/management/commands/migrate_all.py +13 -126
  26. django_cfg/management/commands/migrator.py +13 -396
  27. django_cfg/management/commands/rundramatiq.py +15 -247
  28. django_cfg/management/commands/rundramatiq_simulator.py +12 -429
  29. django_cfg/management/commands/runserver_ngrok.py +15 -160
  30. django_cfg/management/commands/script.py +12 -488
  31. django_cfg/management/commands/show_config.py +12 -215
  32. django_cfg/management/commands/show_urls.py +12 -342
  33. django_cfg/management/commands/superuser.py +15 -295
  34. django_cfg/management/commands/task_clear.py +14 -217
  35. django_cfg/management/commands/task_status.py +13 -248
  36. django_cfg/management/commands/test_email.py +15 -86
  37. django_cfg/management/commands/test_telegram.py +14 -61
  38. django_cfg/management/commands/test_twilio.py +15 -105
  39. django_cfg/management/commands/tree.py +13 -383
  40. django_cfg/management/commands/validate_openapi.py +10 -0
  41. django_cfg/middleware/README.md +1 -1
  42. django_cfg/middleware/user_activity.py +3 -3
  43. django_cfg/models/__init__.py +2 -2
  44. django_cfg/models/api/drf/spectacular.py +6 -6
  45. django_cfg/models/django/__init__.py +2 -2
  46. django_cfg/models/django/openapi.py +162 -0
  47. django_cfg/modules/django_admin/management/commands/check_endpoints.py +169 -0
  48. django_cfg/modules/django_admin/management/commands/check_settings.py +355 -0
  49. django_cfg/modules/django_admin/management/commands/clear_constance.py +208 -0
  50. django_cfg/modules/django_admin/management/commands/create_token.py +328 -0
  51. django_cfg/modules/django_admin/management/commands/list_urls.py +313 -0
  52. django_cfg/modules/django_admin/management/commands/migrate_all.py +133 -0
  53. django_cfg/modules/django_admin/management/commands/migrator.py +403 -0
  54. django_cfg/modules/django_admin/management/commands/script.py +496 -0
  55. django_cfg/modules/django_admin/management/commands/show_config.py +225 -0
  56. django_cfg/modules/django_admin/management/commands/show_urls.py +361 -0
  57. django_cfg/modules/django_admin/management/commands/superuser.py +302 -0
  58. django_cfg/modules/django_admin/management/commands/tree.py +390 -0
  59. django_cfg/modules/django_client/__init__.py +20 -0
  60. django_cfg/modules/django_client/apps.py +35 -0
  61. django_cfg/modules/django_client/core/__init__.py +56 -0
  62. django_cfg/modules/django_client/core/archive/__init__.py +11 -0
  63. django_cfg/modules/django_client/core/archive/manager.py +134 -0
  64. django_cfg/modules/django_client/core/cli/__init__.py +12 -0
  65. django_cfg/modules/django_client/core/cli/main.py +235 -0
  66. django_cfg/modules/django_client/core/config/__init__.py +18 -0
  67. django_cfg/modules/django_client/core/config/config.py +208 -0
  68. django_cfg/modules/django_client/core/config/group.py +101 -0
  69. django_cfg/modules/django_client/core/config/service.py +209 -0
  70. django_cfg/modules/django_client/core/generator/__init__.py +115 -0
  71. django_cfg/modules/django_client/core/generator/base.py +838 -0
  72. django_cfg/modules/django_client/core/generator/python/__init__.py +16 -0
  73. django_cfg/modules/django_client/core/generator/python/async_client_gen.py +174 -0
  74. django_cfg/modules/django_client/core/generator/python/files_generator.py +180 -0
  75. django_cfg/modules/django_client/core/generator/python/generator.py +182 -0
  76. django_cfg/modules/django_client/core/generator/python/models_generator.py +318 -0
  77. django_cfg/modules/django_client/core/generator/python/operations_generator.py +278 -0
  78. django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +102 -0
  79. django_cfg/modules/django_client/core/generator/python/templates/__init__.py.jinja +9 -0
  80. django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +153 -0
  81. django_cfg/modules/django_client/core/generator/python/templates/app_init.py.jinja +6 -0
  82. django_cfg/modules/django_client/core/generator/python/templates/client/app_client.py.jinja +18 -0
  83. django_cfg/modules/django_client/core/generator/python/templates/client/flat_client.py.jinja +38 -0
  84. django_cfg/modules/django_client/core/generator/python/templates/client/main_client.py.jinja +68 -0
  85. django_cfg/modules/django_client/core/generator/python/templates/client/main_client_file.py.jinja +14 -0
  86. django_cfg/modules/django_client/core/generator/python/templates/client/operation_method.py.jinja +9 -0
  87. django_cfg/modules/django_client/core/generator/python/templates/client/sub_client.py.jinja +18 -0
  88. django_cfg/modules/django_client/core/generator/python/templates/client/sync_main_client.py.jinja +50 -0
  89. django_cfg/modules/django_client/core/generator/python/templates/client/sync_operation_method.py.jinja +9 -0
  90. django_cfg/modules/django_client/core/generator/python/templates/client/sync_sub_client.py.jinja +18 -0
  91. django_cfg/modules/django_client/core/generator/python/templates/client_file.py.jinja +13 -0
  92. django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +52 -0
  93. django_cfg/modules/django_client/core/generator/python/templates/models/app_models.py.jinja +17 -0
  94. django_cfg/modules/django_client/core/generator/python/templates/models/enum_class.py.jinja +17 -0
  95. django_cfg/modules/django_client/core/generator/python/templates/models/enums.py.jinja +8 -0
  96. django_cfg/modules/django_client/core/generator/python/templates/models/models.py.jinja +17 -0
  97. django_cfg/modules/django_client/core/generator/python/templates/models/schema_class.py.jinja +21 -0
  98. django_cfg/modules/django_client/core/generator/python/templates/pyproject.toml.jinja +55 -0
  99. django_cfg/modules/django_client/core/generator/python/templates/utils/logger.py.jinja +255 -0
  100. django_cfg/modules/django_client/core/generator/python/templates/utils/retry.py.jinja +271 -0
  101. django_cfg/modules/django_client/core/generator/python/templates/utils/schema.py.jinja +12 -0
  102. django_cfg/modules/django_client/core/generator/typescript/__init__.py +14 -0
  103. django_cfg/modules/django_client/core/generator/typescript/client_generator.py +165 -0
  104. django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +428 -0
  105. django_cfg/modules/django_client/core/generator/typescript/files_generator.py +207 -0
  106. django_cfg/modules/django_client/core/generator/typescript/generator.py +432 -0
  107. django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +536 -0
  108. django_cfg/modules/django_client/core/generator/typescript/models_generator.py +245 -0
  109. django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +298 -0
  110. django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +329 -0
  111. django_cfg/modules/django_client/core/generator/typescript/templates/api_instance.ts.jinja +131 -0
  112. django_cfg/modules/django_client/core/generator/typescript/templates/app_index.ts.jinja +2 -0
  113. django_cfg/modules/django_client/core/generator/typescript/templates/client/app_client.ts.jinja +18 -0
  114. django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +403 -0
  115. django_cfg/modules/django_client/core/generator/typescript/templates/client/flat_client.ts.jinja +109 -0
  116. django_cfg/modules/django_client/core/generator/typescript/templates/client/main_client_file.ts.jinja +10 -0
  117. django_cfg/modules/django_client/core/generator/typescript/templates/client/operation.ts.jinja +61 -0
  118. django_cfg/modules/django_client/core/generator/typescript/templates/client/sub_client.ts.jinja +15 -0
  119. django_cfg/modules/django_client/core/generator/typescript/templates/client_file.ts.jinja +9 -0
  120. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/fetchers.ts.jinja +45 -0
  121. django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/index.ts.jinja +30 -0
  122. django_cfg/modules/django_client/core/generator/typescript/templates/index.ts.jinja +5 -0
  123. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +268 -0
  124. django_cfg/modules/django_client/core/generator/typescript/templates/models/app_models.ts.jinja +8 -0
  125. django_cfg/modules/django_client/core/generator/typescript/templates/models/enums.ts.jinja +4 -0
  126. django_cfg/modules/django_client/core/generator/typescript/templates/models/models.ts.jinja +8 -0
  127. django_cfg/modules/django_client/core/generator/typescript/templates/package.json.jinja +52 -0
  128. django_cfg/modules/django_client/core/generator/typescript/templates/schemas/index.ts.jinja +21 -0
  129. django_cfg/modules/django_client/core/generator/typescript/templates/schemas/schema.ts.jinja +24 -0
  130. django_cfg/modules/django_client/core/generator/typescript/templates/tsconfig.json.jinja +20 -0
  131. django_cfg/modules/django_client/core/generator/typescript/templates/utils/errors.ts.jinja +116 -0
  132. django_cfg/modules/django_client/core/generator/typescript/templates/utils/http.ts.jinja +98 -0
  133. django_cfg/modules/django_client/core/generator/typescript/templates/utils/logger.ts.jinja +259 -0
  134. django_cfg/modules/django_client/core/generator/typescript/templates/utils/retry.ts.jinja +175 -0
  135. django_cfg/modules/django_client/core/generator/typescript/templates/utils/schema.ts.jinja +7 -0
  136. django_cfg/modules/django_client/core/generator/typescript/templates/utils/storage.ts.jinja +158 -0
  137. django_cfg/modules/django_client/core/groups/__init__.py +13 -0
  138. django_cfg/modules/django_client/core/groups/detector.py +178 -0
  139. django_cfg/modules/django_client/core/groups/manager.py +314 -0
  140. django_cfg/modules/django_client/core/ir/__init__.py +57 -0
  141. django_cfg/modules/django_client/core/ir/context.py +387 -0
  142. django_cfg/modules/django_client/core/ir/operation.py +518 -0
  143. django_cfg/modules/django_client/core/ir/schema.py +353 -0
  144. django_cfg/modules/django_client/core/parser/__init__.py +74 -0
  145. django_cfg/modules/django_client/core/parser/base.py +648 -0
  146. django_cfg/modules/django_client/core/parser/models/__init__.py +74 -0
  147. django_cfg/modules/django_client/core/parser/models/base.py +212 -0
  148. django_cfg/modules/django_client/core/parser/models/components.py +160 -0
  149. django_cfg/modules/django_client/core/parser/models/openapi.py +203 -0
  150. django_cfg/modules/django_client/core/parser/models/operation.py +207 -0
  151. django_cfg/modules/django_client/core/parser/models/schema.py +266 -0
  152. django_cfg/modules/django_client/core/parser/openapi30.py +56 -0
  153. django_cfg/modules/django_client/core/parser/openapi31.py +64 -0
  154. django_cfg/modules/django_client/core/validation/__init__.py +22 -0
  155. django_cfg/modules/django_client/core/validation/checker.py +134 -0
  156. django_cfg/modules/django_client/core/validation/fixer.py +216 -0
  157. django_cfg/modules/django_client/core/validation/reporter.py +480 -0
  158. django_cfg/modules/django_client/core/validation/rules/__init__.py +11 -0
  159. django_cfg/modules/django_client/core/validation/rules/base.py +96 -0
  160. django_cfg/modules/django_client/core/validation/rules/type_hints.py +288 -0
  161. django_cfg/modules/django_client/core/validation/safety.py +266 -0
  162. django_cfg/modules/django_client/management/__init__.py +3 -0
  163. django_cfg/modules/django_client/management/commands/__init__.py +3 -0
  164. django_cfg/modules/django_client/management/commands/generate_client.py +427 -0
  165. django_cfg/modules/django_client/management/commands/validate_openapi.py +343 -0
  166. django_cfg/modules/django_client/pytest.ini +30 -0
  167. django_cfg/modules/django_client/spectacular/__init__.py +10 -0
  168. django_cfg/modules/django_client/spectacular/async_detection.py +187 -0
  169. django_cfg/modules/django_client/spectacular/enum_naming.py +192 -0
  170. django_cfg/modules/django_client/urls.py +72 -0
  171. django_cfg/{dashboard → modules/django_dashboard}/DEBUG_README.md +2 -2
  172. django_cfg/{dashboard → modules/django_dashboard}/REFACTORING_SUMMARY.md +1 -1
  173. django_cfg/modules/django_dashboard/management/__init__.py +0 -0
  174. django_cfg/modules/django_dashboard/management/commands/__init__.py +0 -0
  175. django_cfg/{dashboard → modules/django_dashboard}/management/commands/debug_dashboard.py +5 -5
  176. django_cfg/modules/django_dashboard/sections/documentation.py +391 -0
  177. django_cfg/modules/django_email/management/__init__.py +0 -0
  178. django_cfg/modules/django_email/management/commands/__init__.py +0 -0
  179. django_cfg/modules/django_email/management/commands/test_email.py +93 -0
  180. django_cfg/modules/django_logging/LOGGING_GUIDE.md +1 -1
  181. django_cfg/modules/django_logging/django_logger.py +6 -6
  182. django_cfg/modules/django_ngrok/management/__init__.py +0 -0
  183. django_cfg/modules/django_ngrok/management/commands/__init__.py +0 -0
  184. django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +167 -0
  185. django_cfg/modules/django_tasks/management/__init__.py +0 -0
  186. django_cfg/modules/django_tasks/management/commands/__init__.py +0 -0
  187. django_cfg/modules/django_tasks/management/commands/rundramatiq.py +254 -0
  188. django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +437 -0
  189. django_cfg/modules/django_tasks/management/commands/task_clear.py +226 -0
  190. django_cfg/modules/django_tasks/management/commands/task_status.py +257 -0
  191. django_cfg/modules/django_telegram/management/__init__.py +0 -0
  192. django_cfg/modules/django_telegram/management/commands/__init__.py +0 -0
  193. django_cfg/modules/django_telegram/management/commands/test_telegram.py +68 -0
  194. django_cfg/modules/django_twilio/management/__init__.py +0 -0
  195. django_cfg/modules/django_twilio/management/commands/__init__.py +0 -0
  196. django_cfg/modules/django_twilio/management/commands/test_twilio.py +112 -0
  197. django_cfg/modules/django_unfold/callbacks/main.py +21 -10
  198. django_cfg/modules/django_unfold/callbacks/revolution.py +41 -36
  199. django_cfg/pyproject.toml +2 -6
  200. django_cfg/registry/third_party.py +5 -7
  201. django_cfg/routing/callbacks.py +1 -1
  202. django_cfg/static/admin/css/prose-unfold.css +666 -0
  203. django_cfg/templates/admin/index.html +8 -0
  204. django_cfg/templates/admin/index_new.html +13 -0
  205. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +15 -3
  206. django_cfg/templates/admin/sections/documentation_section.html +172 -0
  207. django_cfg/templates/admin/snippets/tabs/documentation_tab.html +231 -0
  208. {django_cfg-1.4.10.dist-info → django_cfg-1.4.13.dist-info}/METADATA +2 -2
  209. {django_cfg-1.4.10.dist-info → django_cfg-1.4.13.dist-info}/RECORD +224 -74
  210. django_cfg/management/commands/generate.py +0 -107
  211. /django_cfg/models/django/{revolution.py → revolution_legacy.py} +0 -0
  212. /django_cfg/{dashboard → modules/django_admin}/management/__init__.py +0 -0
  213. /django_cfg/{dashboard → modules/django_admin}/management/commands/__init__.py +0 -0
  214. /django_cfg/{dashboard → modules/django_dashboard}/__init__.py +0 -0
  215. /django_cfg/{dashboard → modules/django_dashboard}/components.py +0 -0
  216. /django_cfg/{dashboard → modules/django_dashboard}/debug.py +0 -0
  217. /django_cfg/{dashboard → modules/django_dashboard}/sections/__init__.py +0 -0
  218. /django_cfg/{dashboard → modules/django_dashboard}/sections/base.py +0 -0
  219. /django_cfg/{dashboard → modules/django_dashboard}/sections/commands.py +0 -0
  220. /django_cfg/{dashboard → modules/django_dashboard}/sections/overview.py +0 -0
  221. /django_cfg/{dashboard → modules/django_dashboard}/sections/stats.py +0 -0
  222. /django_cfg/{dashboard → modules/django_dashboard}/sections/system.py +0 -0
  223. {django_cfg-1.4.10.dist-info → django_cfg-1.4.13.dist-info}/WHEEL +0 -0
  224. {django_cfg-1.4.10.dist-info → django_cfg-1.4.13.dist-info}/entry_points.txt +0 -0
  225. {django_cfg-1.4.10.dist-info → django_cfg-1.4.13.dist-info}/licenses/LICENSE +0 -0
@@ -16,7 +16,7 @@
16
16
  if (!tabs.length || !contents.length) return;
17
17
 
18
18
  // Tab names for URL hash
19
- const tabNames = ['overview', 'zones', 'users', 'system', 'stats', 'app-stats', 'commands'];
19
+ const tabNames = ['overview', 'zones', 'users', 'system', 'stats', 'app-stats', 'commands', 'documentation'];
20
20
 
21
21
  // Global function for tab switching
22
22
  window.switchTab = function(idx, updateHash = true) {
@@ -493,14 +493,22 @@
493
493
  <span class="material-icons mr-2 align-middle text-sm">apps</span>
494
494
  App Stats
495
495
  </button>
496
- <button
497
- type="button"
496
+ <button
497
+ type="button"
498
498
  data-tab="6"
499
499
  class="px-4 py-3 rounded-t-lg focus:outline-none"
500
500
  >
501
501
  <span class="material-icons mr-2 align-middle text-sm">terminal</span>
502
502
  Commands
503
503
  </button>
504
+ <button
505
+ type="button"
506
+ data-tab="7"
507
+ class="px-4 py-3 rounded-t-lg focus:outline-none"
508
+ >
509
+ <span class="material-icons mr-2 align-middle text-sm">description</span>
510
+ Documentation
511
+ </button>
504
512
  </div>
505
513
 
506
514
  <div class="flex flex-col gap-5">
@@ -533,6 +541,10 @@
533
541
  <div class="tab-content" data-tab="6">
534
542
  {% block commands_tab %}{% endblock %}
535
543
  </div>
544
+
545
+ <div class="tab-content" data-tab="7">
546
+ {% block documentation_tab %}{% endblock %}
547
+ </div>
536
548
  </div>
537
549
 
538
550
  <!-- Footer Section -->
@@ -0,0 +1,172 @@
1
+ {% load static %}
2
+ <link rel="stylesheet" href="{% static 'admin/css/prose-unfold.css' %}">
3
+
4
+ <!-- Documentation Section -->
5
+ <div class="space-y-6">
6
+ {% if error %}
7
+ <!-- Error State -->
8
+ <div class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-default p-6">
9
+ <div class="flex items-center space-x-2 text-red-600 dark:text-red-400">
10
+ <span class="material-symbols-outlined">error</span>
11
+ <span class="font-semibold">Error loading documentation</span>
12
+ </div>
13
+ <p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ error }}</p>
14
+ </div>
15
+ {% elif commands_by_module %}
16
+ <!-- Commands by App -->
17
+ {% for app_key, app in commands_by_module.items %}
18
+ <div class="app-block bg-gradient-to-br from-white to-base-50 dark:from-base-800 dark:to-base-900 rounded-default shadow-md border border-base-200 dark:border-base-700 overflow-hidden mb-6">
19
+ <!-- App Header (Toggle) -->
20
+ <div class="app-toggle cursor-pointer select-none p-6 border-b border-base-200 dark:border-base-700 hover:bg-base-100/50 dark:hover:bg-base-900/30 transition-all duration-200"
21
+ data-app="{{ app_key }}">
22
+ <div class="w-full flex items-center justify-between">
23
+ <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark flex items-center">
24
+ <div class="w-10 h-10 rounded-lg bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center mr-3">
25
+ <span class="material-symbols-outlined text-primary-600 dark:text-primary-400">description</span>
26
+ </div>
27
+ <div>
28
+ <div class="flex items-center gap-2">
29
+ {{ app.display_name }}
30
+ <span class="px-2 py-0.5 text-xs font-medium rounded-full bg-base-200 dark:bg-base-700 text-font-default-light dark:text-font-default-dark app-count">
31
+ {{ app.commands|length }}
32
+ </span>
33
+ </div>
34
+ </div>
35
+ </h3>
36
+ <span class="material-symbols-outlined text-base-400 dark:text-base-500 toggle-icon transition-transform duration-200 select-none">expand_more</span>
37
+ </div>
38
+ </div>
39
+
40
+ <!-- App Content -->
41
+ <div class="app-content bg-base-50/30 dark:bg-base-900/30 p-6 space-y-4" data-app="{{ app_key }}" style="display: none;">
42
+
43
+ <!-- Commands List -->
44
+ <div class="space-y-3">
45
+ {% for command in app.commands %}
46
+ <div class="documentation-card bg-white dark:bg-base-900 rounded-default border border-base-200/60 dark:border-base-700/60 p-4 hover:border-base-300 dark:hover:border-base-600 transition-all duration-200">
47
+ <!-- Command Header -->
48
+ <div class="flex items-start justify-between mb-3">
49
+ <div class="flex-1">
50
+ <div class="flex items-center flex-wrap gap-2 mb-2">
51
+ <code class="text-sm font-mono bg-base-100 dark:bg-base-800 px-2 py-1 rounded text-primary-600 dark:text-primary-400">
52
+ python manage.py {{ command.name }}
53
+ </code>
54
+ {% if command.is_destructive %}
55
+ <span class="text-xs bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 px-2 py-0.5 rounded">
56
+ Destructive
57
+ </span>
58
+ {% endif %}
59
+ {% if command.web_executable %}
60
+ <span class="text-xs bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400 px-2 py-0.5 rounded">
61
+ Web Executable
62
+ </span>
63
+ {% endif %}
64
+ </div>
65
+ <p class="text-sm text-font-default-light dark:text-font-default-dark">
66
+ {{ command.help }}
67
+ </p>
68
+ </div>
69
+ </div>
70
+
71
+ <!-- Command Docstring -->
72
+ {% if command.docstring %}
73
+ <div class="mt-3 prose prose-unfold max-w-none text-sm">
74
+ {{ command.docstring }}
75
+ </div>
76
+ {% endif %}
77
+
78
+ <!-- Arguments -->
79
+ {% if command.arguments %}
80
+ <div class="mt-4 border-t border-base-200 dark:border-base-700 pt-3">
81
+ <h4 class="text-xs font-semibold text-font-important-light dark:text-font-important-dark uppercase mb-2">
82
+ Arguments
83
+ </h4>
84
+ <div class="space-y-2">
85
+ {% for arg in command.arguments %}
86
+ <div class="flex items-start space-x-2 text-sm">
87
+ <code class="font-mono bg-base-100 dark:bg-base-800 px-2 py-0.5 rounded text-xs text-primary-600 dark:text-primary-400 whitespace-nowrap">
88
+ {{ arg.options|join:", " }}
89
+ </code>
90
+ <div class="flex-1">
91
+ <span class="text-font-default-light dark:text-font-default-dark">
92
+ {{ arg.help }}
93
+ </span>
94
+ {% if arg.default %}
95
+ <span class="text-font-subtle-light dark:text-font-subtle-dark text-xs">
96
+ (default: {{ arg.default }})
97
+ </span>
98
+ {% endif %}
99
+ {% if arg.required %}
100
+ <span class="text-xs text-red-600 dark:text-red-400 ml-1">
101
+ *required
102
+ </span>
103
+ {% endif %}
104
+ </div>
105
+ </div>
106
+ {% endfor %}
107
+ </div>
108
+ </div>
109
+ {% endif %}
110
+ </div>
111
+ {% endfor %}
112
+ </div>
113
+ </div>
114
+ </div>
115
+ {% endfor %}
116
+
117
+ <!-- Summary Stats -->
118
+ <div class="bg-white dark:bg-base-800 rounded-default shadow-sm border border-base-200 dark:border-base-700 p-4 mt-6">
119
+ <div class="flex items-center justify-center gap-8 text-sm text-font-subtle-light dark:text-font-subtle-dark">
120
+ <div class="flex items-center gap-2">
121
+ <span class="material-symbols-outlined text-base">folder</span>
122
+ <span>{{ total_modules }} module{{ total_modules|pluralize }}</span>
123
+ </div>
124
+ <div class="flex items-center gap-2">
125
+ <span class="material-symbols-outlined text-base">terminal</span>
126
+ <span>{{ total_commands }} command{{ total_commands|pluralize }}</span>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ {% else %}
131
+ <!-- Empty State -->
132
+ <div class="bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700 p-12 text-center">
133
+ <span class="material-symbols-outlined text-6xl text-base-400 dark:text-base-500 mb-4">inbox</span>
134
+ <h3 class="text-lg font-medium text-font-important-light dark:text-font-important-dark mb-2">
135
+ No Commands Found
136
+ </h3>
137
+ <p class="text-font-subtle-light dark:text-font-subtle-dark">
138
+ No Django-CFG management commands available.
139
+ </p>
140
+ </div>
141
+ {% endif %}
142
+ </div>
143
+
144
+ <!-- JavaScript for App Toggle -->
145
+ <script>
146
+ document.addEventListener('DOMContentLoaded', function() {
147
+ // App toggle functionality
148
+ const appToggles = document.querySelectorAll('.app-toggle');
149
+ appToggles.forEach(toggle => {
150
+ toggle.addEventListener('click', function() {
151
+ const app = this.dataset.app;
152
+ const content = document.querySelector(`.app-content[data-app="${app}"]`);
153
+ const icon = this.querySelector('.toggle-icon');
154
+
155
+ if (content.style.display === 'none' || !content.style.display) {
156
+ content.style.display = 'block';
157
+ icon.textContent = 'expand_less';
158
+ } else {
159
+ content.style.display = 'none';
160
+ icon.textContent = 'expand_more';
161
+ }
162
+ });
163
+
164
+ // Initialize - start collapsed
165
+ const app = toggle.dataset.app;
166
+ const content = document.querySelector(`.app-content[data-app="${app}"]`);
167
+ if (content) {
168
+ content.style.display = 'none';
169
+ }
170
+ });
171
+ });
172
+ </script>
@@ -0,0 +1,231 @@
1
+ {% load unfold %}
2
+
3
+ <!-- Documentation Tab Content -->
4
+ <div class="space-y-8">
5
+ <!-- Header -->
6
+ <div class="">
7
+ <div class="flex items-center justify-between mb-6">
8
+ <div>
9
+ <h1 class="text-2xl font-bold text-font-important-light dark:text-font-important-dark">Commands Documentation</h1>
10
+ <p class="text-font-default-light dark:text-font-default-dark mt-2">
11
+ Complete guide to all Django management commands
12
+ </p>
13
+ </div>
14
+ <div class="flex items-center space-x-2 text-sm text-font-subtle-light dark:text-font-subtle-dark">
15
+ <span class="material-icons text-blue-500">menu_book</span>
16
+ <span>Management Commands Reference</span>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <!-- Documentation Content -->
22
+ <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 overflow-hidden shadow-sm">
23
+ <div class="p-6">
24
+ {% if documentation_content %}
25
+ <!-- Rendered Markdown Content -->
26
+ <div class="prose prose-slate dark:prose-invert max-w-none">
27
+ {{ documentation_content|safe }}
28
+ </div>
29
+ {% else %}
30
+ <!-- Fallback: Display README.md as code -->
31
+ <div class="markdown-body">
32
+ <pre class="bg-base-50 dark:bg-base-800 rounded-lg p-4 overflow-x-auto text-sm"><code>{% if readme_content %}{{ readme_content }}{% else %}Documentation not found.
33
+
34
+ Please ensure that README.md exists at:
35
+ /src/django_cfg/management/README.md{% endif %}</code></pre>
36
+ </div>
37
+ {% endif %}
38
+ </div>
39
+ </div>
40
+ </div>
41
+
42
+ <style>
43
+ /* Markdown/Documentation styling */
44
+ .prose {
45
+ color: #374151;
46
+ }
47
+
48
+ .dark .prose {
49
+ color: #d1d5db;
50
+ }
51
+
52
+ .prose h1 {
53
+ font-size: 2em;
54
+ font-weight: 700;
55
+ margin-top: 0;
56
+ margin-bottom: 1em;
57
+ color: #111827;
58
+ border-bottom: 2px solid #e5e7eb;
59
+ padding-bottom: 0.5em;
60
+ }
61
+
62
+ .dark .prose h1 {
63
+ color: #f9fafb;
64
+ border-bottom-color: #374151;
65
+ }
66
+
67
+ .prose h2 {
68
+ font-size: 1.5em;
69
+ font-weight: 600;
70
+ margin-top: 2em;
71
+ margin-bottom: 1em;
72
+ color: #1f2937;
73
+ }
74
+
75
+ .dark .prose h2 {
76
+ color: #e5e7eb;
77
+ }
78
+
79
+ .prose h3 {
80
+ font-size: 1.25em;
81
+ font-weight: 600;
82
+ margin-top: 1.5em;
83
+ margin-bottom: 0.75em;
84
+ color: #374151;
85
+ }
86
+
87
+ .dark .prose h3 {
88
+ color: #d1d5db;
89
+ }
90
+
91
+ .prose h4 {
92
+ font-size: 1.1em;
93
+ font-weight: 600;
94
+ margin-top: 1.25em;
95
+ margin-bottom: 0.5em;
96
+ color: #4b5563;
97
+ }
98
+
99
+ .dark .prose h4 {
100
+ color: #9ca3af;
101
+ }
102
+
103
+ .prose p {
104
+ margin-top: 1em;
105
+ margin-bottom: 1em;
106
+ line-height: 1.75;
107
+ }
108
+
109
+ .prose ul, .prose ol {
110
+ margin-top: 1em;
111
+ margin-bottom: 1em;
112
+ padding-left: 1.5em;
113
+ }
114
+
115
+ .prose li {
116
+ margin-top: 0.5em;
117
+ margin-bottom: 0.5em;
118
+ }
119
+
120
+ .prose code {
121
+ background-color: #f3f4f6;
122
+ color: #ef4444;
123
+ padding: 0.2em 0.4em;
124
+ border-radius: 0.25em;
125
+ font-size: 0.875em;
126
+ font-family: 'Courier New', monospace;
127
+ }
128
+
129
+ .dark .prose code {
130
+ background-color: #374151;
131
+ color: #fca5a5;
132
+ }
133
+
134
+ .prose pre {
135
+ background-color: #f9fafb;
136
+ border: 1px solid #e5e7eb;
137
+ border-radius: 0.5em;
138
+ padding: 1em;
139
+ overflow-x: auto;
140
+ margin-top: 1em;
141
+ margin-bottom: 1em;
142
+ }
143
+
144
+ .dark .prose pre {
145
+ background-color: #1f2937;
146
+ border-color: #374151;
147
+ }
148
+
149
+ .prose pre code {
150
+ background-color: transparent;
151
+ color: #111827;
152
+ padding: 0;
153
+ border-radius: 0;
154
+ }
155
+
156
+ .dark .prose pre code {
157
+ color: #f9fafb;
158
+ }
159
+
160
+ .prose a {
161
+ color: #2563eb;
162
+ text-decoration: none;
163
+ font-weight: 500;
164
+ }
165
+
166
+ .prose a:hover {
167
+ text-decoration: underline;
168
+ }
169
+
170
+ .dark .prose a {
171
+ color: #60a5fa;
172
+ }
173
+
174
+ .prose blockquote {
175
+ border-left: 4px solid #e5e7eb;
176
+ padding-left: 1em;
177
+ font-style: italic;
178
+ color: #6b7280;
179
+ margin-top: 1em;
180
+ margin-bottom: 1em;
181
+ }
182
+
183
+ .dark .prose blockquote {
184
+ border-left-color: #374151;
185
+ color: #9ca3af;
186
+ }
187
+
188
+ .prose table {
189
+ width: 100%;
190
+ border-collapse: collapse;
191
+ margin-top: 1em;
192
+ margin-bottom: 1em;
193
+ }
194
+
195
+ .prose th,
196
+ .prose td {
197
+ border: 1px solid #e5e7eb;
198
+ padding: 0.5em 1em;
199
+ text-align: left;
200
+ }
201
+
202
+ .dark .prose th,
203
+ .dark .prose td {
204
+ border-color: #374151;
205
+ }
206
+
207
+ .prose th {
208
+ background-color: #f9fafb;
209
+ font-weight: 600;
210
+ }
211
+
212
+ .dark .prose th {
213
+ background-color: #1f2937;
214
+ }
215
+
216
+ .prose hr {
217
+ border: 0;
218
+ border-top: 1px solid #e5e7eb;
219
+ margin-top: 2em;
220
+ margin-bottom: 2em;
221
+ }
222
+
223
+ .dark .prose hr {
224
+ border-top-color: #374151;
225
+ }
226
+
227
+ /* Add emoji support */
228
+ .prose :where(p, li, td):not(:where([class~="not-prose"] *)) {
229
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
230
+ }
231
+ </style>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.10
3
+ Version: 1.4.13
4
4
  Summary: Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -45,7 +45,6 @@ Requires-Dist: django-import-export<5.0,>=4.3.0
45
45
  Requires-Dist: django-json-widget<3.0,>=2.0.0
46
46
  Requires-Dist: django-ratelimit<5.0.0,>=4.1.0
47
47
  Requires-Dist: django-redis<7.0,>=6.0.0
48
- Requires-Dist: django-revolution>=1.0.46
49
48
  Requires-Dist: django-tailwind[reload]<5.0.0,>=4.2.0
50
49
  Requires-Dist: django-unfold<1.0,>=0.64.0
51
50
  Requires-Dist: djangorestframework-simplejwt<6.0,>=5.5.0
@@ -56,6 +55,7 @@ Requires-Dist: drf-nested-routers<1.0,>=0.94.0
56
55
  Requires-Dist: drf-spectacular-sidecar<2026.0,>=2025.8.0
57
56
  Requires-Dist: drf-spectacular<1.0,>=0.28.0
58
57
  Requires-Dist: hiredis<4.0,>=2.0.0
58
+ Requires-Dist: jinja2<4.0.0,>=3.1.6
59
59
  Requires-Dist: loguru<1.0,>=0.7.0
60
60
  Requires-Dist: lxml<7.0,>=6.0.0
61
61
  Requires-Dist: mypy<2.0.0,>=1.18.2