django-cfg 1.4.83__py3-none-any.whl → 1.4.84__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.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (133) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/dashboard/__init__.py +8 -0
  3. django_cfg/apps/dashboard/api/__init__.py +27 -0
  4. django_cfg/apps/dashboard/api/serializers.py +165 -0
  5. django_cfg/apps/dashboard/api/viewsets.py +257 -0
  6. django_cfg/apps/dashboard/apps.py +23 -0
  7. django_cfg/apps/dashboard/services/__init__.py +11 -0
  8. django_cfg/apps/dashboard/services/statistics_service.py +235 -0
  9. django_cfg/apps/dashboard/services/system_health_service.py +280 -0
  10. django_cfg/apps/dashboard/urls.py +23 -0
  11. django_cfg/apps/frontend/views.py +5 -0
  12. django_cfg/apps/urls.py +2 -1
  13. django_cfg/core/builders/apps_builder.py +1 -0
  14. django_cfg/modules/django_client/core/parser/openapi30.py +12 -5
  15. django_cfg/modules/django_client/core/parser/openapi31.py +12 -5
  16. django_cfg/pyproject.toml +1 -1
  17. django_cfg/static/frontend/admin/404.html +1 -1
  18. django_cfg/static/frontend/admin/500.html +1 -1
  19. django_cfg/static/frontend/admin/_next/static/-Zk0eDB7OJOEFrFyR5BwZ/_buildManifest.js +1 -0
  20. django_cfg/static/frontend/admin/_next/static/chunks/{43076.55dd23b6cd68edb0.js → 20695.a7d37b6c40ad3f58.js} +1 -1
  21. django_cfg/static/frontend/admin/_next/static/chunks/{25033.d626f78bc99bc4a1.js → 25033.ee3e206d5a2877b6.js} +2 -2
  22. django_cfg/static/frontend/admin/_next/static/chunks/{25892.964150a58f94ce06.js → 25892.5cbed319f9226fdc.js} +1 -1
  23. django_cfg/static/frontend/admin/_next/static/chunks/{2d7a934f.dfef67639279d59d.js → 2d7a934f.329c61f23af1a7ec.js} +1 -1
  24. django_cfg/static/frontend/admin/_next/static/chunks/{30649.00c679812a56aee3.js → 30649.963cfb7268b5864a.js} +1 -1
  25. django_cfg/static/frontend/admin/_next/static/chunks/{30875.784491146c38dbcb.js → 30875.82c3741757b8aa32.js} +1 -1
  26. django_cfg/static/frontend/admin/_next/static/chunks/{32163.ab0ca435b3f26c04.js → 32163.109a03a7252f1508.js} +1 -1
  27. django_cfg/static/frontend/admin/_next/static/chunks/43076-4be6a9794e9c3e8b.js +1 -0
  28. django_cfg/static/frontend/admin/_next/static/chunks/{49978.fb8ba7ee52ffe666.js → 49978.db5a86a8eb233f35.js} +1 -1
  29. django_cfg/static/frontend/admin/_next/static/chunks/50314-79c02212788f1ec7.js +1 -0
  30. django_cfg/static/frontend/admin/_next/static/chunks/{50319.f786248384877960.js → 50319.fd78c7f7e3f1966e.js} +1 -1
  31. django_cfg/static/frontend/admin/_next/static/chunks/{52908.b690e323d8f8efdd.js → 52908.da5b850b0bc0970c.js} +1 -1
  32. django_cfg/static/frontend/admin/_next/static/chunks/{53710.80ca863525d137db.js → 53710.7176bbee6c7b78be.js} +1 -1
  33. django_cfg/static/frontend/admin/_next/static/chunks/{57982.251fed8d58adcf53.js → 57982.2c90b33b0934522a.js} +2 -2
  34. django_cfg/static/frontend/admin/_next/static/chunks/{60181.86e18057c4caaa97.js → 60181.c94d78d10eb5da37.js} +1 -1
  35. django_cfg/static/frontend/admin/_next/static/chunks/{60374.bde0ec1249aa79c6.js → 60374.5d80cfc45439b2b0.js} +1 -1
  36. django_cfg/static/frontend/admin/_next/static/chunks/{6884.7b1db804c88280ed.js → 6884.624d563508cf6db4.js} +1 -1
  37. django_cfg/static/frontend/admin/_next/static/chunks/{69436.9515b854cdf4b57a.js → 69436.be44021e3d7c99c7.js} +1 -1
  38. django_cfg/static/frontend/admin/_next/static/chunks/{70628.00cdd98f672e684f.js → 70628.58e8c38a66543d5e.js} +1 -1
  39. django_cfg/static/frontend/admin/_next/static/chunks/{73218.a826c2248612b37f.js → 73218.d712e7bd678e23a8.js} +1 -1
  40. django_cfg/static/frontend/admin/_next/static/chunks/{76334.64fbaa923d9ac293.js → 76334.f43f2d8b4bbf8dd6.js} +1 -1
  41. django_cfg/static/frontend/admin/_next/static/chunks/{7799.2b280f8ddf067d49.js → 7799.1575cc212bc750c7.js} +1 -1
  42. django_cfg/static/frontend/admin/_next/static/chunks/{80574.620a8a5b4eb91c25.js → 80574.92638dd7b9979664.js} +1 -1
  43. django_cfg/static/frontend/admin/_next/static/chunks/{81127.a0603c3394892d4e.js → 81127.3ead500eec887152.js} +1 -1
  44. django_cfg/static/frontend/admin/_next/static/chunks/82296-a2c8d38f62224be5.js +1 -0
  45. django_cfg/static/frontend/admin/_next/static/chunks/{8383.eb6188b22c453e14.js → 8383.e25a442df26b2e26.js} +1 -1
  46. django_cfg/static/frontend/admin/_next/static/chunks/{85833.35e6ca25ac32a7d2.js → 85833.b0dead4fbcbfdd1b.js} +1 -1
  47. django_cfg/static/frontend/admin/_next/static/chunks/{95365.fc9d7653a78839d0.js → 95365.2b430045fc2e5acf.js} +1 -1
  48. django_cfg/static/frontend/admin/_next/static/chunks/{96424.0793b94836eb13a6.js → 96424.11d76570e9a94b85.js} +1 -1
  49. django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-16701a4e1bc3e6ac.js → _app-f25bec36bbdc9625.js} +46 -46
  50. django_cfg/static/frontend/admin/_next/static/chunks/pages/index-d7bc30185f52cbca.js +1 -0
  51. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{cookies-bb5507a122775f30.js → cookies-b39c7f22c066e2c6.js} +1 -1
  52. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{privacy-f8a3d8db1a197be3.js → privacy-5aedad0cf3a4f80f.js} +1 -1
  53. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{security-aba50addd2179f8f.js → security-dbd854d0d5d483e2.js} +1 -1
  54. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{terms-4aa35cd30b5c08ad.js → terms-f3e1d2b9e5edf12f.js} +1 -1
  55. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/centrifugo-22532c65971225eb.js +1 -0
  56. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/ui-669e8f2a785beba2.js +1 -0
  57. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-a8a9ba76f2c75354.js +1 -0
  58. django_cfg/static/frontend/admin/_next/static/chunks/{webpack-905bba30877f6490.js → webpack-92add5f95c66e349.js} +1 -1
  59. django_cfg/static/frontend/admin/_next/static/css/78d677ac1677c210.css +3 -0
  60. django_cfg/static/frontend/admin/auth.html +1 -1
  61. django_cfg/static/frontend/admin/index.html +1 -1
  62. django_cfg/static/frontend/admin/legal/cookies.html +1 -1
  63. django_cfg/static/frontend/admin/legal/privacy.html +1 -1
  64. django_cfg/static/frontend/admin/legal/security.html +1 -1
  65. django_cfg/static/frontend/admin/legal/terms.html +1 -1
  66. django_cfg/static/frontend/admin/private/centrifugo.html +1 -1
  67. django_cfg/static/frontend/admin/private/profile.html +1 -1
  68. django_cfg/static/frontend/admin/private/ui.html +1 -0
  69. django_cfg/static/frontend/admin/private.html +1 -1
  70. django_cfg/templates/admin/index.html +97 -63
  71. django_cfg/templates/admin_old/index.html +80 -0
  72. {django_cfg-1.4.83.dist-info → django_cfg-1.4.84.dist-info}/METADATA +1 -1
  73. {django_cfg-1.4.83.dist-info → django_cfg-1.4.84.dist-info}/RECORD +126 -113
  74. django_cfg/static/frontend/admin/_next/static/chunks/pages/index-88751d9f44a32105.js +0 -1
  75. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/centrifugo-1c5f00c26c77a47b.js +0 -1
  76. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-2f58633ddf63a5bc.js +0 -1
  77. django_cfg/static/frontend/admin/_next/static/chunks/pages/ui-0e6c0e35862789ec.js +0 -1
  78. django_cfg/static/frontend/admin/_next/static/css/806300fb98c42afb.css +0 -3
  79. django_cfg/static/frontend/admin/_next/static/ibMHm1p66p0UGKsKnDWxn/_buildManifest.js +0 -1
  80. django_cfg/static/frontend/admin/ui.html +0 -92
  81. /django_cfg/static/frontend/admin/_next/static/{ibMHm1p66p0UGKsKnDWxn → -Zk0eDB7OJOEFrFyR5BwZ}/_ssgManifest.js +0 -0
  82. /django_cfg/templates/{admin → admin_old}/components/action_grid.html +0 -0
  83. /django_cfg/templates/{admin → admin_old}/components/card.html +0 -0
  84. /django_cfg/templates/{admin → admin_old}/components/data_table.html +0 -0
  85. /django_cfg/templates/{admin → admin_old}/components/metric_card.html +0 -0
  86. /django_cfg/templates/{admin → admin_old}/components/modal.html +0 -0
  87. /django_cfg/templates/{admin → admin_old}/components/progress_bar.html +0 -0
  88. /django_cfg/templates/{admin → admin_old}/components/section_header.html +0 -0
  89. /django_cfg/templates/{admin → admin_old}/components/stat_item.html +0 -0
  90. /django_cfg/templates/{admin → admin_old}/components/stats_grid.html +0 -0
  91. /django_cfg/templates/{admin → admin_old}/components/status_badge.html +0 -0
  92. /django_cfg/templates/{admin → admin_old}/components/user_avatar.html +0 -0
  93. /django_cfg/templates/{admin → admin_old}/constance/change_list.html +0 -0
  94. /django_cfg/templates/{admin → admin_old}/constance/includes/default_value.html +0 -0
  95. /django_cfg/templates/{admin → admin_old}/constance/includes/fieldset_header.html +0 -0
  96. /django_cfg/templates/{admin → admin_old}/constance/includes/results_list.html +0 -0
  97. /django_cfg/templates/{admin → admin_old}/constance/includes/setting_row.html +0 -0
  98. /django_cfg/templates/{admin → admin_old}/constance/includes/table_headers.html +0 -0
  99. /django_cfg/templates/{admin → admin_old}/examples/component_class_example.html +0 -0
  100. /django_cfg/templates/{admin → admin_old}/import_export/change_list_export.html +0 -0
  101. /django_cfg/templates/{admin → admin_old}/import_export/change_list_import.html +0 -0
  102. /django_cfg/templates/{admin → admin_old}/import_export/change_list_import_export.html +0 -0
  103. /django_cfg/templates/{admin → admin_old}/index_new.html +0 -0
  104. /django_cfg/templates/{admin → admin_old}/layouts/base_dashboard.html +0 -0
  105. /django_cfg/templates/{admin → admin_old}/layouts/dashboard_with_tabs.html +0 -0
  106. /django_cfg/templates/{admin → admin_old}/sections/commands_section.html +0 -0
  107. /django_cfg/templates/{admin → admin_old}/sections/documentation_section.html +0 -0
  108. /django_cfg/templates/{admin → admin_old}/sections/overview_section.html +0 -0
  109. /django_cfg/templates/{admin → admin_old}/sections/stats_section.html +0 -0
  110. /django_cfg/templates/{admin → admin_old}/sections/system_section.html +0 -0
  111. /django_cfg/templates/{admin → admin_old}/sections/widgets_section.html +0 -0
  112. /django_cfg/templates/{admin → admin_old}/snippets/components/activity_tracker.html +0 -0
  113. /django_cfg/templates/{admin → admin_old}/snippets/components/charts_section.html +0 -0
  114. /django_cfg/templates/{admin → admin_old}/snippets/components/django_commands.html +0 -0
  115. /django_cfg/templates/{admin → admin_old}/snippets/components/quick_actions.html +0 -0
  116. /django_cfg/templates/{admin → admin_old}/snippets/components/recent_activity_improved.html +0 -0
  117. /django_cfg/templates/{admin → admin_old}/snippets/components/recent_users_table.html +0 -0
  118. /django_cfg/templates/{admin → admin_old}/snippets/components/stats_cards.html +0 -0
  119. /django_cfg/templates/{admin → admin_old}/snippets/components/stats_tiles.html +0 -0
  120. /django_cfg/templates/{admin → admin_old}/snippets/components/system_health.html +0 -0
  121. /django_cfg/templates/{admin → admin_old}/snippets/components/system_metrics.html +0 -0
  122. /django_cfg/templates/{admin → admin_old}/snippets/components/user_permissions.html +0 -0
  123. /django_cfg/templates/{admin → admin_old}/snippets/tabs/app_stats_tab.html +0 -0
  124. /django_cfg/templates/{admin → admin_old}/snippets/tabs/commands_tab.html +0 -0
  125. /django_cfg/templates/{admin → admin_old}/snippets/tabs/documentation_tab.html +0 -0
  126. /django_cfg/templates/{admin → admin_old}/snippets/tabs/overview_tab.html +0 -0
  127. /django_cfg/templates/{admin → admin_old}/snippets/tabs/stats_tab.html +0 -0
  128. /django_cfg/templates/{admin → admin_old}/snippets/tabs/users_tab.html +0 -0
  129. /django_cfg/templates/{admin → admin_old}/snippets/tabs/widgets_tab.html +0 -0
  130. /django_cfg/templates/{admin → admin_old}/snippets/zones/zones_table.html +0 -0
  131. {django_cfg-1.4.83.dist-info → django_cfg-1.4.84.dist-info}/WHEEL +0 -0
  132. {django_cfg-1.4.83.dist-info → django_cfg-1.4.84.dist-info}/entry_points.txt +0 -0
  133. {django_cfg-1.4.83.dist-info → django_cfg-1.4.84.dist-info}/licenses/LICENSE +0 -0
