django-cfg 1.4.9__py3-none-any.whl → 1.4.11__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.
- django_cfg/apps/agents/management/commands/create_agent.py +1 -1
- django_cfg/apps/agents/management/commands/orchestrator_status.py +3 -3
- django_cfg/apps/newsletter/serializers.py +40 -3
- django_cfg/apps/newsletter/views/campaigns.py +12 -3
- django_cfg/apps/newsletter/views/emails.py +14 -3
- django_cfg/apps/newsletter/views/subscriptions.py +12 -2
- django_cfg/apps/payments/middleware/api_access.py +6 -2
- django_cfg/apps/payments/middleware/rate_limiting.py +2 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +5 -1
- django_cfg/apps/payments/models/managers/api_key_managers.py +0 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +0 -1
- django_cfg/apps/payments/services/core/balance_service.py +5 -5
- django_cfg/apps/payments/services/core/subscription_service.py +1 -2
- django_cfg/apps/payments/views/api/balances.py +8 -7
- django_cfg/apps/payments/views/api/base.py +10 -6
- django_cfg/apps/payments/views/api/currencies.py +53 -10
- django_cfg/apps/payments/views/api/payments.py +3 -1
- django_cfg/apps/payments/views/api/subscriptions.py +2 -5
- django_cfg/apps/payments/views/api/webhooks.py +72 -7
- django_cfg/apps/payments/views/overview/serializers.py +34 -1
- django_cfg/apps/payments/views/overview/views.py +2 -1
- django_cfg/apps/payments/views/serializers/payments.py +6 -6
- django_cfg/apps/urls.py +106 -45
- django_cfg/core/base/config_model.py +2 -2
- django_cfg/core/constants.py +1 -1
- django_cfg/core/generation/integration_generators/__init__.py +1 -1
- django_cfg/core/generation/integration_generators/api.py +82 -41
- django_cfg/core/integration/display/startup.py +30 -22
- django_cfg/core/integration/url_integration.py +15 -16
- django_cfg/dashboard/sections/documentation.py +391 -0
- django_cfg/management/commands/check_endpoints.py +11 -160
- django_cfg/management/commands/check_settings.py +13 -265
- django_cfg/management/commands/clear_constance.py +13 -201
- django_cfg/management/commands/create_token.py +13 -321
- django_cfg/management/commands/generate_clients.py +23 -0
- django_cfg/management/commands/list_urls.py +13 -306
- django_cfg/management/commands/migrate_all.py +13 -126
- django_cfg/management/commands/migrator.py +13 -396
- django_cfg/management/commands/rundramatiq.py +15 -247
- django_cfg/management/commands/rundramatiq_simulator.py +12 -429
- django_cfg/management/commands/runserver_ngrok.py +15 -160
- django_cfg/management/commands/script.py +12 -488
- django_cfg/management/commands/show_config.py +12 -215
- django_cfg/management/commands/show_urls.py +12 -342
- django_cfg/management/commands/superuser.py +15 -295
- django_cfg/management/commands/task_clear.py +14 -217
- django_cfg/management/commands/task_status.py +13 -248
- django_cfg/management/commands/test_email.py +15 -86
- django_cfg/management/commands/test_telegram.py +14 -61
- django_cfg/management/commands/test_twilio.py +15 -105
- django_cfg/management/commands/tree.py +13 -383
- django_cfg/management/commands/validate_openapi.py +10 -0
- django_cfg/middleware/README.md +1 -1
- django_cfg/middleware/user_activity.py +3 -3
- django_cfg/models/__init__.py +2 -2
- django_cfg/models/api/drf/spectacular.py +6 -6
- django_cfg/models/django/__init__.py +2 -2
- django_cfg/models/django/openapi.py +238 -0
- django_cfg/models/django/{revolution.py → revolution_legacy.py} +8 -0
- django_cfg/modules/django_admin/management/__init__.py +0 -0
- django_cfg/modules/django_admin/management/commands/__init__.py +0 -0
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +169 -0
- django_cfg/modules/django_admin/management/commands/check_settings.py +355 -0
- django_cfg/modules/django_admin/management/commands/clear_constance.py +208 -0
- django_cfg/modules/django_admin/management/commands/create_token.py +328 -0
- django_cfg/modules/django_admin/management/commands/list_urls.py +313 -0
- django_cfg/modules/django_admin/management/commands/migrate_all.py +133 -0
- django_cfg/modules/django_admin/management/commands/migrator.py +403 -0
- django_cfg/modules/django_admin/management/commands/script.py +496 -0
- django_cfg/modules/django_admin/management/commands/show_config.py +225 -0
- django_cfg/modules/django_admin/management/commands/show_urls.py +361 -0
- django_cfg/modules/django_admin/management/commands/superuser.py +302 -0
- django_cfg/modules/django_admin/management/commands/tree.py +390 -0
- django_cfg/modules/django_client/__init__.py +20 -0
- django_cfg/modules/django_client/apps.py +35 -0
- django_cfg/modules/django_client/core/__init__.py +56 -0
- django_cfg/modules/django_client/core/archive/__init__.py +11 -0
- django_cfg/modules/django_client/core/archive/manager.py +134 -0
- django_cfg/modules/django_client/core/cli/__init__.py +12 -0
- django_cfg/modules/django_client/core/cli/main.py +235 -0
- django_cfg/modules/django_client/core/config/__init__.py +18 -0
- django_cfg/modules/django_client/core/config/config.py +188 -0
- django_cfg/modules/django_client/core/config/group.py +101 -0
- django_cfg/modules/django_client/core/config/service.py +209 -0
- django_cfg/modules/django_client/core/generator/__init__.py +115 -0
- django_cfg/modules/django_client/core/generator/base.py +767 -0
- django_cfg/modules/django_client/core/generator/python.py +751 -0
- django_cfg/modules/django_client/core/generator/templates/python/__init__.py.jinja +9 -0
- django_cfg/modules/django_client/core/generator/templates/python/api_wrapper.py.jinja +130 -0
- django_cfg/modules/django_client/core/generator/templates/python/app_init.py.jinja +6 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/app_client.py.jinja +18 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/flat_client.py.jinja +38 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/main_client.py.jinja +50 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/main_client_file.py.jinja +13 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/operation_method.py.jinja +7 -0
- django_cfg/modules/django_client/core/generator/templates/python/client/sub_client.py.jinja +11 -0
- django_cfg/modules/django_client/core/generator/templates/python/client_file.py.jinja +13 -0
- django_cfg/modules/django_client/core/generator/templates/python/main_init.py.jinja +50 -0
- django_cfg/modules/django_client/core/generator/templates/python/models/app_models.py.jinja +17 -0
- django_cfg/modules/django_client/core/generator/templates/python/models/enum_class.py.jinja +15 -0
- django_cfg/modules/django_client/core/generator/templates/python/models/enums.py.jinja +8 -0
- django_cfg/modules/django_client/core/generator/templates/python/models/models.py.jinja +17 -0
- django_cfg/modules/django_client/core/generator/templates/python/models/schema_class.py.jinja +19 -0
- django_cfg/modules/django_client/core/generator/templates/python/utils/logger.py.jinja +255 -0
- django_cfg/modules/django_client/core/generator/templates/python/utils/schema.py.jinja +12 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/app_index.ts.jinja +2 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/app_client.ts.jinja +18 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/client.ts.jinja +327 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/flat_client.ts.jinja +109 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/main_client_file.ts.jinja +9 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/operation.ts.jinja +61 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client/sub_client.ts.jinja +15 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/client_file.ts.jinja +9 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/index.ts.jinja +5 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/main_index.ts.jinja +206 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/models/app_models.ts.jinja +8 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/models/enums.ts.jinja +4 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/models/models.ts.jinja +8 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/utils/errors.ts.jinja +114 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/utils/http.ts.jinja +98 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/utils/logger.ts.jinja +251 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/utils/schema.ts.jinja +7 -0
- django_cfg/modules/django_client/core/generator/templates/typescript/utils/storage.ts.jinja +114 -0
- django_cfg/modules/django_client/core/generator/typescript.py +872 -0
- django_cfg/modules/django_client/core/groups/__init__.py +13 -0
- django_cfg/modules/django_client/core/groups/detector.py +178 -0
- django_cfg/modules/django_client/core/groups/manager.py +314 -0
- django_cfg/modules/django_client/core/ir/__init__.py +57 -0
- django_cfg/modules/django_client/core/ir/context.py +387 -0
- django_cfg/modules/django_client/core/ir/operation.py +518 -0
- django_cfg/modules/django_client/core/ir/schema.py +353 -0
- django_cfg/modules/django_client/core/parser/__init__.py +74 -0
- django_cfg/modules/django_client/core/parser/base.py +648 -0
- django_cfg/modules/django_client/core/parser/models/__init__.py +74 -0
- django_cfg/modules/django_client/core/parser/models/base.py +212 -0
- django_cfg/modules/django_client/core/parser/models/components.py +160 -0
- django_cfg/modules/django_client/core/parser/models/openapi.py +203 -0
- django_cfg/modules/django_client/core/parser/models/operation.py +207 -0
- django_cfg/modules/django_client/core/parser/models/schema.py +266 -0
- django_cfg/modules/django_client/core/parser/openapi30.py +56 -0
- django_cfg/modules/django_client/core/parser/openapi31.py +64 -0
- django_cfg/modules/django_client/core/validation/__init__.py +22 -0
- django_cfg/modules/django_client/core/validation/checker.py +134 -0
- django_cfg/modules/django_client/core/validation/fixer.py +216 -0
- django_cfg/modules/django_client/core/validation/reporter.py +480 -0
- django_cfg/modules/django_client/core/validation/rules/__init__.py +11 -0
- django_cfg/modules/django_client/core/validation/rules/base.py +96 -0
- django_cfg/modules/django_client/core/validation/rules/type_hints.py +288 -0
- django_cfg/modules/django_client/core/validation/safety.py +266 -0
- django_cfg/modules/django_client/management/__init__.py +3 -0
- django_cfg/modules/django_client/management/commands/__init__.py +3 -0
- django_cfg/modules/django_client/management/commands/generate_client.py +422 -0
- django_cfg/modules/django_client/management/commands/validate_openapi.py +343 -0
- django_cfg/modules/django_client/spectacular/__init__.py +9 -0
- django_cfg/modules/django_client/spectacular/enum_naming.py +192 -0
- django_cfg/modules/django_client/urls.py +72 -0
- django_cfg/modules/django_email/management/__init__.py +0 -0
- django_cfg/modules/django_email/management/commands/__init__.py +0 -0
- django_cfg/modules/django_email/management/commands/test_email.py +93 -0
- django_cfg/modules/django_logging/django_logger.py +6 -6
- django_cfg/modules/django_ngrok/management/__init__.py +0 -0
- django_cfg/modules/django_ngrok/management/commands/__init__.py +0 -0
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +167 -0
- django_cfg/modules/django_tasks/management/__init__.py +0 -0
- django_cfg/modules/django_tasks/management/commands/__init__.py +0 -0
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +254 -0
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +437 -0
- django_cfg/modules/django_tasks/management/commands/task_clear.py +226 -0
- django_cfg/modules/django_tasks/management/commands/task_status.py +257 -0
- django_cfg/modules/django_telegram/management/__init__.py +0 -0
- django_cfg/modules/django_telegram/management/commands/__init__.py +0 -0
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +68 -0
- django_cfg/modules/django_twilio/management/__init__.py +0 -0
- django_cfg/modules/django_twilio/management/commands/__init__.py +0 -0
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +112 -0
- django_cfg/modules/django_unfold/callbacks/main.py +16 -5
- django_cfg/modules/django_unfold/callbacks/revolution.py +41 -36
- django_cfg/modules/django_unfold/dashboard.py +1 -1
- django_cfg/pyproject.toml +2 -6
- django_cfg/registry/third_party.py +5 -7
- django_cfg/routing/callbacks.py +1 -1
- django_cfg/static/admin/css/prose-unfold.css +666 -0
- django_cfg/templates/admin/index.html +8 -0
- django_cfg/templates/admin/index_new.html +13 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +15 -3
- django_cfg/templates/admin/sections/documentation_section.html +172 -0
- django_cfg/templates/admin/snippets/tabs/documentation_tab.html +231 -0
- {django_cfg-1.4.9.dist-info → django_cfg-1.4.11.dist-info}/METADATA +2 -2
- {django_cfg-1.4.9.dist-info → django_cfg-1.4.11.dist-info}/RECORD +192 -71
- django_cfg/management/commands/generate.py +0 -107
- {django_cfg-1.4.9.dist-info → django_cfg-1.4.11.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.9.dist-info → django_cfg-1.4.11.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.9.dist-info → django_cfg-1.4.11.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.
|
3
|
+
Version: 1.4.11
|
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.45
|
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
|