django-cfg 1.3.3__py3-none-any.whl → 1.3.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.
Files changed (100) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/payments/admin_interface/old/payments/base.html +175 -0
  3. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +125 -0
  4. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +113 -0
  5. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +35 -0
  6. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +309 -0
  7. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +303 -0
  8. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +382 -0
  9. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +518 -0
  10. django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/components.css +248 -9
  11. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +163 -0
  12. django_cfg/apps/payments/admin_interface/serializers/__init__.py +39 -0
  13. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +149 -0
  14. django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +114 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/base.html +55 -90
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/dialog.html +81 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_help_dialog.html +112 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +175 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +21 -17
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +123 -250
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +170 -269
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +152 -355
  23. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +202 -551
  24. django_cfg/apps/payments/admin_interface/views/__init__.py +25 -14
  25. django_cfg/apps/payments/admin_interface/views/api/__init__.py +20 -0
  26. django_cfg/apps/payments/admin_interface/views/api/payments.py +191 -0
  27. django_cfg/apps/payments/admin_interface/views/api/stats.py +206 -0
  28. django_cfg/apps/payments/admin_interface/views/api/users.py +60 -0
  29. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +257 -0
  30. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +70 -0
  31. django_cfg/apps/payments/admin_interface/views/base.py +114 -0
  32. django_cfg/apps/payments/admin_interface/views/dashboard.py +60 -0
  33. django_cfg/apps/payments/admin_interface/views/forms.py +94 -0
  34. django_cfg/apps/payments/config/helpers.py +2 -2
  35. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +16 -6
  36. django_cfg/apps/payments/management/commands/currency_stats.py +72 -5
  37. django_cfg/apps/payments/management/commands/manage_currencies.py +9 -20
  38. django_cfg/apps/payments/management/commands/manage_providers.py +5 -5
  39. django_cfg/apps/payments/middleware/api_access.py +35 -34
  40. django_cfg/apps/payments/migrations/0001_initial.py +1 -1
  41. django_cfg/apps/payments/models/managers/api_key_managers.py +4 -0
  42. django_cfg/apps/payments/models/managers/payment_managers.py +5 -0
  43. django_cfg/apps/payments/models/subscriptions.py +0 -24
  44. django_cfg/apps/payments/services/cache/__init__.py +1 -1
  45. django_cfg/apps/payments/services/core/balance_service.py +13 -2
  46. django_cfg/apps/payments/services/integrations/ngrok_service.py +3 -3
  47. django_cfg/apps/payments/services/providers/registry.py +20 -0
  48. django_cfg/apps/payments/signals/balance_signals.py +7 -4
  49. django_cfg/apps/payments/static/payments/js/api-client.js +385 -0
  50. django_cfg/apps/payments/static/payments/js/ngrok-status.js +58 -0
  51. django_cfg/apps/payments/static/payments/js/payment-dashboard.js +50 -0
  52. django_cfg/apps/payments/static/payments/js/payment-form.js +175 -0
  53. django_cfg/apps/payments/static/payments/js/payment-list.js +95 -0
  54. django_cfg/apps/payments/static/payments/js/webhook-dashboard.js +154 -0
  55. django_cfg/apps/payments/urls.py +4 -0
  56. django_cfg/apps/payments/urls_admin.py +37 -18
  57. django_cfg/apps/payments/views/api/api_keys.py +14 -0
  58. django_cfg/apps/payments/views/api/base.py +1 -0
  59. django_cfg/apps/payments/views/api/currencies.py +2 -2
  60. django_cfg/apps/payments/views/api/payments.py +11 -5
  61. django_cfg/apps/payments/views/api/subscriptions.py +36 -31
  62. django_cfg/apps/payments/views/overview/__init__.py +40 -0
  63. django_cfg/apps/payments/views/overview/serializers.py +205 -0
  64. django_cfg/apps/payments/views/overview/services.py +439 -0
  65. django_cfg/apps/payments/views/overview/urls.py +27 -0
  66. django_cfg/apps/payments/views/overview/views.py +231 -0
  67. django_cfg/apps/payments/views/serializers/api_keys.py +20 -6
  68. django_cfg/apps/payments/views/serializers/balances.py +5 -8
  69. django_cfg/apps/payments/views/serializers/currencies.py +2 -6
  70. django_cfg/apps/payments/views/serializers/payments.py +37 -32
  71. django_cfg/apps/payments/views/serializers/subscriptions.py +4 -26
  72. django_cfg/core/config.py +25 -15
  73. django_cfg/core/generation.py +12 -12
  74. django_cfg/core/integration/display/startup.py +1 -1
  75. django_cfg/core/validation.py +4 -4
  76. django_cfg/management/commands/show_config.py +2 -2
  77. django_cfg/management/commands/tree.py +1 -3
  78. django_cfg/middleware/__init__.py +2 -0
  79. django_cfg/middleware/static_nocache.py +55 -0
  80. django_cfg/models/payments.py +13 -15
  81. django_cfg/models/security.py +15 -0
  82. django_cfg/modules/django_ngrok.py +6 -0
  83. django_cfg/modules/django_unfold/dashboard.py +1 -3
  84. django_cfg/utils/smart_defaults.py +41 -1
  85. {django_cfg-1.3.3.dist-info → django_cfg-1.3.7.dist-info}/METADATA +1 -1
  86. {django_cfg-1.3.3.dist-info → django_cfg-1.3.7.dist-info}/RECORD +97 -64
  87. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +0 -38
  88. django_cfg/apps/payments/admin_interface/views/payment_views.py +0 -259
  89. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +0 -37
  90. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/loading_spinner.html +0 -0
  91. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/notification.html +0 -0
  92. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/provider_card.html +0 -0
  93. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/currency_converter.html +0 -0
  94. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/payment_status.html +0 -0
  95. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/dashboard.css +0 -0
  96. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/components.js +0 -0
  97. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/utils.js +0 -0
  98. {django_cfg-1.3.3.dist-info → django_cfg-1.3.7.dist-info}/WHEEL +0 -0
  99. {django_cfg-1.3.3.dist-info → django_cfg-1.3.7.dist-info}/entry_points.txt +0 -0
  100. {django_cfg-1.3.3.dist-info → django_cfg-1.3.7.dist-info}/licenses/LICENSE +0 -0