@@ -1,80 +1,114 @@
1
- {% extends 'admin/layouts/dashboard_with_tabs.html' %}
1
+ {% extends 'admin/base.html' %}
2
2
 
3
+ {% load static %}
3
4
  {% load unfold %}
4
5
 
5
- {% block overview_tab %}
6
- {% if overview_section %}
7
- {{ overview_section|safe }}
8
- {% else %}
9
- {% include 'admin/snippets/tabs/overview_tab.html' %}
10
- {% endif %}
11
- {% endblock %}
6
+ {% block extrahead %}
7
+ {{ block.super }}
8
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
9
+ <link rel="stylesheet" href="{% static 'admin/css/dashboard.css' %}">
10
+ <style>
11
+ #nextjs-dashboard-iframe {
12
+ width: 100%;
13
+ height: calc(100vh - 120px);
14
+ border: none;
15
+ display: block;
16
+ }
17
+
18
+ .iframe-container {
19
+ position: relative;
20
+ background: #f9fafb;
21
+ }
22
+
23
+ .iframe-loading {
24
+ position: absolute;
25
+ top: 50%;
26
+ left: 50%;
27
+ transform: translate(-50%, -50%);
28
+ text-align: center;
29
+ z-index: 1;
30
+ }
12
31
 
13
- {% block zones_tab %}
14
- {% if zones_section %}
15
- {{ zones_section|safe }}
16
- {% else %}
17
- {% include 'admin/snippets/zones/zones_table.html' %}
18
- {% endif %}
32
+ .iframe-loading.hidden {
33
+ display: none;
34
+ }
35
+
36
+ .spinner {
37
+ width: 48px;
38
+ height: 48px;
39
+ border: 4px solid #e5e7eb;
40
+ border-top-color: #3b82f6;
41
+ border-radius: 50%;
42
+ animation: spin 1s linear infinite;
43
+ margin: 0 auto 1rem;
44
+ }
45
+
46
+ @keyframes spin {
47
+ to { transform: rotate(360deg); }
48
+ }
49
+ </style>
19
50
  {% endblock %}
