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

django_cfg/__init__.py CHANGED
@@ -32,7 +32,7 @@ Example:
32
32
  default_app_config = "django_cfg.apps.DjangoCfgConfig"
33
33
 
34
34
  # Version information
35
- __version__ = "1.4.97"
35
+ __version__ = "1.4.101"
36
36
  __license__ = "MIT"
37
37
 
38
38
  # Import registry for organized lazy loading
@@ -710,19 +710,11 @@ class Command(BaseCommand):
710
710
  self.stdout.write(self.style.SUCCESS(
711
711
  f" ✅ Created ZIP archive: {django_static_zip.relative_to(base_dir)} ({zip_size_mb:.1f}MB)"
712
712
  ))
713
-
714
- # Copy ZIP to django_cfg package static/frontend directory
715
- import django_cfg
716
- django_cfg_static_zip = Path(django_cfg.__file__).parent / 'static' / 'frontend' / 'nextjs_admin.zip'
717
- django_cfg_static_zip.parent.mkdir(parents=True, exist_ok=True)
718
-
719
- if django_cfg_static_zip.exists():
720
- django_cfg_static_zip.unlink()
721
-
722
- shutil.copy2(django_static_zip, django_cfg_static_zip)
723
-
724
713
  self.stdout.write(self.style.SUCCESS(
725
- f" Copied ZIP to django_cfg: {django_cfg_static_zip.relative_to(Path(django_cfg.__file__).parent)}"
714
+ f" 📍 ZIP location: {django_static_zip.relative_to(base_dir)}"
715
+ ))
716
+ self.stdout.write(self.style.SUCCESS(
717
+ " ℹ️ This ZIP is used by NextJsAdminView (Tab 2: External Admin)"
726
718
  ))
727
719
 
728
720
  except Exception as zip_error:
@@ -63,7 +63,7 @@ class NavigationManager(BaseCfgModule):
63
63
  separator=True,
64
64
  collapsible=True,
65
65
  items=[
66
- NavigationItem(title="Dashboard", icon=Icons.MONITOR_HEART, link="/cfg/admin/private/centrifugo"),
66
+ NavigationItem(title="Dashboard", icon=Icons.MONITOR_HEART, link="/cfg/admin/admin/centrifugo"),
67
67
  NavigationItem(title="Logs", icon=Icons.LIST_ALT, link=str(reverse_lazy("admin:django_cfg_centrifugo_centrifugolog_changelist"))),
68
68
  ]
69
69
  )
@@ -4,15 +4,13 @@ Views for Next.js admin integration.
4
4
  Serves Next.js static files with SPA routing support and JWT injection.
5
5
 
6
6
  Features:
7
- - Priority-based ZIP resolution (solution project → package fallback)
8
7
  - Automatic extraction with metadata comparison (ZIP size + mtime vs marker file)
9
8
  - Cache busting (no-store headers for HTML)
10
9
  - SPA routing with fallback strategies
11
10
  - JWT token injection for authenticated users
12
11
 
13
- ZIP Resolution Priority:
14
- 1. Solution project: {BASE_DIR}/static/nextjs_admin.zip → {BASE_DIR}/static/nextjs_admin/
15
- 2. Package fallback: django_cfg/static/frontend/nextjs_admin.zip → django_cfg/static/frontend/nextjs_admin/
12
+ ZIP Location:
13
+ - Solution project: {BASE_DIR}/static/nextjs_admin.zip → {BASE_DIR}/static/nextjs_admin/
16
14
 
17
15
  Extraction Logic:
18
16
  - Marker file (.zip_meta) tracks ZIP metadata (size:mtime)
@@ -41,16 +39,14 @@ class NextJsAdminView(ZipExtractionMixin, LoginRequiredMixin, View):
41
39
  Serve Next.js admin panel with JWT injection and SPA routing.
42
40
 
43
41
  Features:
44
- - Serves Next.js static build files
45
- - Priority-based ZIP resolution (solution first, package fallback)
42
+ - Serves Next.js static build files from solution project
46
43
  - Smart ZIP extraction: metadata comparison (size + mtime) with marker file
47
44
  - Cache busting: no-store headers for HTML files
48
45
  - Automatic JWT token injection for authenticated users
49
46
  - SPA routing support (path/to/route → path/to/route/index.html)
50
47
 