@@ -179,7 +179,7 @@ class SettingsGenerator:
179
179
  # Apply database defaults for each database based on its engine
180
180
  for alias, db_config in config.databases.items():
181
181
  db_defaults = SmartDefaults.get_database_defaults(
182
- config._environment,
182
+ config.env_mode,
183
183
  config.debug,
184
184
  db_config.engine
185
185
  )
@@ -219,17 +219,17 @@ class SettingsGenerator:
219
219
 
220
220
  # Default cache - always provide one
221
221
  if config.cache_default:
222
- caches["default"] = config.cache_default.to_django_config(config._environment, config.debug, "default")
222
+ caches["default"] = config.cache_default.to_django_config(config.env_mode, config.debug, "default")
223
223
  else:
224
224
  # Create default cache backend
225
225
  from django_cfg.models.cache import CacheConfig
226
226
 
227
227
  default_cache = CacheConfig()
228
- caches["default"] = default_cache.to_django_config(config._environment, config.debug, "default")
228
+ caches["default"] = default_cache.to_django_config(config.env_mode, config.debug, "default")
229
229
 
230
230
  # Sessions cache
231
231
  if config.cache_sessions:
232
- caches["sessions"] = config.cache_sessions.to_django_config(config._environment, config.debug, "sessions")
232
+ caches["sessions"] = config.cache_sessions.to_django_config(config.env_mode, config.debug, "sessions")
233
233
 
234
234
  # Configure Django to use cache for sessions (can be overridden)
