django-cfg 1.2.6__py3-none-any.whl → 1.2.8__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 (53) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/agents/admin/execution_admin.py +9 -2
  3. django_cfg/apps/agents/admin/registry_admin.py +10 -2
  4. django_cfg/apps/agents/admin/toolsets_admin.py +14 -3
  5. django_cfg/apps/knowbase/admin/archive_admin.py +3 -2
  6. django_cfg/apps/knowbase/admin/chat_admin.py +3 -2
  7. django_cfg/apps/knowbase/admin/document_admin.py +11 -2
  8. django_cfg/apps/knowbase/admin/external_data_admin.py +2 -1
  9. django_cfg/apps/urls.py +2 -2
  10. django_cfg/modules/django_import_export/__init__.py +12 -5
  11. django_cfg/modules/django_unfold/callbacks/__init__.py +9 -0
  12. django_cfg/modules/django_unfold/callbacks/actions.py +50 -0
  13. django_cfg/modules/django_unfold/callbacks/base.py +98 -0
  14. django_cfg/modules/django_unfold/callbacks/charts.py +224 -0
  15. django_cfg/modules/django_unfold/callbacks/commands.py +40 -0
  16. django_cfg/modules/django_unfold/callbacks/main.py +191 -0
  17. django_cfg/modules/django_unfold/callbacks/revolution.py +76 -0
  18. django_cfg/modules/django_unfold/callbacks/statistics.py +240 -0
  19. django_cfg/modules/django_unfold/callbacks/system.py +180 -0
  20. django_cfg/modules/django_unfold/callbacks/users.py +65 -0
  21. django_cfg/modules/django_unfold/models/config.py +10 -3
  22. django_cfg/modules/django_unfold/tailwind.py +68 -0
  23. django_cfg/templates/admin/components/action_grid.html +49 -0
  24. django_cfg/templates/admin/components/card.html +50 -0
  25. django_cfg/templates/admin/components/data_table.html +67 -0
  26. django_cfg/templates/admin/components/metric_card.html +39 -0
  27. django_cfg/templates/admin/components/modal.html +58 -0
  28. django_cfg/templates/admin/components/progress_bar.html +25 -0
  29. django_cfg/templates/admin/components/section_header.html +26 -0
  30. django_cfg/templates/admin/components/stat_item.html +32 -0
  31. django_cfg/templates/admin/components/stats_grid.html +72 -0
  32. django_cfg/templates/admin/components/status_badge.html +28 -0
  33. django_cfg/templates/admin/components/user_avatar.html +27 -0
  34. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +7 -7
  35. django_cfg/templates/admin/snippets/components/activity_tracker.html +48 -11
  36. django_cfg/templates/admin/snippets/components/charts_section.html +63 -13
  37. django_cfg/templates/admin/snippets/components/django_commands.html +18 -18
  38. django_cfg/templates/admin/snippets/components/quick_actions.html +3 -47
  39. django_cfg/templates/admin/snippets/components/recent_activity.html +28 -38
  40. django_cfg/templates/admin/snippets/components/recent_users_table.html +22 -53
  41. django_cfg/templates/admin/snippets/components/stats_cards.html +2 -66
  42. django_cfg/templates/admin/snippets/components/system_health.html +13 -63
  43. django_cfg/templates/admin/snippets/components/system_metrics.html +8 -25
  44. django_cfg/templates/admin/snippets/tabs/commands_tab.html +1 -1
  45. django_cfg/templates/admin/snippets/tabs/overview_tab.html +4 -4
  46. django_cfg/templates/admin/snippets/zones/zones_table.html +12 -33
  47. django_cfg/templatetags/django_cfg.py +2 -1
  48. {django_cfg-1.2.6.dist-info → django_cfg-1.2.8.dist-info}/METADATA +2 -1
  49. {django_cfg-1.2.6.dist-info → django_cfg-1.2.8.dist-info}/RECORD +52 -32
  50. django_cfg/modules/django_unfold/callbacks.py +0 -795
  51. {django_cfg-1.2.6.dist-info → django_cfg-1.2.8.dist-info}/WHEEL +0 -0
  52. {django_cfg-1.2.6.dist-info → django_cfg-1.2.8.dist-info}/entry_points.txt +0 -0
  53. {django_cfg-1.2.6.dist-info → django_cfg-1.2.8.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,21 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- Recent Users Table with semantic colors -->
3
+ <!-- Recent Users Table using reusable components -->
4
+ {% capture as table_actions silent %}
5
+ <span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Last 24 hours</span>
6
+ {% if user_admin_urls %}
7
+ <a href="{{ user_admin_urls.list }}" class="text-sm text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 flex items-center">
8
+ View all
9
+ <span class="material-icons text-xs ml-1">arrow_forward</span>
10
+ </a>
11
+ {% else %}
12
+ <a href="/admin/accounts/customuser/" class="text-sm text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 flex items-center">
13
+ View all
14
+ <span class="material-icons text-xs ml-1">arrow_forward</span>
15
+ </a>
16
+ {% endif %}
17
+ {% endcapture %}
18
+
4
19
  <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 overflow-hidden shadow-xs">
5
20
  <!-- Card Header -->
6
21
  <div class="px-6 py-4 border-b border-base-200 dark:border-base-700 bg-base-50 dark:bg-base-800">
@@ -10,18 +25,7 @@
10
25
  <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Recent Users</h3>
11
26
  </div>
12
27
  <div class="flex items-center space-x-2">
13
- <span class="text-xs text-font-subtle-light dark:text-font-subtle-dark">Last 24 hours</span>
14
- {% if user_admin_urls %}
15
- <a href="{{ user_admin_urls.list }}" class="text-sm text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 flex items-center">
16
- View all
17
- <span class="material-icons text-xs ml-1">arrow_forward</span>
18
- </a>
19
- {% else %}
20
- <a href="/admin/accounts/customuser/" class="text-sm text-primary-600 hover:text-primary-700 dark:text-primary-500 dark:hover:text-primary-400 flex items-center">
21
- View all
22
- <span class="material-icons text-xs ml-1">arrow_forward</span>
23
- </a>
24
- {% endif %}
28
+ {{ table_actions }}
25
29
  </div>
26
30
  </div>
27
31
  </div>
@@ -47,53 +51,18 @@
47
51
  {% for user in recent_users %}
48
52
  <tr class="hover:bg-base-100 dark:hover:bg-base-800 transition-colors duration-150">
49
53
  <td class="px-6 py-4 whitespace-nowrap">
50
- <div class="flex items-center">
51
- <div class="h-8 w-8 bg-primary-100 dark:bg-primary-900/20 rounded-full flex items-center justify-center mr-3">
52
- <span class="text-sm font-medium text-primary-600 dark:text-primary-400">
53
- {{ user.username|default:user.email|slice:":1"|upper }}
54
- </span>
55
- </div>
56
- <div>
57
- <div class="text-sm font-medium text-font-default-light dark:text-font-default-dark">
58
- {{ user.username|default:user.email|truncatechars:20 }}
59
- </div>
60
- {% if user.email and user.username %}
61
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">
62
- {{ user.email|truncatechars:30 }}
63
- </div>
64
- {% endif %}
65
- </div>
66
- </div>
54
+ {% include 'admin/components/user_avatar.html' with name=user.username email=user.email show_details=True %}
67
55
  </td>
68
56
  <td class="px-6 py-4 whitespace-nowrap">
69
- {% if user.is_active %}
70
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400">
71
- <span class="material-icons text-xs mr-1">check_circle</span>
72
- Active
73
- </span>
74
- {% else %}
75
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-base-100 dark:bg-base-800 text-font-subtle-light dark:text-font-subtle-dark">
76
- <span class="material-icons text-xs mr-1">cancel</span>
77
- Inactive
78
- </span>
79
- {% endif %}
57
+ {% include 'admin/components/status_badge.html' with status=user.is_active|yesno:'active,inactive' %}
80
58
  </td>
81
59
  <td class="px-6 py-4 whitespace-nowrap">
82
60
  {% if user.is_superuser %}
83
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400">
84
- <span class="material-icons text-xs mr-1">admin_panel_settings</span>
85
- Admin
86
- </span>
61
+ {% include 'admin/components/status_badge.html' with status='error' text='Admin' icon='admin_panel_settings' %}
87
62
  {% elif user.is_staff %}
88
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400">
89
- <span class="material-icons text-xs mr-1">manage_accounts</span>
90
- Staff
91
- </span>
63
+ {% include 'admin/components/status_badge.html' with status='info' text='Staff' icon='manage_accounts' %}
92
64
  {% else %}
93
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-base-100 dark:bg-base-800 text-font-subtle-light dark:text-font-subtle-dark">
94
- <span class="material-icons text-xs mr-1">person</span>
95
- User
96
- </span>
65
+ {% include 'admin/components/status_badge.html' with status='' text='User' icon='person' %}
97
66
  {% endif %}
98
67
  </td>
99
68
  <td class="px-6 py-4 whitespace-nowrap text-sm text-font-subtle-light dark:text-font-subtle-dark">
@@ -1,68 +1,4 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- Modern Statistics Cards Grid -->
4
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-8 w-full">
5
- {% for card in cards %}
6
- <div class="bg-white dark:bg-base-900 rounded-xl shadow-sm hover:shadow-md transition-all duration-300 border border-base-200 dark:border-base-700 overflow-hidden group">
7
- <div class="p-5">
8
- <div class="flex items-start justify-between">
9
- <div class="flex-1">
10
- <!-- Title -->
11
- <div class="text-xs font-semibold text-font-subtle-light dark:text-font-subtle-dark uppercase tracking-wider mb-2">
12
- {{ card.title }}
13
- </div>
14
-
15
- <!-- Value -->
16
- <div class="text-2xl font-bold text-font-important-light dark:text-font-important-dark mb-1">
17
- {{ card.value }}
18
- </div>
19
-
20
- <!-- Change indicator -->
21
- {% if card.change %}
22
- <div class="flex items-center">
23
- <div class="flex items-center px-2 py-1 rounded-full text-xs font-medium
24
- {% if card.change_type == 'positive' %}bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400
25
- {% elif card.change_type == 'negative' %}bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400
26
- {% else %}bg-base-100 dark:bg-base-800 text-font-default-light dark:text-font-default-dark{% endif %}">
27
-
28
- <span class="material-icons text-xs mr-1">
29
- {% if card.change_type == 'positive' %}arrow_upward
30
- {% elif card.change_type == 'negative' %}arrow_downward
31
- {% else %}remove{% endif %}
32
- </span>
33
- {{ card.change }}
34
- </div>
35
- </div>
36
- {% endif %}
37
-
38
- <!-- Description -->
39
- {% if card.description %}
40
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark mt-1">
41
- {{ card.description }}
42
- </div>
43
- {% endif %}
44
- </div>
45
-
46
- <!-- Icon -->
47
- <div class="flex-shrink-0 ml-3">
48
- <div class="w-10 h-10 flex items-center justify-center group-hover:scale-110 transition-transform duration-300">
49
- <span class="material-icons text-2xl
50
- {% if card.change_type == 'positive' %}text-green-600 dark:text-green-400
51
- {% elif card.change_type == 'negative' %}text-red-600 dark:text-red-400
52
- {% else %}text-primary-600 dark:text-primary-400{% endif %}">
53
- {{ card.icon }}
54
- </span>
55
- </div>
56
- </div>
57
- </div>
58
- </div>
59
-
60
- <!-- Subtle bottom accent -->
61
- <div class="h-1 w-full
62
- {% if card.change_type == 'positive' %}bg-gradient-to-r from-green-400 to-green-600
63
- {% elif card.change_type == 'negative' %}bg-gradient-to-r from-red-400 to-red-600
64
- {% else %}bg-gradient-to-r from-primary-400 to-primary-600{% endif %}">
65
- </div>
66
- </div>
67
- {% endfor %}
68
- </div>
3
+ <!-- Modern Statistics Cards Grid using reusable component -->
4
+ {% include 'admin/components/stats_grid.html' with stats=cards cols=4 gap=4 class="mb-8 w-full" %}
@@ -1,72 +1,22 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- System Health Grid with semantic colors -->
3
+ <!-- System Health Grid using reusable components -->
4
4
  <div class="mt-8 w-full">
5
- <div class="flex items-center mb-6">
6
- <div class="flex items-center justify-center w-8 h-8 bg-green-100 dark:bg-green-900/20 rounded-lg mr-3">
7
- <span class="material-icons text-green-600 dark:text-green-400 text-lg">health_and_safety</span>
8
- </div>
9
- <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
10
- System Health
11
- </h2>
12
- </div>
5
+ {% include 'admin/components/section_header.html' with title='System Health' icon='health_and_safety' icon_color='green' %}
13
6
 
14
7
  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 w-full">
15
8
  {% for key, value in system_health.items %}
16
- <div class="bg-white dark:bg-base-900 rounded-lg p-5 border border-base-200 dark:border-base-700 hover:shadow-md transition-shadow duration-200">
17
- <div class="flex items-center justify-between">
18
- <div class="flex items-center space-x-3">
19
- <div class="flex-shrink-0">
20
- {% if key == "database_status" %}
21
- <span class="material-icons text-green-600 dark:text-green-400">storage</span>
22
- {% elif key == "cache_status" %}
23
- <span class="material-icons text-primary-600 dark:text-primary-400">memory</span>
24
- {% elif key == "queue_status" %}
25
- <span class="material-icons text-amber-600 dark:text-amber-400">queue</span>
26
- {% elif key == "storage_status" %}
27
- <span class="material-icons text-blue-600 dark:text-blue-400">folder</span>
28
- {% else %}
29
- <span class="material-icons text-font-subtle-light dark:text-font-subtle-dark">info</span>
30
- {% endif %}
31
- </div>
32
- <div>
33
- <div class="text-sm font-medium text-font-default-light dark:text-font-default-dark">
34
- {% if key == "database_status" %}Database
35
- {% elif key == "cache_status" %}Cache
36
- {% elif key == "queue_status" %}Queue
37
- {% elif key == "storage_status" %}Storage
38
- {% else %}{{ key|title }}{% endif %}
39
- </div>
40
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark mt-1">
41
- {% if key == "database_status" %}Connection & queries
42
- {% elif key == "cache_status" %}Redis & memory
43
- {% elif key == "queue_status" %}Background jobs
44
- {% elif key == "storage_status" %}Disk & files
45
- {% else %}System component{% endif %}
46
- </div>
47
- </div>
48
- </div>
49
-
50
- <div class="flex-shrink-0">
51
- {% if value == 'healthy' or value == 'ok' or value == 'connected' %}
52
- <span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400">
53
- <span class="material-icons text-xs mr-1">check_circle</span>
54
- {{ value|title }}
55
- </span>
56
- {% elif value == 'warning' or value == 'degraded' %}
57
- <span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-amber-100 dark:bg-amber-900/20 text-amber-600 dark:text-amber-400">
58
- <span class="material-icons text-xs mr-1">warning</span>
59
- {{ value|title }}
60
- </span>
61
- {% else %}
62
- <span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400">
63
- <span class="material-icons text-xs mr-1">error</span>
64
- {{ value|title }}
65
- </span>
66
- {% endif %}
67
- </div>
68
- </div>
69
- </div>
9
+ {% if key == "database_status" %}
10
+ {% include 'admin/components/metric_card.html' with title='Database' description='Connection & queries' icon='storage' status=value|yesno:'healthy,error' status_text=value|title %}
11
+ {% elif key == "cache_status" %}
12
+ {% include 'admin/components/metric_card.html' with title='Cache' description='Redis & memory' icon='memory' status=value|yesno:'healthy,error' status_text=value|title %}
13
+ {% elif key == "queue_status" %}
14
+ {% include 'admin/components/metric_card.html' with title='Queue' description='Background jobs' icon='queue' status=value|yesno:'healthy,error' status_text=value|title %}
15
+ {% elif key == "storage_status" %}
16
+ {% include 'admin/components/metric_card.html' with title='Storage' description='Disk & files' icon='folder' status=value|yesno:'healthy,error' status_text=value|title %}
17
+ {% else %}
18
+ {% include 'admin/components/metric_card.html' with title=key|title description='System component' icon='info' status=value|yesno:'healthy,error' status_text=value|title %}
19
+ {% endif %}
70
20
  {% endfor %}
71
21
  </div>
72
22
  </div>
@@ -2,17 +2,7 @@
2
2
 
3
3
  <!-- System Metrics -->
4
4
  <div class="mt-8 w-full">
5
- <div class="flex items-center mb-6">
6
- <div class="flex items-center justify-center w-8 h-8 bg-blue-100 dark:bg-blue-900/20 rounded-lg mr-3">
7
- <span class="material-icons text-blue-600 dark:text-blue-400 text-lg">analytics</span>
8
- </div>
9
- <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
10
- System Metrics
11
- </h2>
12
- <span class="ml-auto text-xs text-font-subtle-light dark:text-font-subtle-dark bg-base-100 dark:bg-base-800 px-2 py-1 rounded-full">
13
- Live Data
14
- </span>
15
- </div>
5
+ {% include 'admin/components/section_header.html' with title='System Metrics' icon='analytics' icon_color='blue' badge='Live Data' %}
16
6
 
17
7
  <div class="grid grid-cols-1 md:grid-cols-2 gap-6 w-full">
18
8
  {% if system_metrics %}
@@ -27,8 +17,7 @@
27
17
  {% else %}text-red-600 dark:text-red-400{% endif %} mr-2">storage</span>
28
18
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">{{ system_metrics.database.type }}</span>
29
19
  </div>
30
- {% component "unfold/components/progress.html" with value=system_metrics.database.health_percentage title="Connection Health" description=system_metrics.database.description %}
31
- {% endcomponent %}
20
+ {% include 'admin/components/progress_bar.html' with value=system_metrics.database.health_percentage title="Connection Health" description=system_metrics.database.description %}
32
21
  {% endcomponent %}
33
22
  </div>
34
23
  {% endif %}
@@ -44,8 +33,7 @@
44
33
  {% else %}text-red-600 dark:text-red-400{% endif %} mr-2">memory</span>
45
34
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">{{ system_metrics.cache.type }}</span>
46
35
  </div>
47
- {% component "unfold/components/progress.html" with value=system_metrics.cache.health_percentage title="Performance" description=system_metrics.cache.description %}
48
- {% endcomponent %}
36
+ {% include 'admin/components/progress_bar.html' with value=system_metrics.cache.health_percentage title="Performance" description=system_metrics.cache.description %}
49
37
  {% endcomponent %}
50
38
  </div>
51
39
  {% endif %}
@@ -61,8 +49,7 @@
61
49
  {% else %}text-gray-600 dark:text-gray-400{% endif %} mr-2">folder</span>
62
50
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">{{ system_metrics.storage.type }}</span>
63
51
  </div>
64
- {% component "unfold/components/progress.html" with value=system_metrics.storage.health_percentage title="Usage" description=system_metrics.storage.description %}
65
- {% endcomponent %}
52
+ {% include 'admin/components/progress_bar.html' with value=system_metrics.storage.health_percentage title="Usage" description=system_metrics.storage.description %}
66
53
  {% endcomponent %}
67
54
  </div>
68
55
  {% endif %}
@@ -78,8 +65,7 @@
78
65
  {% else %}text-red-600 dark:text-red-400{% endif %} mr-2">api</span>
79
66
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">{{ system_metrics.api.type }}</span>
80
67
  </div>
81
- {% component "unfold/components/progress.html" with value=system_metrics.api.health_percentage title="URL Patterns" description=system_metrics.api.description %}
82
- {% endcomponent %}
68
+ {% include 'admin/components/progress_bar.html' with value=system_metrics.api.health_percentage title="URL Patterns" description=system_metrics.api.description %}
83
69
  {% endcomponent %}
84
70
  </div>
85
71
  {% endif %}
@@ -91,8 +77,7 @@
91
77
  <span class="material-icons text-green-600 dark:text-green-400 mr-2">storage</span>
92
78
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">PostgreSQL</span>
93
79
  </div>
94
- {% component "unfold/components/progress.html" with value=85 title="Connection Health" description="Healthy - 85%" %}
95
- {% endcomponent %}
80
+ {% include 'admin/components/progress_bar.html' with value=85 title="Connection Health" description="Healthy - 85%" %}
96
81
  {% endcomponent %}
97
82
  </div>
98
83
 
@@ -102,8 +87,7 @@
102
87
  <span class="material-icons text-primary-600 dark:text-primary-500 mr-2">memory</span>
103
88
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Memory Cache</span>
104
89
  </div>
105
- {% component "unfold/components/progress.html" with value=90 title="Performance" description="Optimal - 90%" %}
106
- {% endcomponent %}
90
+ {% include 'admin/components/progress_bar.html' with value=90 title="Performance" description="Optimal - 90%" %}
107
91
  {% endcomponent %}
108
92
  </div>
109
93
 
@@ -113,8 +97,7 @@
113
97
  <span class="material-icons text-amber-600 dark:text-amber-400 mr-2">folder</span>
114
98
  <span class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Disk Space</span>
115
99
  </div>
116
- {% component "unfold/components/progress.html" with value=67 title="Usage" description="67% used (33% free)" %}
117
- {% endcomponent %}
100
+ {% include 'admin/components/progress_bar.html' with value=67 title="Usage" description="67% used (33% free)" %}
118
101
  {% endcomponent %}
119
102
  </div>
120
103
  {% endif %}
@@ -3,7 +3,7 @@
3
3
  <!-- Commands Tab Content -->
4
4
  <div class="space-y-8">
5
5
  <!-- Header -->
6
- <div class="bg-white dark:bg-base-900 rounded-xl p-8 border border-base-200 dark:border-base-700 shadow-xs">
6
+ <div class="">
7
7
  <div class="flex items-center justify-between mb-6">
8
8
  <div>
9
9
  <h1 class="text-2xl font-bold text-font-important-light dark:text-font-important-dark">Django Commands</h1>
@@ -1,9 +1,9 @@
1
1
  {% load unfold %}
2
2
 
3
3
  <!-- Overview Tab Content -->
4
- <div class="space-y-10">
4
+ <div class="space-y-10 flex flex-col gap-8">
5
5
  <!-- Hero Section with Key Metrics -->
6
- <div class="mb-6">
6
+ <div>
7
7
  <div class="flex items-center justify-between mb-6">
8
8
  <div>
9
9
  <h1 class="text-2xl font-bold text-font-important-light dark:text-font-important-dark">System Overview</h1>
@@ -22,7 +22,7 @@
22
22
  </div>
23
23
 
24
24
  <!-- Primary Dashboard Row -->
25
- <div class="grid grid-cols-1 xl:grid-cols-3 gap-8">
25
+ <div class="grid grid-cols-1 xl:grid-cols-3" style="gap: 2rem;">
26
26
  <!-- Main Content Area -->
27
27
  <div class="xl:col-span-2 space-y-8">
28
28
  <!-- Charts Section -->
@@ -70,7 +70,7 @@
70
70
  </div>
71
71
 
72
72
  <!-- Secondary Metrics Row -->
73
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
73
+ <div class="grid grid-cols-1 lg:grid-cols-2 ье" style="gap: 2rem;">
74
74
  <!-- System Metrics -->
75
75
  <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 shadow-xs">
76
76
  <div class="p-6 border-b border-base-200 dark:border-base-700">
@@ -1,21 +1,12 @@
1
1
  {% load unfold %}
2
2
 
3
- <!-- API Zones Table with semantic colors -->
3
+ <!-- API Zones Table using reusable components -->
4
4
  <div class="w-full">
5
- <div class="flex items-center justify-between mb-6">
6
- <div class="flex items-center">
7
- <span class="material-icons text-blue-600 dark:text-blue-400 mr-3">public</span>
8
- <div>
9
- <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
10
- API Zones
11
- </h2>
12
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">
13
- Configure and monitor API zone access and permissions
14
- </p>
15
- </div>
16
- </div>
17
-
18
- </div>
5
+ {% capture as zone_subtitle silent %}
6
+ Configure and monitor API zone access and permissions
7
+ {% endcapture %}
8
+
9
+ {% include 'admin/components/section_header.html' with title='API Zones' icon='public' icon_color='blue' %}
19
10
 
20
11
  <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 overflow-hidden shadow-sm max-w-full">
21
12
  {% if zones_table.rows %}
@@ -35,8 +26,8 @@
35
26
  <tr class="hover:bg-base-100 dark:hover:bg-base-800 transition-colors duration-150">
36
27
  <td class="px-6 py-4 whitespace-nowrap">
37
28
  <div class="flex items-center">
38
- <div class="flex-shrink-0">
39
- <div class="h-8 w-8 bg-primary-100 dark:bg-primary-900/20 rounded-lg flex items-center justify-center mr-3">
29
+ <div class="flex-shrink-0 mr-3">
30
+ <div class="h-8 w-8 bg-primary-100 dark:bg-primary-900/20 rounded-lg flex items-center justify-center">
40
31
  <span class="material-icons text-sm text-primary-600 dark:text-primary-400">
41
32
  {% if row.name == 'public' %}public
42
33
  {% elif row.name == 'internal' %}corporate_fare
@@ -82,25 +73,13 @@
82
73
  </td>
83
74
  <td class="px-6 py-4 whitespace-nowrap">
84
75
  {% if row.status == 'active' or row.status == 'enabled' %}
85
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400">
86
- <span class="material-icons text-xs mr-1">check_circle</span>
87
- Active
88
- </span>
76
+ {% include 'admin/components/status_badge.html' with status='active' text='Active' %}
89
77
  {% elif row.status == 'maintenance' %}
90
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-amber-100 dark:bg-amber-900/20 text-amber-600 dark:text-amber-400">
91
- <span class="material-icons text-xs mr-1">build</span>
92
- Maintenance
93
- </span>
78
+ {% include 'admin/components/status_badge.html' with status='warning' text='Maintenance' icon='build' %}
94
79
  {% elif row.status == 'disabled' %}
95
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400">
96
- <span class="material-icons text-xs mr-1">block</span>
97
- Disabled
98
- </span>
80
+ {% include 'admin/components/status_badge.html' with status='error' text='Disabled' icon='block' %}
99
81
  {% else %}
100
- <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-base-100 dark:bg-base-800 text-font-default-light dark:text-font-default-dark">
101
- <span class="material-icons text-xs mr-1">help</span>
102
- {{ row.status|title }}
103
- </span>
82
+ {% include 'admin/components/status_badge.html' with status='' text=row.status|title icon='help' %}
104
83
  {% endif %}
105
84
  </td>
106
85
  <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
@@ -14,7 +14,8 @@ def lib_name():
14
14
  """Get the library name."""
15
15
  # Lazy import to avoid AppRegistryNotReady error
16
16
  from django_cfg.config import LIB_NAME
17
- return LIB_NAME
17
+ from django_cfg import __version__
18
+ return f"{LIB_NAME} ({__version__})"
18
19
 
19
20
 
20
21
  @register.simple_tag
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: 🚀 Next-gen Django configuration: type-safety, AI features, blazing-fast setup, and automated best practices — all in one.
5
5
  Project-URL: Homepage, https://django-cfg.com
6
6
  Project-URL: Documentation, https://django-cfg.com
@@ -110,6 +110,7 @@ Requires-Dist: pymdown-extensions<11.0,>=10.16; extra == 'docs'
110
110
  Provides-Extra: full
111
111
  Requires-Dist: django<6.0,>=5.2; extra == 'full'
112
112
  Requires-Dist: redis<7.0,>=6.4.0; extra == 'full'
113
+ Provides-Extra: local
113
114
  Provides-Extra: tasks
114
115
  Requires-Dist: redis<7.0,>=6.4.0; extra == 'tasks'
115
116
  Provides-Extra: test