51
- ZIP Resolution Priority:
52
- 1. Solution: {BASE_DIR}/static/nextjs_admin.zip → {BASE_DIR}/static/nextjs_admin/
53
- 2. Package: django_cfg/static/frontend/nextjs_admin.zip → django_cfg/static/frontend/nextjs_admin/
48
+ ZIP Location:
49
+ - {BASE_DIR}/static/nextjs_admin.zip → {BASE_DIR}/static/nextjs_admin/
54
50
 
55
51
  ZIP Extraction Logic:
56
52
  - If directory doesn't exist: extract from ZIP
@@ -76,28 +72,18 @@ class NextJsAdminView(ZipExtractionMixin, LoginRequiredMixin, View):
76
72
 
77
73
  nextjs_config = config.nextjs_admin
78
74
 
79
- # Priority 1: Try solution project static directory first
75
+ # Use solution project static directory
80
76
  from django.conf import settings
81
- solution_zip = Path(settings.BASE_DIR) / 'static' / 'nextjs_admin.zip'
82
- solution_base_dir = Path(settings.BASE_DIR) / 'static' / 'nextjs_admin'
83
-
84
- # Priority 2: Fallback to django_cfg package
85
- default_zip = Path(django_cfg.__file__).parent / 'static' / 'frontend' / 'nextjs_admin.zip'
86
- default_base_dir = Path(django_cfg.__file__).parent / 'static' / 'frontend' / 'nextjs_admin'
87
-
88
- # Choose which ZIP to use
89
- if solution_zip.exists():
90
- zip_path = solution_zip
91
- base_dir = solution_base_dir
92
- logger.info(f"[nextjs_admin] Using ZIP from solution project: {solution_zip}")
93
- elif default_zip.exists():
94
- zip_path = default_zip
95
- base_dir = default_base_dir
96
- logger.info(f"[nextjs_admin] Using ZIP from django_cfg package: {default_zip}")
97
- else:
98
- logger.error(f"[nextjs_admin] No ZIP found in solution ({solution_zip}) or package ({default_zip})")
77
+ zip_path = Path(settings.BASE_DIR) / 'static' / 'nextjs_admin.zip'
78
+ base_dir = Path(settings.BASE_DIR) / 'static' / 'nextjs_admin'
79
+
80
+ # Check if ZIP exists
81
+ if not zip_path.exists():
82
+ logger.error(f"[nextjs_admin] ZIP not found: {zip_path}")
99
83
  return render(request, 'frontend/404.html', status=404)
100
84
 
85
+ logger.info(f"[nextjs_admin] Using ZIP from solution project: {zip_path}")
86
+
101
87
  # Extract ZIP if needed using mixin
102
88
  if not self.extract_zip_if_needed(base_dir, zip_path, 'nextjs_admin'):
103
89
  return render(request, 'frontend/404.html', status=404)
django_cfg/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-cfg"
7
- version = "1.4.97"
7
+ version = "1.4.101"
8
8
  description = "Modern Django framework with type-safe Pydantic v2 configuration, Next.js admin integration, real-time WebSockets, and 8 enterprise apps. Replace settings.py with validated models, 90% less code. Production-ready with AI agents, auto-generated TypeScript clients, and zero-config features."
9
9
  readme = "README.md"
10
10
  keywords = [ "django", "configuration", "pydantic", "settings", "type-safety", "pydantic-settings", "django-environ", "startup-validation", "ide-autocomplete", "nextjs-admin", "react-admin", "websocket", "centrifugo", "real-time", "typescript-generation", "ai-agents", "enterprise-django", "django-settings", "type-safe-config", "modern-django",]
Binary file
@@ -9,28 +9,80 @@
9
9
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
10
10
  <link rel="stylesheet" href="{% static 'admin/css/dashboard.css' %}">
11
11
  <style>