235
235
  settings["SESSION_ENGINE"] = "django.contrib.sessions.backends.cache"
@@ -241,7 +241,7 @@ class SettingsGenerator:
241
241
  cache_obj = getattr(config, attr_name)
242
242
  if hasattr(cache_obj, "to_django_config"):
243
243
  cache_alias = attr_name.replace("cache_", "")
244
- caches[cache_alias] = cache_obj.to_django_config(config._environment, config.debug, cache_alias)
244
+ caches[cache_alias] = cache_obj.to_django_config(config.env_mode, config.debug, cache_alias)
245
245
 
246
246
  if caches:
247
247
  settings["CACHES"] = caches
@@ -261,7 +261,7 @@ class SettingsGenerator:
261
261
  if config.security_domains or config.ssl_redirect is not None:
262
262
  security_defaults = SmartDefaults.get_security_defaults(
263
263
  config.security_domains,
264
- config._environment,
264
+ config.env_mode,
265
265
  config.debug,
266
266
  config.ssl_redirect,
267
267
  config.cors_allow_headers
@@ -275,12 +275,12 @@ class SettingsGenerator:
275
275
  pass
276
276
 
277
277
  # Additional security settings for production
278
- if config._environment == "production":
278
+ if config.env_mode == "production":
279
279
  settings.update(
280
280
  {
281
- "SESSION_COOKIE_AGE": 86400, # 24 hours
281
+ "SESSION_COOKIE_AGE": 2592000, # 30 days (30 * 24 * 60 * 60)
282
282
  "SESSION_SAVE_EVERY_REQUEST": True,
283
- "SESSION_EXPIRE_AT_BROWSER_CLOSE": True,
283
+ "SESSION_EXPIRE_AT_BROWSER_CLOSE": False, # Allow persistent sessions
284
284
  }
285
285
  )
286
286
 
@@ -296,7 +296,7 @@ class SettingsGenerator:
296
296
  settings = {}
297
297
 
298
298
  if config.email:
299
- email_settings = config.email.to_django_config(config._environment, config.debug)
299
+ email_settings = config.email.to_django_config(config.env_mode, config.debug)
300
300
  settings.update(email_settings)
301
301
 
302
302
  return settings
@@ -311,7 +311,7 @@ class SettingsGenerator:
311
311
  settings = {}
312
312
 
313
313
  # Generate logging defaults
314
- logging_defaults = SmartDefaults.get_logging_defaults(config._environment, config.debug)
314
+ logging_defaults = SmartDefaults.get_logging_defaults(config.env_mode, config.debug)
315
315
 
316
316
  if logging_defaults:
317
317
  settings["LOGGING"] = logging_defaults
@@ -370,7 +370,7 @@ class SettingsGenerator:
370
370
  }
371
371
 
372
372
  # Adjust for different environments
373
- if config._environment == "development":
373
+ if config.env_mode == "development":
374
374
  settings["USE_L10N"] = True # Deprecated but sometimes needed
375
375
 
376
376
  return settings
@@ -122,7 +122,7 @@ class StartupDisplayManager(BaseDisplayManager):
122
122
  info_table.add_row("🏗️ Project", self.config.project_name)
123
123
 
124
124
  # Add environment source
125
- env_source = getattr(self.config, '_environment', 'default_fallback')
125
+ env_source = getattr(self.config, 'env_mode', 'default_fallback')
126
126
  info_table.add_row("🔍 Env Source", env_source)
127
127
 
128
128
  info_table.add_row("🌐 Site", LIB_SITE_URL)
@@ -81,7 +81,7 @@ class ConfigurationValidator:
81
81
  errors.append("SECRET_KEY must be at least 50 characters long")
82
82
  else:
83
83
  # Check for insecure patterns in production