20
51
 
21
- {% block users_tab %}
22
- {% if users_section %}
23
- {{ users_section|safe }}
24
- {% else %}
25
- {% include 'admin/snippets/tabs/users_tab.html' %}
26
- {% endif %}
52
+ {% block breadcrumbs %}{% endblock %}
53
+
54
+ {% block title %}
55
+ {% if subtitle %}{{ subtitle }} | {% endif %}
56
+ {{ title }} | {{ site_title|default:'Django site admin' }}
27
57
  {% endblock %}
28
58
 
29
- {% block system_tab %}
30
- {% if system_section %}
31
- {{ system_section|safe }}
32
- {% else %}
33
- <div class="space-y-8">
34
- <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark mb-4">
35
- System Management
36
- </h2>
59
+ {% block branding %}
60
+ {% include "unfold/helpers/site_branding.html" %}
61
+ {% endblock %}
37
62
 
38
- <!-- System Health -->
39
- {% include 'admin/snippets/components/system_health.html' %}
63
+ {% block content %}
64
+ <!-- Main Container -->
65
+ {% component "unfold/components/container.html" %}
66
+ <!-- Next.js Dashboard iframe -->
67
+ <div class="iframe-container">
68
+ <div class="iframe-loading" id="iframe-loading">
69
+ <div class="spinner"></div>
70
+ <p>Loading Next.js Dashboard...</p>
71
+ </div>
40
72
 