12
+ /* Make content container full height and full width */
13
+ #content {
14
+ display: flex;
15
+ flex-direction: column;
16
+ height: 100%;
17
+ }
18
+
19
+ /* Remove container centering and width limits */
20
+ #content.container,
21
+ #content.mx-auto,
22
+ #content .mx-auto {
23
+ margin-left: 0 !important;
24
+ margin-right: 0 !important;
25
+ max-width: none !important;
26
+ }
27
+
28
+ /* Also remove from unfold container component and make it full height */
29
+ #content > .mx-auto {
30
+ margin-left: 0 !important;
31
+ margin-right: 0 !important;
32
+ max-width: none !important;
33
+ height: 100%;
34
+ }
35
+
36
+ /* Remove horizontal padding on mobile for @container */
37
+ @media (max-width: 768px) {
38
+ div[class*="@container"].px-4 {
39
+ padding-left: 0 !important;
40
+ padding-right: 0 !important;
41
+ }
42
+ }
43
+
44
+ /* Make Alpine tabs wrapper full height */
45
+ #content [x-data] {
46
+ height: 100%;
47
+ display: flex;
48
+ flex-direction: column;
49
+ }
50
+
51
+ /* Make tab content blocks full height */
52
+ #content [x-data] > div[x-show] {
53
+ flex: 1;
54
+ display: flex;
55
+ flex-direction: column;
56
+ }
57
+
12
58
  .nextjs-dashboard-iframe {
13
59
  width: 100%;
14
- min-height: 500px;
15
- height: 500px;
60
+ height: 100%;
16
61
  border: none;
17
62
  display: block;
18
63
  visibility: hidden;
19
64
  opacity: 0;
20
- transition: height 0.2s ease-in-out, opacity 0.3s ease-in-out;
65
+ transition: opacity 0.3s ease-in-out;
21
66
  }
22
67
 
23
68
  .nextjs-dashboard-iframe.loaded {
24
69
  visibility: visible;
25
70
  opacity: 1;
26
- height: auto;
27
- min-height: 600px;
28
71
  }
29
72
 
30
73
  .iframe-container {
31
74
  position: relative;
32
75
  background: transparent;
33
- min-height: 500px;
76
+ flex: 1;
77
+ display: flex;
78
+ flex-direction: column;
79
+ border: 1px solid rgba(209, 213, 219, 0.2);
80
+ border-radius: 0.375rem; /* rounded-md */
81
+ overflow: hidden;
82
+ }
83
+
84
+ .dark .iframe-container {
85
+ border-color: rgba(75, 85, 99, 0.2);
34
86
  }
35
87
 
36
88
  .iframe-loading {
@@ -67,6 +119,8 @@
67
119
 
68
120
  {% block breadcrumbs %}{% endblock %}
69
121
 
122
+ {% block coltype %}{% endblock %}
123
+
70
124
  {% block title %}
71
125
  {% if subtitle %}{{ subtitle }} | {% endif %}
72
126
  {{ title }} | {{ site_title|default:'Django site admin' }}
@@ -102,7 +156,7 @@
102
156
  }">
103
157
  {% if is_frontend_dev_mode %}
104
158
  <!-- Development Mode Badge -->
105
- <div class="bg-yellow-100 dark:bg-yellow-900 border-l-4 border-yellow-500 text-yellow-700 dark:text-yellow-300 p-4 mb-4" role="alert">
159
+ <div class="bg-yellow-100 dark:bg-yellow-900 border-l-4 border-yellow-500 text-yellow-700 dark:text-yellow-300" role="alert">
106
160
  <div class="flex items-center">
107
161
  <svg class="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 20 20">
108
162
  <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"/>
@@ -118,14 +172,15 @@
118
172
  <!-- Tab Navigation -->
119
173
  {% has_nextjs_external_admin as is_external_enabled %}
120
174
  {% if is_external_enabled %}
121
- <div class="mb-6">
175
+ <div>
122
176
  <div class="border-b border-gray-300 dark:border-gray-600" style="border-bottom-color: rgba(209, 213, 219, 0.2);">
123
177
  <style>
124
178
  .dark [style*="border-bottom-color"] {
125
179
  border-bottom-color: rgba(75, 85, 99, 0.2) !important;
126
180
  }
127
181
  </style>
128
- <nav class="-mb-px flex space-x-8 px-4" aria-label="Dashboard Tabs">
182
+ <div class="flex items-center justify-between px-4">
183
+ <nav class="-mb-px flex space-x-8" aria-label="Dashboard Tabs">
129
184
  <button @click="switchTab('builtin')"
130
185
  class="whitespace-nowrap py-4 px-2 border-b-2 font-medium text-sm flex items-center gap-2 transition-all duration-200"
131
186
  :class="activeTab === 'builtin'
@@ -144,6 +199,15 @@
144
199
  <span>{% nextjs_external_admin_title %}</span>
145
200
  </button>
146
201
  </nav>