84
- if config._environment == 'production':
84
+ if config.env_mode == 'production':
85
85
  insecure_patterns = [
86
86
  'django-insecure',
87
87
  'change-me',
@@ -110,7 +110,7 @@ class ConfigurationValidator:
110
110
  errors.append(f"Invalid hostname in ALLOWED_HOSTS[{i}]: '{host}'")
111
111
 
112
112
  # Production-specific validation
113
- if config._environment == 'production' and '*' in allowed_hosts:
113
+ if config.env_mode == 'production' and '*' in allowed_hosts:
114
114
  errors.append("Wildcard '*' in ALLOWED_HOSTS is not recommended for production")
115
115
 
116
116
  return errors
@@ -143,7 +143,7 @@ class ConfigurationValidator:
143
143
  errors = []
144
144
 
145
145
  # Environment-specific security validation
146
- if config._environment == 'production':
146
+ if config.env_mode == 'production':
147
147
  # Allow DEBUG=True in production for development purposes
148
148
  pass
149
149
 
@@ -161,7 +161,7 @@ class ConfigurationValidator:
161
161
  """Validate environment-specific consistency."""
162
162
  errors = []
163
163
 
164
- environment = config._environment
164
+ environment = config.env_mode
165
165
 
166
166
  if environment == 'production':
167
167
  # Production requirements - allow DEBUG=True for development
@@ -100,7 +100,7 @@ class Command(BaseCommand):
100
100
  self.stdout.write(self.style.SUCCESS('\n🌍 Environment'))
101
101
  self.stdout.write('-' * 40)
102
102
  env_data = [
103
- ('Environment', getattr(config, '_environment', 'auto-detected')),
103
+ ('Environment', getattr(config, 'env_mode', 'auto-detected')),
104
104
  ('Debug Mode', config.debug),
105
105
  ('Security Domains', ', '.join(config.security_domains) if config.security_domains else 'None'),
106
106
  ]
@@ -186,7 +186,7 @@ class Command(BaseCommand):
186
186
  'description': getattr(config, 'project_description', None),
187
187
  },
188
188
  'environment': {
189
- 'environment': getattr(config, '_environment', 'auto-detected'),
189
+ 'environment': getattr(config, 'env_mode', 'auto-detected'),
190
190
  'debug': config.debug,
191
191
  'allowed_hosts': config.allowed_hosts,
192
192
  },
@@ -97,9 +97,7 @@ class Command(BaseCommand):
97
97
 
98
98
  # Try to get environment info
99
99
  try:
100
- env_info = getattr(config, 'environment', 'unknown')
101
- if hasattr(config, '_environment'):
102
- env_info = config._environment or 'unknown'
100
+ env_info = getattr(config, 'env_mode', 'unknown')
103
101
  self.stdout.write(
104
102
  self.style.HTTP_INFO(f"🔧 Environment: {env_info}")
105
103
  )