41
- <!-- System Metrics -->
42
- {% include 'admin/snippets/components/system_metrics.html' %}
73
+ <iframe
74
+ id="nextjs-dashboard-iframe"
75
+ src="/cfg/admin/private/"
76
+ title="Next.js Dashboard"
77
+ sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-modals"
78
+ ></iframe>
79
+ </div>
43
80
 
44
- <!-- Activity Tracker -->
45
- {% include 'admin/snippets/components/activity_tracker.html' %}
81
+ <!-- Footer Section -->
82
+ <div class="text-center py-8 mt-5">
83
+ <p class="text-sm text-gray-500 dark:text-gray-400">
84
+ {% load django_cfg %}
85
+ <a href="{% lib_site_url %}" class="text-blue-600 hover:text-blue-700 font-medium">
86
+ {% lib_name %}
87
+ </a>
88
+ <span class="mx-2">•</span>
89
+ <a href="{% lib_health_url %}" class="text-blue-600 hover:text-blue-700">
90
+ System Health
91
+ </a>
92
+ </p>
46
93
  </div>
47
- {% endif %}
94
+ {% endcomponent %}
48
95
  {% endblock %}
49
96
 
50
- {% block stats_tab %}
51
- {% if stats_section %}
52
- {{ stats_section|safe }}
53
- {% else %}
54
- {% include 'admin/snippets/tabs/stats_tab.html' %}
55
- {% endif %}
56
- {% endblock %}
97
+ {% block footer %}
98
+ {{ block.super }}
99
+ <script>
100
+ (function() {
101
+ const iframe = document.getElementById('nextjs-dashboard-iframe');
102
+ const loading = document.getElementById('iframe-loading');
57
103
 
58
- {% block app_stats_tab %}
59
- {% if app_stats_section %}
60
- {{ app_stats_section|safe }}
61
- {% else %}
62
- {% include 'admin/snippets/tabs/app_stats_tab.html' with stats_groups=stats_groups %}
63
- {% endif %}
64
- {% endblock %}
104
+ iframe.addEventListener('load', function() {
105
+ loading.classList.add('hidden');
106
+ });
65
107
 
66
- {% block commands_tab %}
67
- {% if commands_section %}
68
- {{ commands_section|safe }}
69
- {% else %}
70
- {% include 'admin/snippets/tabs/commands_tab.html' %}
71
- {% endif %}
108
+ // Hide loading after 5 seconds if iframe doesn't load
109
+ setTimeout(() => {
110
+ loading.classList.add('hidden');
111
+ }, 5000);
112
+ })();
113
+ </script>
72
114
  {% endblock %}
