django-cfg 1.2.7__py3-none-any.whl → 1.2.9__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 (45) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/urls.py +2 -2
  3. django_cfg/modules/django_unfold/callbacks/__init__.py +9 -0
  4. django_cfg/modules/django_unfold/callbacks/actions.py +50 -0
  5. django_cfg/modules/django_unfold/callbacks/base.py +98 -0
  6. django_cfg/modules/django_unfold/callbacks/charts.py +224 -0
  7. django_cfg/modules/django_unfold/callbacks/commands.py +40 -0
  8. django_cfg/modules/django_unfold/callbacks/main.py +191 -0
  9. django_cfg/modules/django_unfold/callbacks/revolution.py +76 -0
  10. django_cfg/modules/django_unfold/callbacks/statistics.py +240 -0
  11. django_cfg/modules/django_unfold/callbacks/system.py +180 -0
  12. django_cfg/modules/django_unfold/callbacks/users.py +65 -0
  13. django_cfg/modules/django_unfold/models/config.py +10 -3
  14. django_cfg/modules/django_unfold/tailwind.py +68 -0
  15. django_cfg/templates/admin/components/action_grid.html +49 -0
  16. django_cfg/templates/admin/components/card.html +50 -0
  17. django_cfg/templates/admin/components/data_table.html +67 -0
  18. django_cfg/templates/admin/components/metric_card.html +39 -0
  19. django_cfg/templates/admin/components/modal.html +58 -0
  20. django_cfg/templates/admin/components/progress_bar.html +25 -0
  21. django_cfg/templates/admin/components/section_header.html +26 -0
  22. django_cfg/templates/admin/components/stat_item.html +32 -0
  23. django_cfg/templates/admin/components/stats_grid.html +72 -0
  24. django_cfg/templates/admin/components/status_badge.html +28 -0
  25. django_cfg/templates/admin/components/user_avatar.html +27 -0
  26. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +7 -7
  27. django_cfg/templates/admin/snippets/components/activity_tracker.html +48 -11
  28. django_cfg/templates/admin/snippets/components/charts_section.html +63 -13
  29. django_cfg/templates/admin/snippets/components/django_commands.html +196 -72
  30. django_cfg/templates/admin/snippets/components/quick_actions.html +3 -47
  31. django_cfg/templates/admin/snippets/components/recent_activity.html +28 -38
  32. django_cfg/templates/admin/snippets/components/recent_users_table.html +22 -53
  33. django_cfg/templates/admin/snippets/components/stats_cards.html +2 -66
  34. django_cfg/templates/admin/snippets/components/system_health.html +13 -63
  35. django_cfg/templates/admin/snippets/components/system_metrics.html +8 -25
  36. django_cfg/templates/admin/snippets/tabs/commands_tab.html +1 -1
  37. django_cfg/templates/admin/snippets/tabs/overview_tab.html +4 -4
  38. django_cfg/templates/admin/snippets/zones/zones_table.html +12 -33
  39. django_cfg/templatetags/django_cfg.py +2 -1
  40. {django_cfg-1.2.7.dist-info → django_cfg-1.2.9.dist-info}/METADATA +2 -1
  41. {django_cfg-1.2.7.dist-info → django_cfg-1.2.9.dist-info}/RECORD +44 -24
  42. django_cfg/modules/django_unfold/callbacks.py +0 -795
  43. {django_cfg-1.2.7.dist-info → django_cfg-1.2.9.dist-info}/WHEEL +0 -0
  44. {django_cfg-1.2.7.dist-info → django_cfg-1.2.9.dist-info}/entry_points.txt +0 -0
  45. {django_cfg-1.2.7.dist-info → django_cfg-1.2.9.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.7
3
+ Version: 1.2.9
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
@@ -1,10 +1,10 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=cUJMT2AzDvUmWArUe1FBbZ8EbRbn7T11NuZ5gQjnUic,1630
2
+ django_cfg/__init__.py,sha256=GUdqKMqGZ0XnY9fwb5M8zW1abvs6mUj3UNShKL60JbE,1630
3
3
  django_cfg/apps.py,sha256=k84brkeXJI7EgKZLEpTkM9YFZofKI4PzhFOn1cl9Msc,1656
4
4
  django_cfg/config.py,sha256=0cuRJVEnf03WzvEqhwzLvn9Zi1805C5KG1yk27ekABA,1190
5
5
  django_cfg/urls.py,sha256=bpRFjMonQuk4UCUMxx4ueBX3YDNB7HXKFwEghQ3KR3o,793
6
6
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
7
- django_cfg/apps/urls.py,sha256=xdRTe1bMzF753cH5tw9peIwr21kciy13I368b_JyWk0,2118
7
+ django_cfg/apps/urls.py,sha256=IEHCO3g0yJq_zLWvtbfrcYQpV3tBUYTNUC2RWWCM7oY,2122
8
8
  django_cfg/apps/accounts/README.md,sha256=YkUYJ3iKMYTmm9ALK2PDnX75SDqZxgnkzNLCD5efxRs,8227
9
9
  django_cfg/apps/accounts/__init__.py,sha256=osecEQhMJVP8ejhZzElNsAqA1fX-GPD3K5_yNwDk6IE,100
10
10
  django_cfg/apps/accounts/apps.py,sha256=Xd4XNpY1tw3zOqk_M9L6MR6oFdfFMYrfmrmbj0uelUs,492
@@ -379,18 +379,27 @@ django_cfg/modules/django_twilio/templates/guide.md,sha256=nZfwx-sgWyK5NApm93zOe
379
379
  django_cfg/modules/django_twilio/templates/sendgrid_otp_email.html,sha256=sXR6_D9hmOFfk9CrfPizpLddVhkRirBWpZd_ioEsxVk,6671
380
380
  django_cfg/modules/django_twilio/templates/sendgrid_test_data.json,sha256=fh1VyuSiDELHsS_CIz9gp7tlsMAEjaDOoqbAPSZ3yyo,339
381
381
  django_cfg/modules/django_unfold/__init__.py,sha256=Z91x1iGmkzlRbEb2L9OCFmYDKNAV9C4G3i15j5S0esc,1898
382
- django_cfg/modules/django_unfold/callbacks.py,sha256=4sCM8F2YCJbTK_TkfKrQw9gUm8zkkexbo0gstl2VsAA,29975
383
382
  django_cfg/modules/django_unfold/dashboard.py,sha256=zCYXhQUBdWrChRnvAQfa4gTRygKuF7aGO5IC7NrpAh8,12193
384
383
  django_cfg/modules/django_unfold/models.py,sha256=bY6QSSaH_-r9vOTkSQjxeIkl5RaED7XkxXkT8-W5stk,4014
385
384
  django_cfg/modules/django_unfold/system_monitor.py,sha256=cznZqldRJqiSLSJbs4U7R2rX8ClzoIpqdfXdXqI2iQw,6955
386
- django_cfg/modules/django_unfold/tailwind.py,sha256=eo5t0opF_-HX3ztnWA6BUOf35aVN0qUFYRkuabiH2KA,9237
385
+ django_cfg/modules/django_unfold/tailwind.py,sha256=X9o1K3QL0VwUISgJ26sLb6zkdK-00qiDuekqTw-fydc,10846
387
386
  django_cfg/modules/django_unfold/utils.py,sha256=ASY6aElXrwP38aqPYKVNc68SVm4ACwnL2ZQtykwVPXM,4501
387
+ django_cfg/modules/django_unfold/callbacks/__init__.py,sha256=7HiFap6ca9J3TFQ2QNVZJV8W1h7lbKkEZSudmbAtzHY,163
388
+ django_cfg/modules/django_unfold/callbacks/actions.py,sha256=SMTPa3fEvRVvR5kqkSqdUuLKgbWCFXNLltgzj_8Dqp8,1459
389
+ django_cfg/modules/django_unfold/callbacks/base.py,sha256=1JiGqY4pRV9kSIk0f3bd5sHSAhD1wk9pAFl3c8yQREw,3185
390
+ django_cfg/modules/django_unfold/callbacks/charts.py,sha256=572ogmblGaj0lcpmNNGTKvdAxQ1Y1Gt8oTSR0-Qjav8,8371
391
+ django_cfg/modules/django_unfold/callbacks/commands.py,sha256=L27Njk6uF7lBHjJjBjfxMnw3zNKahgtJctfw9KtHsvA,1285
392
+ django_cfg/modules/django_unfold/callbacks/main.py,sha256=Y8gD47EjoHs8Nn99x6A63v0opQqUbEEiURwO6kamoG0,7397
393
+ django_cfg/modules/django_unfold/callbacks/revolution.py,sha256=Ury0poaGj4J0lFx4siIwJBcubEvwivGemRIE0KEKAWE,3093
394
+ django_cfg/modules/django_unfold/callbacks/statistics.py,sha256=IYgqycFpWgOk5e22IZpOuJAhjC6-4uaZENqTm-NLwC8,8800
395
+ django_cfg/modules/django_unfold/callbacks/system.py,sha256=76o8Hx4WNsAz2B4D_F-7CHJVWh6U2M3MDsqriSxFBzo,6087
396
+ django_cfg/modules/django_unfold/callbacks/users.py,sha256=HBNmkyYFvLn35E2b1y5ZMbaWW1i_ouhRr1AbGs6liyU,2094
388
397
  django_cfg/modules/django_unfold/icons/README.md,sha256=j-NUixSC1QJh7PqYKxLZpPrTxKrAnx0urQraXgv4JHI,5612
389
398
  django_cfg/modules/django_unfold/icons/__init__.py,sha256=YXupXKorQ4fd5moQWWbjtLuvdXunMcxhbNGl6Bu__aA,198
390
399
  django_cfg/modules/django_unfold/icons/constants.py,sha256=phuomZCNKaTHwpa09VKZ4n2oNBmEX0mOlFK8MawwEK4,124659
391
400
  django_cfg/modules/django_unfold/icons/generate_icons.py,sha256=aesfyaZlIqQ_W6vb2O1Yl1ljVIx5M3HZNrnYc1fySkg,16559
392
401
  django_cfg/modules/django_unfold/models/__init__.py,sha256=1U7rkWx8yBWiX_cCMj0k_6m_LiC_OhUnLizAwjaRcF8,1037
393
- django_cfg/modules/django_unfold/models/config.py,sha256=g-28YHCZZVzC1HoZIh6C1zm4Wn4yoOJR0xrXWO-u54o,21552
402
+ django_cfg/modules/django_unfold/models/config.py,sha256=9NNFLHOwfqNfgDk3h67aFew0y3HwOeHgGaUsnkPQRRA,21813
394
403
  django_cfg/modules/django_unfold/models/dashboard.py,sha256=moK_6jj-tKItZZfmzklKaZ6fvw-oE2TMeudiZh_FPPI,7939
395
404
  django_cfg/modules/django_unfold/models/dropdown.py,sha256=bbRYl0iuzBrwgmqUMTDw9n4_tZ8L6Fwxm6AuUxQWp3g,1276
396
405
  django_cfg/modules/django_unfold/models/navigation.py,sha256=xrP2szoe1MSiTVAfc0Hd2dS32HhCp8XHBJinF5yc_U8,2575
@@ -406,6 +415,17 @@ django_cfg/routing/callbacks.py,sha256=zMWD0AEE4AvczdBN-VDjgczai683ZSEqws0pnCVQ3
406
415
  django_cfg/routing/routers.py,sha256=J89kcIArV2lSl3rzh61Rya0h-I5Zq7-QAat6PvmKVFs,1582
407
416
  django_cfg/templates/__init__.py,sha256=IzLjt-a7VIJ0OutmAE1_-w0_LpL2u0MgGpnIabjZuW8,19
408
417
  django_cfg/templates/admin/index.html,sha256=kehH-W9fTTUo36G9X82vM7L3Mr_lTiMkfp0qxPJAaSg,1247
418
+ django_cfg/templates/admin/components/action_grid.html,sha256=inffy-bMcuecSwgnR3HIEGE-r9wG_BgPttkvHqqFih8,3068
419
+ django_cfg/templates/admin/components/card.html,sha256=gOW8MBvRiWPQdoSYg_MH7KQ8o_WTRC5anyefRcPtRjM,2167
420
+ django_cfg/templates/admin/components/data_table.html,sha256=zD8B_zv2VQh-cikyLGPTzzmtmnB97MDItK38P3po6OE,2799
421
+ django_cfg/templates/admin/components/metric_card.html,sha256=a_OR5rtYi9yOFzStWmpdPSoYvmBHeHm2t1TnArm6jpU,1726
422
+ django_cfg/templates/admin/components/modal.html,sha256=9xBmA7W0eqkqU23dYu5VfJySyINTXQW_LK7bhh2v_uA,2849
423
+ django_cfg/templates/admin/components/progress_bar.html,sha256=vspLpYcUcNbg29dpeRBT9IoqWw-7v9VCXpTAEbMtEIg,944
424
+ django_cfg/templates/admin/components/section_header.html,sha256=l_skppG1YPhlroRaejySDcUcdWpCarn1VyD0GJW35zQ,933
425
+ django_cfg/templates/admin/components/stat_item.html,sha256=XCxgUumBxNWJvWVyZD-XPz6tNimZMFGr-C8-ezOGLH0,1754
426
+ django_cfg/templates/admin/components/stats_grid.html,sha256=4Mt2OgDjmSeEXdPZ8YnnvvLDuIc74m6E5ZivrDhmqcs,3745
427
+ django_cfg/templates/admin/components/status_badge.html,sha256=AP2fCdVzUe_dRVWqF0B8UeHt_cIjygOf6tERgvmRC8g,1591
428
+ django_cfg/templates/admin/components/user_avatar.html,sha256=ChID6GB9iyHnYsqkbNLRmXKXZOn_u8GVa1dd_HZzQH8,1280
409
429
  django_cfg/templates/admin/constance/change_list.html,sha256=A6VN_gOQPzNvWvsOzfNFMXh-2qgfyWt4urmX95MIUuk,4820
410
430
  django_cfg/templates/admin/constance/includes/default_value.html,sha256=dHu28vMi0OOn4KmRseMwWiWq51fz7EFdz4RZB6_4jrk,1301
411
431
  django_cfg/templates/admin/constance/includes/fieldset_header.html,sha256=kAyS0jbWNwk7aBcI7G4rx-kvVw315m21kxzSDii-qig,838
@@ -415,34 +435,34 @@ django_cfg/templates/admin/constance/includes/table_headers.html,sha256=_flMPr9m
415
435
  django_cfg/templates/admin/import_export/change_list_export.html,sha256=oFBsnpgZ24gV4--UpPRLAqr_kU6-Y3MAudpHQKigKQY,1241
416
436
  django_cfg/templates/admin/import_export/change_list_import.html,sha256=jL7Dhjcbx8IfzY-ltlxoWLvF97tD9B77moj8Mh6sRjY,1214
417
437
  django_cfg/templates/admin/import_export/change_list_import_export.html,sha256=KWnPbkv_kP5TlAKBRutbk_eFTqPXDt6_SmxXULE94iE,1840
418
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html,sha256=ggh2nOYcIxSEkFvniuo-8mixAz13IkfLKXd3NTf7lHQ,18162
419
- django_cfg/templates/admin/snippets/components/activity_tracker.html,sha256=WtZyHUmAQwVjvL3PV8OTu5_-FGhTUcPyBUXi8K-c6Eg,692
420
- django_cfg/templates/admin/snippets/components/charts_section.html,sha256=SZV2GLkSkYbXaWnUntbwxBhVXJRPHpjNcJrapqv3jO4,1932
421
- django_cfg/templates/admin/snippets/components/django_commands.html,sha256=53QZIwpXfqE21KtGriOW9T_kX-3XeZOoeOE1-XjIHlw,16047
422
- django_cfg/templates/admin/snippets/components/quick_actions.html,sha256=6A7Nm4mx168T6-al4NCKz13CSQKvktNWTXHEGoCDIDw,7508
423
- django_cfg/templates/admin/snippets/components/recent_activity.html,sha256=IVCQWNqj2avK4ZvsUc7EDGCkGN-DKx6Ib9ea0CwpJBY,2718
424
- django_cfg/templates/admin/snippets/components/recent_users_table.html,sha256=aPD1haGyn8cHvDjHjRFupYx4YhAXH3QXSKUMnErriNc,9270
425
- django_cfg/templates/admin/snippets/components/stats_cards.html,sha256=GLIPZgLPkShcCoEr8sj0IUVbcBhYPqiFeW10lqw7imE,3887
438
+ django_cfg/templates/admin/layouts/dashboard_with_tabs.html,sha256=wxtJWKhTtMH9cz_JIY-cj5AHIzIxGfpxeqFz1OwTD6k,18219
439
+ django_cfg/templates/admin/snippets/components/activity_tracker.html,sha256=FDiS4SfTiXBYWCWUWNyF7BPx05Bj4_wiFJ2RQSej5GU,3085
440
+ django_cfg/templates/admin/snippets/components/charts_section.html,sha256=sPjWvCc0y50gIOhpfloF6s9uT9XHc_S0u1eC3zZ6DwY,5401
441
+ django_cfg/templates/admin/snippets/components/django_commands.html,sha256=SQT9Rl4uVbh9Dnp_e_dUdUhhyQfCJttqpoLUbaW4EMk,20230
442
+ django_cfg/templates/admin/snippets/components/quick_actions.html,sha256=AZ-93LK5TVvDdoTexrKGjoluKTRXAr9vQpj7OkFxj3s,4020
443
+ django_cfg/templates/admin/snippets/components/recent_activity.html,sha256=eWFII320pZL3S6hxCcdWKCwWjjn7bEERotjvVqGDAYU,1713
444
+ django_cfg/templates/admin/snippets/components/recent_users_table.html,sha256=xqlKawGT7RMLg1lDhW5vYsJuIjB2thvRgtjGMhoRVJo,6551
445
+ django_cfg/templates/admin/snippets/components/stats_cards.html,sha256=8RAtDTIcq7OBcdk_TWVovJ_Hk8UIlj5teuqnO2w0TAs,181
426
446
  django_cfg/templates/admin/snippets/components/stats_tiles.html,sha256=ELPz7ujZqZ55ejMIRLZt29dOn4k50L9F0u8cHgvMWPo,8206
427
- django_cfg/templates/admin/snippets/components/system_health.html,sha256=uQqmdP0RgIJiINUgfPEdRhbiobYyNaaxqlrjfBFhjZg,4533
428
- django_cfg/templates/admin/snippets/components/system_metrics.html,sha256=gb2YNHm09UnDjrtnem7pVd3oZXE4-Cshbkda11JgkoM,7204
447
+ django_cfg/templates/admin/snippets/components/system_health.html,sha256=N9MObX5D28fADMf1Xb9fArrq-3f6A5PHuDa_JdYjyOI,1578
448
+ django_cfg/templates/admin/snippets/components/system_metrics.html,sha256=OMXt_RoDd909A8lY0L4DC9LTpaloxkI2Q7kdsQmMOmc,6480
429
449
  django_cfg/templates/admin/snippets/components/user_permissions.html,sha256=ZFunUwWV7LRmtctn4m6kSirWZ5voIY4haJljENQ24eo,3830
430
450
  django_cfg/templates/admin/snippets/tabs/app_stats_tab.html,sha256=aW7kLfBF9Ch4YeBGgPNJAmPs90RSEfNs66-DpX-O6aY,14390
431
- django_cfg/templates/admin/snippets/tabs/commands_tab.html,sha256=YoPn1B0KeM7i7UXxEkaTgTVQ8sfDjYzBqIb4kdZhjjc,3533
432
- django_cfg/templates/admin/snippets/tabs/overview_tab.html,sha256=BVRhlGhtT1ire8yQLKg7Jig2Pk0z3q5HWDbaDtYvnkc,4628
451
+ django_cfg/templates/admin/snippets/tabs/commands_tab.html,sha256=Df4RXR2n_kg9110OEAQU_fJ5NW496wEeoBIcZ6gngFc,3439
452
+ django_cfg/templates/admin/snippets/tabs/overview_tab.html,sha256=GKM0tyqINFYWUDLc68vEgQe_4mUxQ3Im9O7mBJP4Jwo,4666
433
453
  django_cfg/templates/admin/snippets/tabs/stats_tab.html,sha256=jIqSnp4WTo2jAzzMqo9As6z5PykWsO_V1VwBEpTzZ5E,5170
434
454
  django_cfg/templates/admin/snippets/tabs/users_tab.html,sha256=04D05VSeidn2qJnQmktVI7TNlm7tNcXYXJAsk32U5hY,2813
435
- django_cfg/templates/admin/snippets/zones/zones_table.html,sha256=2oaiCXVof2F7LiDM7yrqKyKBIgYZrH5cSjkTN5ysDdU,13768
455
+ django_cfg/templates/admin/snippets/zones/zones_table.html,sha256=Hg4hT61yX0um00j4HkbkANOt0ehKwYIMT-r2IzTOpVo,12358
436
456
  django_cfg/templates/emails/base_email.html,sha256=TWcvYa2IHShlF_E8jf1bWZStRO0v8G4L_GexPxvz6XQ,8836
437
457
  django_cfg/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
438
- django_cfg/templatetags/django_cfg.py,sha256=ZobXXXHFSv6Iiz_fad12QdmRyEONjoRZipA8HusmMAM,768
458
+ django_cfg/templatetags/django_cfg.py,sha256=BpP4Q8zguNckZomtZBqdIBnQFO2gWtaTbeqfMgo--6E,828
439
459
  django_cfg/utils/__init__.py,sha256=64wwXJuXytvwt8Ze_erSR2HmV07nGWJ6DV5wloRBvYE,435
440
460
  django_cfg/utils/path_resolution.py,sha256=C9As6p4Q9l3VeoVkFDRPQWGrzAWf8O8UxLVkaI3ToVM,13899
441
461
  django_cfg/utils/smart_defaults.py,sha256=b6A1z7VO1NJGq0oUQXN5P97c3k_Ssgw6qUi0mK-4TlM,19786
442
462
  django_cfg/utils/toolkit.py,sha256=Td8_iXNaftonF_xdZP4Y3uO65nuA_4_zditn5Q_Pfcw,23310
443
463
  django_cfg/utils/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaNpucs,4800
444
- django_cfg-1.2.7.dist-info/METADATA,sha256=gRTDIKd6eEvtx2ph2-DD4uMxNEDS_y4602_EKyhWGk0,45616
445
- django_cfg-1.2.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
446
- django_cfg-1.2.7.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
447
- django_cfg-1.2.7.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
448
- django_cfg-1.2.7.dist-info/RECORD,,
464
+ django_cfg-1.2.9.dist-info/METADATA,sha256=35EHhp9QoBO442D3LE_jF7UxU1VaF_UM723VMXOEkwY,45638
465
+ django_cfg-1.2.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
466
+ django_cfg-1.2.9.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
467
+ django_cfg-1.2.9.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
468
+ django_cfg-1.2.9.dist-info/RECORD,,