@@ -5,7 +5,9 @@ Provides middleware components for Django CFG applications.
5
5
  """
6
6
 
7
7
  from .user_activity import UserActivityMiddleware
8
+ from .static_nocache import StaticNoCacheMiddleware
8
9
 
9
10
  __all__ = [
10
11
  'UserActivityMiddleware',
12
+ 'StaticNoCacheMiddleware',
11
13
  ]
@@ -0,0 +1,55 @@
1
+ """
2
+ Static files no-cache middleware for django-cfg.
3
+
4
+ Automatically disables caching for static files in development environments
5
+ to prevent browser caching issues during development.
6
+ """
7
+
8
+ from django.conf import settings
9
+ from django_cfg.core.config import EnvironmentMode
10
+
11
+
12
+ class StaticNoCacheMiddleware:
13
+ """
14
+ Middleware to disable caching for static files in development.
15
+
16
+ This ensures that JavaScript and CSS files are always fresh during development,
17
+ preventing browser caching issues when files are updated.
18
+
19
+ Automatically detects development mode based on:
20
+ - DEBUG setting
21
+ - ENV_MODE environment variable
22
+ """
23
+
24
+ def __init__(self, get_response):
25
+ self.get_response = get_response
26
+
27
+ # Determine if we should disable caching
28
+ self.should_disable_cache = self._should_disable_cache()
29
+
30
+ def _should_disable_cache(self):
31
+ """Determine if caching should be disabled based on environment."""
32
+ # Always disable in DEBUG mode
33
+ if settings.DEBUG:
34
+ return True
35
+
36
+ # Check ENV_MODE if available
37
+ env_mode = getattr(settings, 'ENV_MODE', None)
38
+ if env_mode == EnvironmentMode.DEVELOPMENT or env_mode == EnvironmentMode.TEST:
39
+ return True
40
+
41
+ return False
42
+
43
+ def __call__(self, request):
44
+ response = self.get_response(request)
45
+
46
+ # Apply no-cache headers for static files in development
47
+ if self.should_disable_cache and request.path.startswith('/static/'):
48
+ response['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
49
+ response['Pragma'] = 'no-cache'
50
+ response['Expires'] = '0'
51
+ # Add ETag removal to prevent conditional requests
52
+ if 'ETag' in response:
53
+ del response['ETag']
54
+
55
+ return response
@@ -28,25 +28,23 @@ class PaymentsConfig(BaseModel):
28
28
  description="Enable payments middleware"
29
29
  )
30
30
 
31
- api_prefixes: List[str] = Field(
32
- default=['/api/'],
33
- description="API path prefixes that require authentication"
31
+ # Whitelist approach - only these paths require API key
32
+ protected_paths: List[str] = Field(
33
+ default=[
34
+ '/api/admin/', # Admin API endpoints
35
+ '/api/private/', # Private API endpoints
36
+ '/api/secure/', # Secure API endpoints
37
+ ],
38
+ description="Paths that require API key authentication (whitelist approach)"
34
39
  )
35
40
 
36
- exempt_paths: List[str] = Field(
41
+ protected_patterns: List[str] = Field(
37
42
  default=[
38
- '/api/payments/create/',
39
- '/api/payments/status/',
40
- '/api/currencies/rates/',
41
- '/api/currencies/supported/',
42
- '/api/api-keys/create/',
43
- '/api/api-keys/validate/',
44
- '/api/health/',
45
- '/admin/',
46
- '/static/',
47
- '/media/',
43
+ r'^/api/admin/.*$', # All admin API endpoints
44
+ r'^/api/private/.*$', # All private API endpoints
45
+ r'^/api/secure/.*$', # All secure API endpoints
48
46
  ],
49
- description="Paths exempt from API authentication"
47
+ description="Regex patterns for paths that require API key authentication"
50
48
  )
51
49
 
52
50
  # Rate limiting defaults
@@ -22,6 +22,20 @@ class SecurityConfig(BaseConfig):
22
22
  cors_allow_all_origins: bool = Field(default=False, description="Allow all origins (dev only)")
23
23
  cors_allowed_origins: List[str] = Field(default_factory=list, description="Allowed CORS origins")
24
24
  cors_allow_credentials: bool = Field(default=True, description="Allow CORS credentials")
25
+ cors_allow_headers: List[str] = Field(
26
+ default_factory=lambda: [
27
+ "accept",
28
+ "accept-encoding",
29
+ "authorization",
30
+ "content-type",
31
+ "dnt",
32
+ "origin",
33
+ "user-agent",
34
+ "x-csrftoken",
35
+ "x-requested-with",
36
+ ],
37
+ description="CORS allowed headers with common defaults for API usage",
38
+ )
25
39
 
26
40
  # CSRF settings
27
41
  csrf_enabled: bool = Field(default=True, description="Enable CSRF protection")
@@ -85,6 +99,7 @@ class SecurityConfig(BaseConfig):
85
99
  'CORS_ALLOW_ALL_ORIGINS': self.cors_allow_all_origins,
86
100
  'CORS_ALLOWED_ORIGINS': self.cors_allowed_origins,
87
101
  'CORS_ALLOW_CREDENTIALS': self.cors_allow_credentials,
102
+ 'CORS_ALLOW_HEADERS': self.cors_allow_headers,
88
103
  })
89
104
 
90
105
  # Add corsheaders to middleware if not present
@@ -299,6 +299,11 @@ def is_ngrok_available_from_env() -> bool:
299
299
  return get_ngrok_service().is_ngrok_available_from_env()
300
300
 
301
301
 
302
+ def is_tunnel_active() -> bool:
303
+ """Check if ngrok tunnel is actually active."""
304
+ return get_ngrok_service().is_tunnel_active()
305
+
306
+
302
307
  def get_effective_tunnel_url() -> Optional[str]:
303
308
  """Get effective tunnel URL (from manager or environment)."""
304
309
  return get_ngrok_service().get_effective_tunnel_url()
@@ -318,5 +323,6 @@ __all__ = [
318
323
  "get_tunnel_url_from_env",
319
324
  "get_ngrok_host_from_env",
320
325
  "is_ngrok_available_from_env",
326
+ "is_tunnel_active",
321
327
  "get_effective_tunnel_url",
322
328
  ]
@@ -16,9 +16,7 @@ from .models.dashboard import StatCard, StatsCardsWidget
16
16
 
17
17
  class DashboardManager(BaseCfgModule):
18
18
  """
