django-cfg 1.4.6__py3-none-any.whl → 1.4.7__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.
@@ -16,7 +16,7 @@ from drf_spectacular.utils import extend_schema, extend_schema_view
16
16
  from .base import PaymentBaseViewSet, NestedPaymentViewSet, ReadOnlyPaymentViewSet
17
17
  from ...models import APIKey
18
18
  from ..serializers.api_keys import (
19
- APIKeySerializer,
19
+ APIKeyDetailSerializer,
20
20
  APIKeyCreateSerializer,
21
21
  APIKeyListSerializer,
22
22
  APIKeyUpdateSerializer,
@@ -39,16 +39,16 @@ class APIKeyViewSet(PaymentBaseViewSet):
39
39
  """
40
40
 
41
41
  queryset = APIKey.objects.all()
42
- serializer_class = APIKeySerializer
42
+ serializer_class = APIKeyDetailSerializer
43
43
  permission_classes = [permissions.IsAdminUser] # Admin only for global access
44
44
  filterset_fields = ['is_active', 'user']
45
45
  search_fields = ['name', 'user__username', 'user__email']
46
46
  ordering_fields = ['created_at', 'updated_at', 'last_used_at', 'expires_at', 'total_requests']
47
-
47
+
48
48
  serializer_classes = {
49
49
  'list': APIKeyListSerializer,
50
50
  'create': APIKeyCreateSerializer,
51
- 'retrieve': APIKeySerializer,
51
+ 'retrieve': APIKeyDetailSerializer,
52
52
  'update': APIKeyUpdateSerializer,
53
53
  'partial_update': APIKeyUpdateSerializer,
54
54
  }
@@ -209,20 +209,20 @@ class UserAPIKeyViewSet(NestedPaymentViewSet):
209
209
  """
210
210
 
211
211
  queryset = APIKey.objects.all()
212
- serializer_class = APIKeySerializer
212
+ serializer_class = APIKeyDetailSerializer
213
213
  permission_classes = [permissions.IsAuthenticated]
214
214
  filterset_fields = ['is_active']
215
215
  search_fields = ['name']
216
216
  ordering_fields = ['created_at', 'updated_at', 'last_used_at', 'expires_at']
217
-
217
+
218
218
  # Nested ViewSet configuration
219
219
  parent_lookup_field = 'user_pk'
220
220
  parent_model_field = 'user'
221
-
221
+
222
222
  serializer_classes = {
223
223
  'list': APIKeyListSerializer,
224
224
  'create': APIKeyCreateSerializer,
225
- 'retrieve': APIKeySerializer,
225
+ 'retrieve': APIKeyDetailSerializer,
226
226
  'update': APIKeyUpdateSerializer,
227
227
  'partial_update': APIKeyUpdateSerializer,
228
228
  }
@@ -41,7 +41,7 @@ from .currencies import (
41
41
 
42
42
  # API Key serializers
43
43
  from .api_keys import (
44
- APIKeySerializer,
44
+ APIKeyDetailSerializer,
45
45
  APIKeyCreateSerializer,
46
46
  APIKeyListSerializer,
47
47
  APIKeyUpdateSerializer,
@@ -85,7 +85,7 @@ __all__ = [
85
85
  'CurrencyConversionSerializer',
86
86
 
87
87
  # API Key serializers
88
- 'APIKeySerializer',
88
+ 'APIKeyDetailSerializer',
89
89
  'APIKeyCreateSerializer',
90
90
  'APIKeyListSerializer',
91
91
  'APIKeyUpdateSerializer',
@@ -7,6 +7,7 @@ DRF serializers for API key operations with service integration.
7
7
  from rest_framework import serializers
8
8
  from typing import Dict, Any
9
9
  from django.contrib.auth import get_user_model
10
+ from drf_spectacular.utils import extend_schema_serializer, extend_schema_field, OpenApiTypes
10
11
 
11
12
  from ...models import APIKey
12
13
  from django_cfg.modules.django_logging import get_logger
@@ -43,19 +44,19 @@ class APIKeyListSerializer(serializers.ModelSerializer):
43
44
  read_only_fields = fields
44
45
 
45
46
 
46
- class APIKeySerializer(serializers.ModelSerializer):
47
+ class APIKeyDetailSerializer(serializers.ModelSerializer):
47
48
  """
48
49
  Complete API key serializer with full details.
49
-
50
+
50
51
  Used for API key detail views (no key value for security).
51
52
  """
52
-
53
+
53
54
  user = serializers.StringRelatedField(read_only=True)
54
55
  key_preview = serializers.CharField(read_only=True)
55
56
  is_expired = serializers.BooleanField(read_only=True)
56
57
  is_valid = serializers.BooleanField(read_only=True)
57
58
  days_until_expiry = serializers.IntegerField(read_only=True)
58
-
59
+
59
60
  class Meta:
60
61
  model = APIKey
61
62
  fields = [
@@ -73,18 +74,7 @@ class APIKeySerializer(serializers.ModelSerializer):
73
74
  'created_at',
74
75
  'updated_at',
75
76
  ]
76
- read_only_fields = [
77
- 'id',
78
- 'user',
79
- 'key_preview',
80
- 'is_expired',
81
- 'is_valid',
82
- 'days_until_expiry',
83
- 'total_requests',
84
- 'last_used_at',
85
- 'created_at',
86
- 'updated_at',
87
- ]
77
+ read_only_fields = fields # All fields are read-only to prevent TypeScript split
88
78
 
89
79
 
90
80
  class APIKeyCreateSerializer(serializers.Serializer):
@@ -153,7 +143,7 @@ class APIKeyCreateSerializer(serializers.Serializer):
153
143
 
154
144
  def to_representation(self, instance: APIKey) -> Dict[str, Any]:
155
145
  """Return API key data with full key value (only on creation)."""
156
- data = APIKeySerializer(instance, context=self.context).data
146
+ data = APIKeyDetailSerializer(instance, context=self.context).data
157
147
 
158
148
  # Add full key value only on creation (security: shown only once)
159
149
  data['key'] = instance.key
@@ -288,7 +278,7 @@ class APIKeyActionSerializer(serializers.Serializer):
288
278
  return {
289
279
  'success': True,
290
280
  'message': message,
291
- 'api_key': APIKeySerializer(api_key, context=self.context).data
281
+ 'api_key': APIKeyDetailSerializer(api_key, context=self.context).data
292
282
  }
293
283
  else:
294
284
  return {
@@ -341,7 +331,7 @@ class APIKeyValidationSerializer(serializers.Serializer):
341
331
  return {
342
332
  'success': True,
343
333
  'valid': True,
344
- 'api_key': APIKeySerializer(api_key, context=self.context).data,
334
+ 'api_key': APIKeyDetailSerializer(api_key, context=self.context).data,
345
335
  'message': 'API key is valid'
346
336
  }
347
337
  else:
@@ -364,12 +354,12 @@ class APIKeyValidationSerializer(serializers.Serializer):
364
354
  class APIKeyValidationResponseSerializer(serializers.Serializer):
365
355
  """
366
356
  API key validation response serializer.
367
-
357
+
368
358
  Defines the structure of API key validation response for OpenAPI schema.
369
359
  """
370
360
  success = serializers.BooleanField(help_text="Whether the validation was successful")
371
361
  valid = serializers.BooleanField(help_text="Whether the API key is valid")
372
- api_key = APIKeySerializer(allow_null=True, help_text="API key details if valid")
362
+ api_key = APIKeyDetailSerializer(allow_null=True, read_only=True, required=False, help_text="API key details if valid")
373
363
  message = serializers.CharField(help_text="Validation message")
374
364
  error = serializers.CharField(required=False, help_text="Error message if validation failed")
375
365
  error_code = serializers.CharField(required=False, help_text="Error code if validation failed")
@@ -3,6 +3,19 @@ Django Revolution Configuration with DRF Integration
3
3
 
4
4
  Extended configuration model that includes DRF parameters for automatic
5
5
  integration with django_revolution's create_drf_config.
6
+
7
+ TypeScript Client Generation Issue & Solution:
8
+ ----------------------------------------------
9
+ Problem: @hey-api/openapi-ts splits types with mixed readonly/writable fields into
10
+ Readable/Writable versions (e.g., ApiKeyDetailReadable, ApiKeyDetailWritable),
11
+ but references inside other types still use the base name (e.g., ApiKeyDetail),
12
+ causing "Cannot find name 'ApiKeyDetail'" errors.
13
+
14
+ Solution: Make all fields in detail serializers read-only to prevent splitting:
15
+ class Meta:
16
+ read_only_fields = fields # All fields read-only prevents TS split
17
+
18
+ This ensures TypeScript generator creates a single type without Readable/Writable suffix.
6
19
  """
7
20
 
8
21
  from typing import Dict, Any, Optional
@@ -104,7 +117,7 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
104
117
  description="Support tickets and messages API",
105
118
  public=False,
106
119
  auth_required=True,
107
- version="v1",
120
+ # version="v1",
108
121
  )
109
122
 
110
123
  # Add Accounts zone if enabled
@@ -116,9 +129,9 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
116
129
  description="User management, OTP, profiles, and activity tracking API",
117
130
  public=False,
118
131
  auth_required=True,
119
- version="v1",
132
+ # version="v1",
120
133
  )
121
-
134
+
122
135
  # Add Newsletter zone if enabled
123
136
  default_newsletter_zone = 'cfg_newsletter'
124
137
  if newsletter_enabled and default_newsletter_zone not in zones:
@@ -128,9 +141,9 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
128
141
  description="Email campaigns, subscriptions, and newsletter management API",
129
142
  public=False,
130
143
  auth_required=True,
131
- version="v1",
144
+ # version="v1",
132
145
  )
133
-
146
+
134
147
  # Add Leads zone if enabled
135
148
  default_leads_zone = 'cfg_leads'
136
149
  if leads_enabled and default_leads_zone not in zones:
@@ -140,9 +153,9 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
140
153
  description="Lead collection, contact forms, and CRM integration API",
141
154
  public=True, # Leads can be public for contact forms
142
155
  auth_required=False,
143
- version="v1",
156
+ # version="v1",
144
157
  )
145
-
158
+
146
159
  # Add Knowbase zone if enabled
147
160
  default_knowbase_zone = 'cfg_knowbase'
148
161
  if knowbase_enabled and default_knowbase_zone not in zones:
@@ -152,9 +165,9 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
152
165
  description="Knowledge base, AI chat, embeddings, and search API",
153
166
  public=False,
154
167
  auth_required=True,
155
- version="v1",
168
+ # version="v1",
156
169
  )
157
-
170
+
158
171
  # Add Agents zone if enabled
159
172
  default_agents_zone = 'cfg_agents'
160
173
  if agents_enabled and default_agents_zone not in zones:
@@ -164,9 +177,9 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
164
177
  description="Agent definitions, executions, workflows, and tools API",
165
178
  public=False,
166
179
  auth_required=True,
167
- version="v1",
180
+ # version="v1",
168
181
  )
169
-
182
+
170
183
  # Add Tasks zone if enabled
171
184
  default_tasks_zone = 'cfg_tasks'
172
185
  if tasks_enabled and default_tasks_zone not in zones:
@@ -176,7 +189,7 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
176
189
  description="Tasks, workflows, and automation API",
177
190
  public=False,
178
191
  auth_required=True,
179
- version="v1",
192
+ # version="v1",
180
193
  )
181
194
 
182
195
  # Add Payments zone if enabled
@@ -188,7 +201,7 @@ class ExtendedRevolutionConfig(BaseDjangoRevolutionConfig):
188
201
  description="Payments, subscriptions, and billing API",
189
202
  public=False,
190
203
  auth_required=True,
191
- version="v1",
204
+ # version="v1",
192
205
  )
193
206
 
194
207
  except Exception:
django_cfg/pyproject.toml CHANGED
@@ -4,13 +4,13 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-cfg"
7
- version = "1.4.6"
7
+ version = "1.4.7"
8
8
  description = "Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django."
9
9
  readme = "README.md"
10
10
  keywords = [ "django", "configuration", "pydantic", "settings", "type-safety", "pydantic-settings", "django-environ", "startup-validation", "ide-autocomplete", "ai-agents", "enterprise-django", "django-settings", "type-safe-config",]
11
11
  classifiers = [ "Development Status :: 4 - Beta", "Framework :: Django", "Framework :: Django :: 5.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Systems Administration", "Typing :: Typed",]
12
12
  requires-python = ">=3.12,<4.0"
13
- dependencies = [ "pydantic>=2.11.0,<3.0", "pydantic[email]>=2.11.0,<3.0", "PyYAML>=6.0,<7.0", "pydantic-yaml>=1.6.0,<2.0", "click>=8.2.0,<9.0", "questionary>=2.1.0,<3.0", "rich>=14.0.0,<15.0", "cloudflare>=4.3.0,<5.0", "loguru>=0.7.0,<1.0", "colorlog>=6.9.0,<7.0", "cachetools>=5.3.0,<7.0", "toml>=0.10.2,<0.11.0", "ngrok>=1.5.1; python_version>='3.12'", "psycopg[binary,pool]>=3.2.0,<4.0", "dj-database-url>=3.0.0,<4.0", "whitenoise>=6.8.0,<7.0", "django-cors-headers>=4.7.0,<5.0", "djangorestframework>=3.16.0,<4.0", "djangorestframework-simplejwt>=5.5.0,<6.0", "djangorestframework-simplejwt[token-blacklist]>=5.5.0,<6.0", "drf-nested-routers>=0.94.0,<1.0", "django-filter>=25.0,<26.0", "django-ratelimit>=4.1.0,<5.0.0", "drf-spectacular>=0.28.0,<1.0", "drf-spectacular-sidecar>=2025.8.0,<2026.0", "django-json-widget>=2.0.0,<3.0", "django-import-export>=4.3.0,<5.0", "django-extensions>=4.1.0,<5.0", "django-constance>=4.3.0,<5.0", "django-unfold>=0.64.0,<1.0", "django-redis>=6.0.0,<7.0", "redis>=6.4.0,<7.0", "hiredis>=2.0.0,<4.0", "dramatiq[redis]>=1.18.0,<2.0", "django-dramatiq>=0.14.0,<1.0", "pyTelegramBotAPI>=4.28.0,<5.0", "coolname>=2.2.0,<3.0", "django-admin-rangefilter>=0.13.0,<1.0", "python-json-logger>=3.3.0,<4.0", "requests>=2.32.0,<3.0", "tiktoken>=0.11.0,<1.0", "openai>=1.107.0,<2.0", "twilio>=9.8.0,<10.0", "sendgrid>=6.12.0,<7.0", "beautifulsoup4>=4.13.0,<5.0", "lxml>=6.0.0,<7.0", "pgvector>=0.4.0,<1.0", "pydantic-ai>=1.0.10,<2.0", "django-revolution>=1.0.43,<2.0", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)",]
13
+ dependencies = [ "pydantic>=2.11.0,<3.0", "pydantic[email]>=2.11.0,<3.0", "PyYAML>=6.0,<7.0", "pydantic-yaml>=1.6.0,<2.0", "click>=8.2.0,<9.0", "questionary>=2.1.0,<3.0", "rich>=14.0.0,<15.0", "cloudflare>=4.3.0,<5.0", "loguru>=0.7.0,<1.0", "colorlog>=6.9.0,<7.0", "cachetools>=5.3.0,<7.0", "toml>=0.10.2,<0.11.0", "ngrok>=1.5.1; python_version>='3.12'", "psycopg[binary,pool]>=3.2.0,<4.0", "dj-database-url>=3.0.0,<4.0", "whitenoise>=6.8.0,<7.0", "django-cors-headers>=4.7.0,<5.0", "djangorestframework>=3.16.0,<4.0", "djangorestframework-simplejwt>=5.5.0,<6.0", "djangorestframework-simplejwt[token-blacklist]>=5.5.0,<6.0", "drf-nested-routers>=0.94.0,<1.0", "django-filter>=25.0,<26.0", "django-ratelimit>=4.1.0,<5.0.0", "drf-spectacular>=0.28.0,<1.0", "drf-spectacular-sidecar>=2025.8.0,<2026.0", "django-json-widget>=2.0.0,<3.0", "django-import-export>=4.3.0,<5.0", "django-extensions>=4.1.0,<5.0", "django-constance>=4.3.0,<5.0", "django-unfold>=0.64.0,<1.0", "django-redis>=6.0.0,<7.0", "redis>=6.4.0,<7.0", "hiredis>=2.0.0,<4.0", "dramatiq[redis]>=1.18.0,<2.0", "django-dramatiq>=0.14.0,<1.0", "pyTelegramBotAPI>=4.28.0,<5.0", "coolname>=2.2.0,<3.0", "django-admin-rangefilter>=0.13.0,<1.0", "python-json-logger>=3.3.0,<4.0", "requests>=2.32.0,<3.0", "tiktoken>=0.11.0,<1.0", "openai>=1.107.0,<2.0", "twilio>=9.8.0,<10.0", "sendgrid>=6.12.0,<7.0", "beautifulsoup4>=4.13.0,<5.0", "lxml>=6.0.0,<7.0", "pgvector>=0.4.0,<1.0", "pydantic-ai>=1.0.10,<2.0", "django-revolution>=1.0.44,<2.0", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)",]
14
14
  [[project.authors]]
15
15
  name = "Django-CFG Team"
16
16
  email = "info@djangocfg.com"
@@ -141,6 +141,10 @@ exclude = [ "@*", "tests", "scripts", "*.log", ".env*",]
141
141
  path = "/Users/markinmatrix/djangoipc"
142
142
  develop = true
143
143
 
144
+ [tool.poetry.group.local.dependencies.django-revolution]
145
+ path = "/Users/markinmatrix/revolution"
146
+ develop = true
147
+
144
148
  [tool.hatch.build.targets.wheel.force-include]
145
149
  LICENSE = "django_cfg/LICENSE"
146
150
  "CONTRIBUTING.md" = "django_cfg/CONTRIBUTING.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.6
3
+ Version: 1.4.7
4
4
  Summary: Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -45,7 +45,7 @@ Requires-Dist: django-import-export<5.0,>=4.3.0
45
45
  Requires-Dist: django-json-widget<3.0,>=2.0.0
46
46
  Requires-Dist: django-ratelimit<5.0.0,>=4.1.0
47
47
  Requires-Dist: django-redis<7.0,>=6.0.0
48
- Requires-Dist: django-revolution<2.0,>=1.0.43
48
+ Requires-Dist: django-revolution<2.0,>=1.0.44
49
49
  Requires-Dist: django-tailwind[reload]<5.0.0,>=4.2.0
50
50
  Requires-Dist: django-unfold<1.0,>=0.64.0
51
51
  Requires-Dist: djangorestframework-simplejwt<6.0,>=5.5.0
@@ -459,7 +459,7 @@ django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html,
459
459
  django_cfg/apps/payments/templatetags/__init__.py,sha256=K8PcAAZu-q6LgCbrH29BSxwsWH0GQx-PhT7J-hBATMM,24
460
460
  django_cfg/apps/payments/templatetags/payment_tags.py,sha256=ooO9a5E6kWyaGoLmx2fam4dHnzb9_drhFYmgPT9em1g,11910
461
461
  django_cfg/apps/payments/views/api/__init__.py,sha256=gKd8dE4i-ebCxjquFHI6UaW6KKgV0RE3RlH22c8O4pU,2005
462
- django_cfg/apps/payments/views/api/api_keys.py,sha256=J5qfPfSjZtaWKaRMU_kxOWX8FNBZuacFYFSTGhTe5MQ,13836
462
+ django_cfg/apps/payments/views/api/api_keys.py,sha256=nzlRdkMjDY3-hChbSnAo3MFDqd5lulOcKgeajdQr7KQ,13854
463
463
  django_cfg/apps/payments/views/api/balances.py,sha256=1x8wyGZrM_dyXfkYMtB8YkLnLMFKv4Vv_mauXP-nI5Y,13090
464
464
  django_cfg/apps/payments/views/api/base.py,sha256=iUsI3L4eolTOqVZ-ZP8AgZp58_EsTkhZUcVcCxZuIis,10389
465
465
  django_cfg/apps/payments/views/api/currencies.py,sha256=B1Wi9MCoSgyFISrQLiqMHXtVwxOHbTLZ3X6BMEIUW3Y,13866
@@ -471,8 +471,8 @@ django_cfg/apps/payments/views/overview/serializers.py,sha256=uxDlzMIrn7hhS0aNEx
471
471
  django_cfg/apps/payments/views/overview/services.py,sha256=g7ypbE9v3dDyYvOv3nfwd9_1ZqWuH02UX6dcGCDv0fM,16259
472
472
  django_cfg/apps/payments/views/overview/urls.py,sha256=6Ldh8-hrkUakZDkZ7eMXpcYrdAnR8xs2UpmyDUOk4z8,1212
473
473
  django_cfg/apps/payments/views/overview/views.py,sha256=F1chPhhQYeey1Wpg7z7fKvlzqT5Nxr2dKIc5PioLc-U,7991
474
- django_cfg/apps/payments/views/serializers/__init__.py,sha256=mPY55D6bhRLyPHw6ORrEqtIdgyU2Uezg00EhgD5HK40,2310
475
- django_cfg/apps/payments/views/serializers/api_keys.py,sha256=8BGI44qijAQAZ4c1Skg8-_tvmydN04fgceGQHkVuONc,14874
474
+ django_cfg/apps/payments/views/serializers/__init__.py,sha256=jFDXboouH5lNIQbAz-X97DCDt3ucRzUKtLotr3nw1j0,2322
475
+ django_cfg/apps/payments/views/serializers/api_keys.py,sha256=7sG4mt9j1v7I2_dmnMTFBEiGm2UVasZV8fBdltgUgQg,14807
476
476
  django_cfg/apps/payments/views/serializers/balances.py,sha256=CUUl9weGK-f_4KCGJ4Abv5VvJWq7ZpclaR49NpOlWHw,9415
477
477
  django_cfg/apps/payments/views/serializers/currencies.py,sha256=bpWBTE2kHaz7nKZwwYnzkyK6HYtOgULQ87ZBECY3q6Q,11330
478
478
  django_cfg/apps/payments/views/serializers/payments.py,sha256=SMRZEqga5KMFKZ-UiIcyafWmVC4nSeUZwwg9QPUG3JA,12543
@@ -661,7 +661,7 @@ django_cfg/models/base/module.py,sha256=P6YowmE-VOqp_L25Ijxj2hjjNhB9xtlm8G35DHWq
661
661
  django_cfg/models/django/__init__.py,sha256=i0GblTO8rF1J_WjT55WjhdbWN10l0UeR6mSFqdnOfak,347
662
662
  django_cfg/models/django/constance.py,sha256=IVklMTtusxWnWaU3PSatGLQfg5qY_Y89MZQjsJFwbCk,9175
663
663
  django_cfg/models/django/environment.py,sha256=jdg6DXQrnuLSdfZNV4KoFlkiPl1n2jOicPU8NFzyB5U,9439
664
- django_cfg/models/django/revolution.py,sha256=16fQ09iovrmlepNcTr2J0hZ-ShdMnMSQ2rTXa60yrus,8134
664
+ django_cfg/models/django/revolution.py,sha256=H4FqK24I3JOCsi5-FDPwMgRhRJxlYTMPMEOC53Ixj_U,8741
665
665
  django_cfg/models/infrastructure/__init__.py,sha256=If0XLyDNaR_F6rOhDJBCT5RmkOOoNcY61L70pQvaO1s,369
666
666
  django_cfg/models/infrastructure/cache.py,sha256=N6LWinyokWcmuJmInn0q48TQq0Je-xXMJdZ0DbelGPU,12175
667
667
  django_cfg/models/infrastructure/logging.py,sha256=6nQNQPUKEL7TAYX1KcYgsqHBKnHWoUnqhR54bxcr40s,10637
@@ -950,9 +950,9 @@ django_cfg/utils/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaN
950
950
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
951
951
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
952
952
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
953
- django_cfg/pyproject.toml,sha256=88nmJKNOuzteCBLdh9Py3ZzYRYY__N6BnFZiT5mSr4s,8216
954
- django_cfg-1.4.6.dist-info/METADATA,sha256=7L9aQv_xWde-XuQHa12P4iVN_9-0tKNTJzdWJ0vfxmk,22542
955
- django_cfg-1.4.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
956
- django_cfg-1.4.6.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
957
- django_cfg-1.4.6.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
958
- django_cfg-1.4.6.dist-info/RECORD,,
953
+ django_cfg/pyproject.toml,sha256=iHxb5y1vf2rBAMFn10U_JhKS9YMAI5yjFNi2guXam3M,8329
954
+ django_cfg-1.4.7.dist-info/METADATA,sha256=oAn4eWmJcby2cXPo2jT8TJz07k6AqY8xni4LaEwnGdI,22542
955
+ django_cfg-1.4.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
956
+ django_cfg-1.4.7.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
957
+ django_cfg-1.4.7.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
958
+ django_cfg-1.4.7.dist-info/RECORD,,