73
-
74
- {% block widgets_tab %}
75
- {% if widgets_section %}
76
- {{ widgets_section|safe }}
77
- {% else %}
78
- {% include 'admin/snippets/tabs/widgets_tab.html' %}
79
- {% endif %}
80
- {% endblock %}
@@ -0,0 +1,80 @@
1
+ {% extends 'admin/layouts/dashboard_with_tabs.html' %}
2
+
3
+ {% load unfold %}
4
+
5
+ {% block overview_tab %}
6
+ {% if overview_section %}
7
+ {{ overview_section|safe }}
8
+ {% else %}
9
+ {% include 'admin/snippets/tabs/overview_tab.html' %}
10
+ {% endif %}
11
+ {% endblock %}
12
+
13
+ {% block zones_tab %}
14
+ {% if zones_section %}
15
+ {{ zones_section|safe }}
16
+ {% else %}
17
+ {% include 'admin/snippets/zones/zones_table.html' %}
18
+ {% endif %}
19
+ {% endblock %}
20
+
21
+ {% block users_tab %}
22
+ {% if users_section %}
23
+ {{ users_section|safe }}
24
+ {% else %}
25
+ {% include 'admin/snippets/tabs/users_tab.html' %}
26
+ {% endif %}
27
+ {% endblock %}
28
+
29
+ {% block system_tab %}
30
+ {% if system_section %}
31
+ {{ system_section|safe }}
32
+ {% else %}
33
+ <div class="space-y-8">
34
+ <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark mb-4">
35
+ System Management
36
+ </h2>
37
+
38
+ <!-- System Health -->
39
+ {% include 'admin/snippets/components/system_health.html' %}
40
+
41
+ <!-- System Metrics -->
42
+ {% include 'admin/snippets/components/system_metrics.html' %}
43
+
44
+ <!-- Activity Tracker -->
45
+ {% include 'admin/snippets/components/activity_tracker.html' %}
46
+ </div>
47
+ {% endif %}
48
+ {% endblock %}
49
+
50
+ {% block stats_tab %}
51
+ {% if stats_section %}
52
+ {{ stats_section|safe }}
53
+ {% else %}
54
+ {% include 'admin/snippets/tabs/stats_tab.html' %}
55
+ {% endif %}
56
+ {% endblock %}
57
+
58
+ {% block app_stats_tab %}
59
+ {% if app_stats_section %}
60
+ {{ app_stats_section|safe }}
61
+ {% else %}
62
+ {% include 'admin/snippets/tabs/app_stats_tab.html' with stats_groups=stats_groups %}
63
+ {% endif %}
64
+ {% endblock %}
65
+
66
+ {% block commands_tab %}
67
+ {% if commands_section %}
68
+ {{ commands_section|safe }}
69
+ {% else %}
70
+ {% include 'admin/snippets/tabs/commands_tab.html' %}
71
+ {% endif %}
72
+ {% endblock %}
73
+
74
+ {% block widgets_tab %}
75
+ {% if widgets_section %}
76
+ {{ widgets_section|safe }}
77
+ {% else %}
78
+ {% include 'admin/snippets/tabs/widgets_tab.html' %}
79
+ {% endif %}
80
+ {% endblock %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.83
3
+ Version: 1.4.84
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