19
- Dashboard configuration manager for Unfold.
20
-
21
- Based on the working configuration from @old/api__old/api/dashboard/unfold_config.py
19
+ Dashboard configuration manager for Unfold.
22
20
  """
23
21
 
24
22
  def __init__(self):
@@ -89,7 +89,10 @@ class SmartDefaults:
89
89
  cors_allow_headers=None
90
90
  ) -> Dict[str, Any]:
91
91
  """Get security configuration defaults."""
92
- return {
92
+ from ..models.security import SecurityConfig
93
+
94
+ # Base security settings
95
+ base_settings = {
93
96
  'USE_TZ': True,
94
97
  'USE_I18N': True,
95
98
  'USE_L10N': True,
@@ -100,6 +103,43 @@ class SmartDefaults:
100
103
  'SECURE_HSTS_INCLUDE_SUBDOMAINS': not debug,
101
104
  'SECURE_HSTS_PRELOAD': not debug,
102
105
  }
106
+
107
+ # Add CORS settings if security domains are configured
108
+ if security_domains:
109
+ # Combine default CORS headers with custom ones
110
+ default_headers = SecurityConfig().cors_allow_headers
111
+ if cors_allow_headers:
112
+ # Combine and deduplicate headers
113
+ all_headers = default_headers + cors_allow_headers
114
+ seen = set()
115
+ unique_headers = []
116
+ for header in all_headers:
117
+ if header.lower() not in seen:
118
+ seen.add(header.lower())
119
+ unique_headers.append(header)
120
+ final_headers = unique_headers
121
+ else:
122
+ final_headers = default_headers
123
+
124
+ # Create SecurityConfig with appropriate settings
125
+ security_config = SecurityConfig(
126
+ cors_enabled=True,
127
+ cors_allow_all_origins=debug or environment == "development",
128
+ cors_allowed_origins=security_domains if not (debug or environment == "development") else [],
129
+ cors_allow_credentials=True,
130
+ cors_allow_headers=final_headers,
131
+ ssl_redirect=ssl_redirect or False,
132
+ )
133
+
134
+ # Configure for development if needed
135
+ if debug or environment == "development":
136
+ security_config.configure_for_development()
137
+
138
+ # Get Django settings from SecurityConfig
139
+ cors_settings = security_config.to_django_settings()
140
+ base_settings.update(cors_settings)
141
+
142
+ return base_settings
103
143
 
104
144
  @classmethod
105
145
  def get_logging_defaults(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.3.3
3
+ Version: 1.3.7
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://djangocfg.com
6
6
  Project-URL: Documentation, https://docs.djangocfg.com