202
+
203
+ <!-- Version info -->
204
+ <div class="py-4 text-xs text-gray-400 dark:text-gray-500">
205
+ {% load django_cfg %}
206
+ <a href="{% lib_site_url %}" class="text-blue-600 hover:text-blue-700">
207
+ {% lib_name %}
208
+ </a>
209
+ </div>
210
+ </div>
147
211
  </div>
148
212
  </div>
149
213
  {% endif %}
@@ -163,7 +227,6 @@
163
227
  data-original-src="{% nextjs_admin_url %}"
164
228
  title="Next.js Dashboard"
165
229
  sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-storage-access-by-user-activation"
166
- scrolling="no"
167
230
  ></iframe>
168
231
  </div>
169
232
  </div>
@@ -179,31 +242,16 @@
179
242
 
180
243
  <iframe
181
244
  id="nextjs-dashboard-iframe-nextjs"
182
- class="nextjs-dashboard-iframe nextjs-external-iframe"
245
+ class="nextjs-dashboard-iframe"
183
246
  src="{% nextjs_external_admin_url %}"
184
247
  data-original-src="{% nextjs_external_admin_url %}"
185
248
  title="{% nextjs_external_admin_title %}"
186
249
  sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-storage-access-by-user-activation"
187
- scrolling="no"
188
250
  ></iframe>
189
251
  </div>
190
252
  </div>
191
253
  {% endif %}
192
254
  </div>
193
-
194
- <!-- Footer Section -->
195
- <div class="text-center py-8 mt-5">
196
- <p class="text-sm text-gray-500 dark:text-gray-400">
197
- {% load django_cfg %}
198
- <a href="{% lib_site_url %}" class="text-blue-600 hover:text-blue-700 font-medium">
199
- {% lib_name %}
200
- </a>
201
- <span class="mx-2">•</span>
202
- <a href="{% lib_health_url %}" class="text-blue-600 hover:text-blue-700">
203
- System Health
204
- </a>
205
- </p>
206
- </div>
207
255
  {% endcomponent %}
208
256
  {% endblock %}
209
257
 
@@ -392,23 +440,31 @@
392
440
  break;
393
441
 
394
442
  case 'iframe-resize':
395
- if (data?.height && typeof data.height === 'number') {
396
- // First resize - show iframe immediately
397
- if (!iframe.classList.contains('loaded')) {
398
- console.log('[Django-CFG] First resize received - showing iframe');
399
- if (loading) loading.classList.add('hidden');
400
- iframe.classList.add('loaded');
401
- }
402
-
403
- // Debounce resize updates (300ms delay)
404
- if (resizeTimer) {
405
- clearTimeout(resizeTimer);
406
- }
407
-
408
- resizeTimer = setTimeout(() => {
409
- const newHeight = Math.max(600, data.height + 50);
410
- iframe.style.height = newHeight + 'px';
411
- }, 300);
443
+ // DISABLED: Fixed height 80vh instead of dynamic resize
444
+ // if (data?.height && typeof data.height === 'number') {
445
+ // // First resize - show iframe immediately
446
+ // if (!iframe.classList.contains('loaded')) {
447
+ // console.log('[Django-CFG] First resize received - showing iframe');
448
+ // if (loading) loading.classList.add('hidden');
449
+ // iframe.classList.add('loaded');
450
+ // }
451
+ //
452
+ // // Debounce resize updates (300ms delay)
453
+ // if (resizeTimer) {
454
+ // clearTimeout(resizeTimer);
455
+ // }
456
+ //
457
+ // resizeTimer = setTimeout(() => {
458
+ // const newHeight = Math.max(600, data.height + 50);
459
+ // iframe.style.height = newHeight + 'px';
460
+ // }, 300);
461
+ // }
462
+
463
+ // Show iframe on first resize event
464
+ if (!iframe.classList.contains('loaded')) {
465
+ console.log('[Django-CFG] First resize received - showing iframe');
466
+ if (loading) loading.classList.add('hidden');
467
+ iframe.classList.add('loaded');
412
468
  }
413
469
  break;
414
470
 
@@ -174,30 +174,30 @@ def nextjs_admin_url(path=''):
174
174
  2. Otherwise → /cfg/admin/admin/{path} (static files)
175
175
 
176
176
  Note: Port 3000 is reserved for external Next.js admin (Tab 2).
177
+ Both tabs use /admin route for consistency.
177
178
 
178
179
  Usage in template:
179
180
  {% load django_cfg %}
180
181
  <iframe src="{% nextjs_admin_url %}"></iframe>
181
- <iframe src="{% nextjs_admin_url 'centrifugo' %}"></iframe>
182
+ <iframe src="{% nextjs_admin_url 'crypto' %}"></iframe>
182
183
  """
183
184
  # Normalize path - remove leading/trailing slashes
184
185
  path = path.strip('/')
185
186
 
186
187
  if not settings.DEBUG:
187
- # Production mode: always use static files
188
- return f'/cfg/admin/{path}' if path else '/cfg/admin/'
188
+ # Production mode: always use static files with /admin route
189
+ return f'/cfg/admin/admin/{path}' if path else '/cfg/admin/admin/'
189
190
 
190
191
  # Check if port 3001 is available for Tab 1 (built-in admin)
191
192
  port_3001_available = _is_port_available('localhost', 3001)
192
193
 
193
194
  if port_3001_available:
194
- # Dev server is running on 3001 - use it (builtin admin has no /admin prefix)
195
- base_url = 'http://localhost:3001'
195
+ # Dev server is running on 3001 - use /admin route for consistency
196
+ base_url = 'http://localhost:3001/admin'
196
197
  return f'{base_url}/{path}' if path else base_url
197
198
  else:
198
- # No dev server or dev server stopped - use static files
199
- # Static files are served from /cfg/admin/ but ZIP contains files in root (no /admin prefix)
200
- return f'/cfg/admin/{path}' if path else '/cfg/admin/'
199
+ # No dev server - use static files with /admin route
200
+ return f'/cfg/admin/admin/{path}' if path else '/cfg/admin/admin/'
201
201
 
202
202
 
203
203
  @register.simple_tag
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.97
3
+ Version: 1.4.101
4
4
  Summary: Modern Django framework with type-safe Pydantic v2 configuration, Next.js admin integration, real-time WebSockets, and 8 enterprise apps. Replace settings.py with validated models, 90% less code. Production-ready with AI agents, auto-generated TypeScript clients, and zero-config features.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -1,5 +1,5 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=_L0rVeRDg_vkLAwSqGT8ka-Mc6eZ0ddniv5wfm9RJvM,1620
2
+ django_cfg/__init__.py,sha256=-L4xh-iNYo38lfiLUM2y4ie60fmbzclNmpl6ULRBIt8,1621
3
3
  django_cfg/apps.py,sha256=72m3uuvyqGiLx6gOfE-BD3P61jddCCERuBOYpxTX518,1605
4
4
  django_cfg/config.py,sha256=y4Z3rnYsHBE0TehpwAIPaxr---mkvyKrZGGsNwYso74,1398
5
5
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
@@ -859,7 +859,7 @@ django_cfg/modules/django_client/core/validation/rules/base.py,sha256=xVJli0eSEz
859
859
  django_cfg/modules/django_client/core/validation/rules/type_hints.py,sha256=hwjTMADillsTPruDvXZQeZMj4LVV443zxY9o0Gqgg6k,10200
860
860
  django_cfg/modules/django_client/management/__init__.py,sha256=mCTPP_bIOmqNnn0WAG2n4BuF6zwc9PTgdZr_dORfNDk,54
861
861
  django_cfg/modules/django_client/management/commands/__init__.py,sha256=CJ55pHUNYQ5h-QHUe3axeTtxzlUJv7wbEuZmGN21iCM,36
862
- django_cfg/modules/django_client/management/commands/generate_client.py,sha256=Mzc0QyxCtL814MevY7oM9wg4DtqK0rTu2MKmBpBBj08,30360
862
+ django_cfg/modules/django_client/management/commands/generate_client.py,sha256=uPoHIU2-rqq0733H7Pj5fl-vNu7Oj5aZYyFqVNKlTVU,29955
863
863
  django_cfg/modules/django_client/management/commands/validate_openapi.py,sha256=IBKk7oRP3tMQzXjvZNIgQtMPk3k_mB2diNS7bkaSLz4,11011
864
864
  django_cfg/modules/django_client/spectacular/__init__.py,sha256=M8fG-odu2ltkG36aMMr0KDkCKGX676TwdrJO8vky2cI,345
865
865
  django_cfg/modules/django_client/spectacular/async_detection.py,sha256=S_pwGR7_2SIWHjZJyiu7SCfySF3Nr3P8eqjDyBSkkLs,5731
@@ -1010,7 +1010,7 @@ django_cfg/modules/django_twilio/templates/guide.md,sha256=nZfwx-sgWyK5NApm93zOe
1010
1010
  django_cfg/modules/django_twilio/templates/sendgrid_otp_email.html,sha256=sXR6_D9hmOFfk9CrfPizpLddVhkRirBWpZd_ioEsxVk,6671
1011
1011
  django_cfg/modules/django_twilio/templates/sendgrid_test_data.json,sha256=fh1VyuSiDELHsS_CIz9gp7tlsMAEjaDOoqbAPSZ3yyo,339
1012
1012
  django_cfg/modules/django_unfold/__init__.py,sha256=Uquez6xgPUIc8FBMP7qif-adRYQSjQ2dBHxnJPom3eQ,1337
1013
- django_cfg/modules/django_unfold/navigation.py,sha256=BSJk4NxTpkTh2Pf_NTkLf77EJSm54ta3l1-SMzYKz2U,11521
1013
+ django_cfg/modules/django_unfold/navigation.py,sha256=4lEFyL-qB0aYMYDsqSU24XOIuMGaBDHci6f6adbQjTU,11519
1014
1014
  django_cfg/modules/django_unfold/system_monitor.py,sha256=KcrTa5irstdB1pDKe3sC0zl4tz9LVjhp7xvbqUM4YVk,6781
1015
1015
  django_cfg/modules/django_unfold/tailwind.py,sha256=NY8nWcUdQw61oNmjPoPl7agcTb-r5IqcpFYy35MNsTM,9107
1016
1016
  django_cfg/modules/django_unfold/utils.py,sha256=5aFaceRc9B3eXfpOVyKRD2wWqFt8KcHxjQg54oD7Oyg,4482
@@ -1021,7 +1021,7 @@ django_cfg/modules/django_unfold/models/navigation.py,sha256=PPEeqA2HBaA1-VjADiX
1021
1021
  django_cfg/modules/nextjs_admin/__init__.py,sha256=lfrZYyNRExH3Z5De8G4hQBIZoFlW5Ejze3couNrztbY,312
1022
1022
  django_cfg/modules/nextjs_admin/apps.py,sha256=HxVUMmWTKdYpwJ00iIfWVFsBzsawsOVhEPZqjk_izjI,347
1023
1023
  django_cfg/modules/nextjs_admin/urls.py,sha256=7n0yStm0WNchw14Rtu_mgsIA3WKQsYP9WZt3-YOUWjU,603
1024
- django_cfg/modules/nextjs_admin/views.py,sha256=zvRMZZRRcwIA3ie0AEnllOUUwLklbt3nq-P5Eq9BzeY,11385
1024
+ django_cfg/modules/nextjs_admin/views.py,sha256=SELkdq6ioNqFLInDKfYyRSZRaXRtuGAVjQfE8sACQ_Q,10382
1025
1025
  django_cfg/modules/nextjs_admin/models/__init__.py,sha256=WGw9KXcYd1O9AoA_bpMoz2gLZUlRzjGmUBjjbObcUi0,100
1026
1026
  django_cfg/modules/nextjs_admin/models/config.py,sha256=0ADqLuiywSCQfx_z9dkwjFCca3lr3F2uQffIjTr_QXw,5864
1027
1027
  django_cfg/modules/nextjs_admin/templatetags/__init__.py,sha256=ChVBnJggCIY8rMhfyJFoA8k0qKo-8FtJknrk54Vx4wM,51
@@ -1050,7 +1050,7 @@ django_cfg/static/admin/js/alpine/commands-section.js,sha256=8z2MQNwZF9Tx_2EK1AY
1050
1050
  django_cfg/static/admin/js/alpine/dashboard-tabs.js,sha256=ob8Q_I9lFLDv_hFERXgTyvqMDBspAGfzCxI_7slRur4,1354
1051
1051
  django_cfg/static/admin/js/alpine/system-metrics.js,sha256=m-Fg55K_vpHXToD46PXL9twl4OBF_V9MONvbSWbQqDw,440
1052
1052
  django_cfg/static/admin/js/alpine/toggle-section.js,sha256=T141NFmy0fRJyGGuuaCJRjJXwPam-xxtQNW1hi8BJbc,672
1053
- django_cfg/static/frontend/admin.zip,sha256=n2G8ajruLqojcjqvw2pMEPjgpSTTwcmJxkeIQxJVw9U,7626768
1053
+ django_cfg/static/frontend/admin.zip,sha256=w-E-vlsWyPlx3PpmwTxPenibUWXNSlhN7Hu0oPlhFP8,15272375
1054
1054
  django_cfg/static/js/api-loader.mjs,sha256=boGqqRGnFR-Mzo_RQOjhAzNvsb7QxZddSwMKROzkk9Q,5163
1055
1055
  django_cfg/static/js/api/base.mjs,sha256=KUxZHHdELAV8mNnACpwJRvaQhdJxp-n5LFEQ4oUZxBo,4707
1056
1056
  django_cfg/static/js/api/index.mjs,sha256=_-Q04jjHcgwi4CGfiaLyiOR6NW7Yu1HBhJWp2J1cjpc,2538
@@ -1072,11 +1072,11 @@ django_cfg/static/js/api/support/index.mjs,sha256=oPA3iGkUWYyKQuJlI5-tSxD3AOhwlA
1072
1072
  django_cfg/static/js/api/tasks/client.mjs,sha256=tIy8K-finXzTUL9kOo_L4Q1kchDaHyuzjwS4VymiWPM,3579
1073
1073
  django_cfg/static/js/api/tasks/index.mjs,sha256=yCY1GzdD-RtFZ3pAfk1l0msgO1epyo0lsGCjH0g1Afc,294
1074
1074
  django_cfg/templates/__init__.py,sha256=IzLjt-a7VIJ0OutmAE1_-w0_LpL2u0MgGpnIabjZuW8,19
1075
- django_cfg/templates/admin/index.html,sha256=RidRvZwc6LFzRi8l6vHBgyM_CD0yvhPWvr40uVKCClY,18138
1075
+ django_cfg/templates/admin/index.html,sha256=bKpeJFRJltoe3iWmFcR5YUzTwPgnogwAsQXjUlELQEE,20072
1076
1076
  django_cfg/templates/emails/base_email.html,sha256=TWcvYa2IHShlF_E8jf1bWZStRO0v8G4L_GexPxvz6XQ,8836
1077
1077
  django_cfg/templates/unfold/layouts/skeleton.html,sha256=2ArkcNZ34mFs30cOAsTQ1EZiDXcB0aVxkO71lJq9SLE,718
1078
1078
  django_cfg/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1079
- django_cfg/templatetags/django_cfg.py,sha256=Q1-dQV8SPOuQu1dFg5eT1gT88eEUXloYMz-7_-OHT0c,9522
1079
+ django_cfg/templatetags/django_cfg.py,sha256=pAUZQhq3k_JJtQXzabQnXyiHxkDoEGt0iUceeVHz6os,9498
1080
1080
  django_cfg/utils/__init__.py,sha256=64wwXJuXytvwt8Ze_erSR2HmV07nGWJ6DV5wloRBvYE,435
1081
1081
  django_cfg/utils/path_resolution.py,sha256=2n0I04lQkSssFaELu3A93YyMAl1K10KPdpxMt5k4Iy0,13341
1082
1082
  django_cfg/utils/smart_defaults.py,sha256=ZUj6K_Deq-fp5O0Dy_Emt257UWFn0f9bkgFv9YCR58U,9239
@@ -1084,9 +1084,9 @@ django_cfg/utils/version_check.py,sha256=WO51J2m2e-wVqWCRwbultEwu3q1lQasV67Mw2aa
1084
1084
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
1085
1085
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
1086
1086
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1087
- django_cfg/pyproject.toml,sha256=0AbWzGlCW_MemwzdLfIeySO-sNszpPYNvkPOTe_DUF4,8572
1088
- django_cfg-1.4.97.dist-info/METADATA,sha256=cb_cXupXvXVnnbikccyCZZwHhzgsBSOa8OWbx76N524,23733
1089
- django_cfg-1.4.97.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1090
- django_cfg-1.4.97.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1091
- django_cfg-1.4.97.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1092
- django_cfg-1.4.97.dist-info/RECORD,,
1087
+ django_cfg/pyproject.toml,sha256=fRimICIiTmgJtVtauQKZXaMf7_U-g66BldVRGf9DUdQ,8573
1088
+ django_cfg-1.4.101.dist-info/METADATA,sha256=iG0VURioei3gw3HtXC1UIxiE6k8xhcfEY9oZep_SnhA,23734
1089
+ django_cfg-1.4.101.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1090
+ django_cfg-1.4.101.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1091
+ django_cfg-1.4.101.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1092
+ django_cfg-1.4.101.dist-info/RECORD,,