django-cfg 1.4.69__py3-none-any.whl → 1.4.71__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.
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.69"
35
+ __version__ = "1.4.71"
36
36
  __license__ = "MIT"
37
37
 
38
38
  # Import registry for organized lazy loading
@@ -20,6 +20,7 @@ from ...models import (
20
20
  ApiKeys,
21
21
  AxesConfig,
22
22
  CacheConfig,
23
+ CryptoFieldsConfig,
23
24
  DatabaseConfig,
24
25
  DRFConfig,
25
26
  EmailConfig,
@@ -274,6 +275,11 @@ class DjangoConfig(BaseModel):
274
275
  description="Django-Axes brute-force protection configuration (None = smart defaults)",
275
276
  )
276
277
 
278
+ crypto_fields: Optional["CryptoFieldsConfig"] = Field(
279
+ default=None,
280
+ description="Django Crypto Fields encryption configuration for sensitive data (API keys, tokens, passwords)",
281
+ )
282
+
277
283
  # === Admin Interface Configuration ===
278
284
  unfold: Optional[UnfoldConfig] = Field(
279
285
  default=None,
@@ -136,6 +136,9 @@ class InstalledAppsBuilder:
136
136
  if self.config.centrifugo and self.config.centrifugo.enabled:
137
137
  apps.append("django_cfg.apps.centrifugo")
138
138
 
139
+ if self.config.crypto_fields and self.config.crypto_fields.enabled:
140
+ apps.append("django_crypto_fields.apps.AppConfig")
141
+
139
142
  return apps
140
143
 
141
144
  def _get_optional_apps(self) -> List[str]:
@@ -69,6 +69,7 @@ class SettingsOrchestrator:
69
69
  settings.update(self._generate_database_settings())
70
70
  settings.update(self._generate_cache_settings())
71
71
  settings.update(self._generate_security_settings())
72
+ settings.update(self._generate_crypto_fields_settings())
72
73
  settings.update(self._generate_email_settings())
73
74
  settings.update(self._generate_logging_settings())
74
75
  settings.update(self._generate_i18n_settings())
@@ -141,6 +142,15 @@ class SettingsOrchestrator:
141
142
  except Exception as e:
142
143
  raise ConfigurationError(f"Failed to generate security settings: {e}") from e
143
144
 
145
+ def _generate_crypto_fields_settings(self) -> Dict[str, Any]:
146
+ """Generate django-crypto-fields encryption settings."""
147
+ try:
148
+ from .security_generators.crypto_fields import CryptoFieldsSettingsGenerator
149
+ generator = CryptoFieldsSettingsGenerator(self.config)
150
+ return generator.generate()
151
+ except Exception as e:
152
+ raise ConfigurationError(f"Failed to generate crypto-fields settings: {e}") from e
153
+
144
154
  def _generate_email_settings(self) -> Dict[str, Any]:
145
155
  """Generate email settings."""
146
156
  try:
@@ -0,0 +1,71 @@
1
+ """
2
+ Django Crypto Fields settings generator.
3
+
4
+ Generates encryption settings for django-crypto-fields with smart defaults.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any, Dict
8
+
9
+ if TYPE_CHECKING:
10
+ from ...base.config_model import DjangoConfig
11
+
12
+
13
+ class CryptoFieldsSettingsGenerator:
14
+ """
15
+ Generates django-crypto-fields encryption settings.
16
+
17
+ Responsibilities:
18
+ - DJANGO_CRYPTO_FIELDS_KEY_PATH
19
+ - KEY_PREFIX
20
+ - AUTO_CREATE_KEYS
21
+ - Environment-aware defaults
22
+
23
+ Example:
24
+ ```python
25
+ generator = CryptoFieldsSettingsGenerator(config)
26
+ settings = generator.generate()
27
+ ```
28
+ """
29
+
30
+ def __init__(self, config: "DjangoConfig"):
31
+ """
32
+ Initialize generator with configuration.
33
+
34
+ Args:
35
+ config: DjangoConfig instance
36
+ """
37
+ self.config = config
38
+
39
+ def generate(self) -> Dict[str, Any]:
40
+ """
41
+ Generate django-crypto-fields settings.
42
+
43
+ Returns:
44
+ Dictionary with encryption settings (empty if disabled)
45
+
46
+ Example:
47
+ >>> config = DjangoConfig(project_name="Test", secret_key="x"*50)
48
+ >>> generator = CryptoFieldsSettingsGenerator(config)
49
+ >>> settings = generator.generate()
50
+ >>> isinstance(settings, dict)
51
+ True
52
+ """
53
+ # Only generate settings if crypto_fields is configured
54
+ if not hasattr(self.config, 'crypto_fields') or not self.config.crypto_fields:
55
+ return {}
56
+
57
+ crypto_config = self.config.crypto_fields
58
+
59
+ # Skip if disabled
60
+ if not crypto_config.enabled:
61
+ return {}
62
+
63
+ # Generate settings using config's to_django_settings method
64
+ return crypto_config.to_django_settings(
65
+ base_dir=self.config.base_dir,
66
+ is_production=self.config.is_production,
67
+ debug=self.config.debug
68
+ )
69
+
70
+
71
+ __all__ = ["CryptoFieldsSettingsGenerator"]
@@ -34,6 +34,7 @@ from .base.module import BaseCfgAutoModule
34
34
  # Django-specific
35
35
  from .django.axes import AxesConfig
36
36
  from .django.constance import ConstanceConfig, ConstanceField
37
+ from .django.crypto_fields import CryptoFieldsConfig
37
38
  from .django.environment import EnvironmentConfig
38
39
  from .django.openapi import OpenAPIClientConfig
39
40
  from .infrastructure.cache import CacheConfig
@@ -81,6 +82,7 @@ __all__ = [
81
82
  "OpenAPIClientConfig",
82
83
  "UnfoldConfig",
83
84
  "AxesConfig",
85
+ "CryptoFieldsConfig",
84
86
  # Services
85
87
  "EmailConfig",
86
88
  "TelegramConfig",
@@ -0,0 +1,102 @@
1
+ """
2
+ Django Crypto Fields configuration model.
3
+
4
+ Field-level encryption settings for sensitive data with smart defaults.
5
+ """
6
+
7
+ from pathlib import Path
8
+ from typing import Optional
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+
13
+ class CryptoFieldsConfig(BaseModel):
14
+ """
15
+ Django Crypto Fields encryption configuration.
16
+
17
+ Provides type-safe configuration for django-crypto-fields with environment-aware defaults.
18
+
19
+ Features:
20
+ - Field-level encryption for sensitive data (API keys, tokens, passwords)
21
+ - Automatic key management
22
+ - Custom encryption key paths
23
+ - Auto-create keys in development mode
24
+
25
+ Example:
26
+ ```python
27
+ # Auto-configuration (recommended)
28
+ crypto = CryptoFieldsConfig(enabled=True)
29
+
30
+ # Custom configuration
31
+ crypto = CryptoFieldsConfig(
32
+ enabled=True,
33
+ key_path="/var/secrets/crypto_keys",
34
+ key_prefix="myproject",
35
+ auto_create=False
36
+ )
37
+ ```
38
+ """
39
+
40
+ # === Basic Settings ===
41
+ enabled: bool = Field(
42
+ default=True,
43
+ description="Enable/disable django-crypto-fields encryption"
44
+ )
45
+
46
+ key_path: Optional[str] = Field(
47
+ default=None,
48
+ description="Path to encryption keys directory (None = auto: BASE_DIR/crypto_keys)"
49
+ )
50
+
51
+ key_prefix: str = Field(
52
+ default="",
53
+ description="Prefix for encryption key files (e.g., 'myproject-')"
54
+ )
55
+
56
+ auto_create: Optional[bool] = Field(
57
+ default=None,
58
+ description="Auto-create encryption keys if missing (None = auto: True in DEBUG, False in production)"
59
+ )
60
+
61
+ def to_django_settings(self, base_dir: Path, is_production: bool, debug: bool) -> dict:
62
+ """
63
+ Convert to Django settings dictionary with environment-aware defaults.
64
+
65
+ Args:
66
+ base_dir: Django project BASE_DIR
67
+ is_production: Whether running in production mode
68
+ debug: Whether debug mode is enabled
69
+
70
+ Returns:
71
+ Dictionary of django-crypto-fields settings
72
+ """
73
+ is_dev = debug or not is_production
74
+
75
+ # Determine keys directory path
76
+ if self.key_path:
77
+ crypto_keys_dir = Path(self.key_path)
78
+ else:
79
+ # Default to BASE_DIR/crypto_keys
80
+ crypto_keys_dir = base_dir / "crypto_keys"
81
+
82
+ # Determine auto_create setting
83
+ auto_create_keys = self.auto_create
84
+ if auto_create_keys is None:
85
+ # Auto-detect: enable in DEBUG mode
86
+ auto_create_keys = is_dev
87
+
88
+ settings = {
89
+ "DJANGO_CRYPTO_FIELDS_KEY_PATH": str(crypto_keys_dir),
90
+ "KEY_PREFIX": self.key_prefix,
91
+ "AUTO_CREATE_KEYS": auto_create_keys,
92
+ }
93
+
94
+ return settings
95
+
96
+ @property
97
+ def is_configured(self) -> bool:
98
+ """Check if crypto fields is properly configured."""
99
+ return self.enabled
100
+
101
+
102
+ __all__ = ["CryptoFieldsConfig"]
@@ -20,7 +20,7 @@ import (
20
20
  {% endif %}
21
21
 
22
22
  // Import shared package for error types
23
- "{{module_name}}/shared"
23
+ "{{ module_name }}/shared"
24
24
  )
25
25
 
26
26
  // Client provides access to {{ package_name }} operations.
@@ -430,7 +430,8 @@ class Command(BaseCommand):
430
430
  tag_prefix=f"{group_name}_",
431
431
  generate_package_files=service.config.generate_package_files,
432
432
  package_config={
433
- "module_name": f"djangocfg__{group_name}",
433
+ "name": group_name,
434
+ "module_name": group_name,
434
435
  "version": "v1.0.0",
435
436
  },
436
437
  )
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.69"
7
+ version = "1.4.71"
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
- 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", "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", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)", "jinja2 (>=3.1.6,<4.0.0)", "django-axes[ipware] (>=8.0.0,<9.0.0)", "pydantic-settings (>=2.11.0,<3.0.0)",]
12
+ requires-python = ">=3.12,<3.14"
13
+ dependencies = [ "pydantic>=2.11.0,<3.0", "pydantic[email]>=2.11.0,<3.0", "PyYAML>=6.0,<7.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", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)", "jinja2 (>=3.1.6,<4.0.0)", "django-axes[ipware] (>=8.0.0,<9.0.0)", "pydantic-settings (>=2.11.0,<3.0.0)",]
14
14
  [[project.authors]]
15
15
  name = "Django-CFG Team"
16
16
  email = "info@djangocfg.com"
@@ -25,6 +25,7 @@ text = "MIT"
25
25
  [project.optional-dependencies]
26
26
  local = []
27
27
  django52 = [ "django>=5.2,<6.0",]
28
+ ai = [ "pydantic-ai>=1.0.10,<2.0",]
28
29
  dev = [ "django>=5.2,<6.0", "pytest>=8.4,<9.0", "pytest-django>=4.11,<5.0", "pytest-cov>=7.0,<8.0", "pytest-mock>=3.15,<4.0", "factory-boy>=3.3,<4.0", "fakeredis>=2.28,<3.0", "black>=25.9,<26.0", "isort>=6.0,<7.0", "flake8>=6.0.0,<8.0", "mypy>=1.18,<2.0", "pre-commit>=4.3,<5.0", "build>=1.3,<2.0", "twine>=6.2,<7.0", "tomlkit>=0.13.3,<1.0", "questionary>=2.1.0,<3.0", "rich>=13.0.0,<15.0", "mkdocs>=1.6,<2.0", "mkdocs-material>=9.6,<10.0", "mkdocstrings[python]>=0.30,<1.0", "redis>=6.4.0,<7.0",]
29
30
  test = [ "django>=5.2,<6.0", "pytest>=8.4,<9.0", "pytest-django>=4.11,<5.0", "pytest-cov>=7.0,<8.0", "pytest-mock>=3.15,<4.0", "pytest-xdist>=3.8,<4.0", "factory-boy>=3.3,<4.0", "fakeredis>=2.28,<3.0",]
30
31
  docs = [ "mkdocs>=1.6,<2.0", "mkdocs-material>=9.6,<10.0", "mkdocstrings[python]>=0.30,<1.0", "pymdown-extensions>=10.16,<11.0",]
@@ -35,6 +35,9 @@ CORE_REGISTRY = {
35
35
  # Security - Django-Axes
36
36
  "AxesConfig": ("django_cfg.models.django.axes", "AxesConfig"),
37
37
 
38
+ # Security - Django Crypto Fields
39
+ "CryptoFieldsConfig": ("django_cfg.models.django.crypto_fields", "CryptoFieldsConfig"),
40
+
38
41
  # Limits models
39
42
  "LimitsConfig": ("django_cfg.models.api.limits", "LimitsConfig"),
40
43
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.69
3
+ Version: 1.4.71
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
@@ -27,7 +27,7 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
27
27
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
28
  Classifier: Topic :: System :: Systems Administration
29
29
  Classifier: Typing :: Typed
30
- Requires-Python: <4.0,>=3.12
30
+ Requires-Python: <3.14,>=3.12
31
31
  Requires-Dist: beautifulsoup4<5.0,>=4.13.0
32
32
  Requires-Dist: cachetools<7.0,>=5.3.0
33
33
  Requires-Dist: click<9.0,>=8.2.0
@@ -64,7 +64,6 @@ Requires-Dist: ngrok>=1.5.1; python_version >= '3.12'
64
64
  Requires-Dist: openai<2.0,>=1.107.0
65
65
  Requires-Dist: pgvector<1.0,>=0.4.0
66
66
  Requires-Dist: psycopg[binary,pool]<4.0,>=3.2.0
67
- Requires-Dist: pydantic-ai<2.0,>=1.0.10
68
67
  Requires-Dist: pydantic-settings<3.0.0,>=2.11.0
69
68
  Requires-Dist: pydantic<3.0,>=2.11.0
70
69
  Requires-Dist: pydantic[email]<3.0,>=2.11.0
@@ -81,6 +80,8 @@ Requires-Dist: tiktoken<1.0,>=0.11.0
81
80
  Requires-Dist: toml<0.11.0,>=0.10.2
82
81
  Requires-Dist: twilio<10.0,>=9.8.0
83
82
  Requires-Dist: whitenoise<7.0,>=6.8.0
83
+ Provides-Extra: ai
84
+ Requires-Dist: pydantic-ai<2.0,>=1.0.10; extra == 'ai'
84
85
  Provides-Extra: dev
85
86
  Requires-Dist: black<26.0,>=25.9; extra == 'dev'
86
87
  Requires-Dist: build<2.0,>=1.3; extra == 'dev'
@@ -1,5 +1,5 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=87Afsd0OsMU0j9vvMvIdbybWTRkILN5zlaKGwBTsxe0,1620
2
+ django_cfg/__init__.py,sha256=h0rks-p2ViXuDArmQqKHGPFF-dTD2tbQRwVBQJDVCSM,1620
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
@@ -531,16 +531,16 @@ django_cfg/core/validation.py,sha256=QmwGlNDa0MFG2OUmgykIUAaEotT55YNh-wAWSVxOAos
531
531
  django_cfg/core/backends/__init__.py,sha256=5Qfza7oKQ8_UIHOs4ibhYvwtgAjngUqLrlwjKl_q124,38
532
532
  django_cfg/core/backends/smtp.py,sha256=kWkNMG7UwLsHcFYSKRgrk1HbP9mU1fxzWYnalHXqoL8,2308
533
533
  django_cfg/core/base/__init__.py,sha256=Z3bZvxejxk4vvWqmqTBLUi9XJpo6A_5Bq4R0J8q81Y4,116
534
- django_cfg/core/base/config_model.py,sha256=oqABATGBF71lulHkMf91NMVZddDEzWm8kxal16V5O4c,20412
534
+ django_cfg/core/base/config_model.py,sha256=9AmUqYza5OrTuYzRBedc-DnxmA2KLQOOjNRUakjCE4A,20642
535
535
  django_cfg/core/builders/__init__.py,sha256=jkInI7_jbxcjitapohw6QmbJPpacnnID6V1JovqtOFM,282
536
- django_cfg/core/builders/apps_builder.py,sha256=vtHl6iZ1K4x-ZIq6XpOLAKDV1SH-8cTk11C2-kBcdmM,8319
536
+ django_cfg/core/builders/apps_builder.py,sha256=7BnibohhN3yInk-pYIqGP8sh7tGPLi5_jKi4JA2Tv1w,8459
537
537
  django_cfg/core/builders/middleware_builder.py,sha256=OwqQRoJKYWlXsQNPFBfUvVMYdppUHCPw-UDczV_esYg,3101
538
538
  django_cfg/core/builders/security_builder.py,sha256=W8Lk9eTMi3PuNK5qH-BIHegeE0cbvmuHKTumLcwOAh8,23961
539
539
  django_cfg/core/environment/__init__.py,sha256=sMOIe9z1i51j8B1VGjpLHJMaeDsBfsgn1TmL03FIeNo,141
540
540
  django_cfg/core/environment/detector.py,sha256=bI9k4fdK8Nbfl61ZcQ3yNbm3WlmK-L0xB-g-aXKUdhA,8923
541
541
  django_cfg/core/generation/__init__.py,sha256=0cYgeQ5EDN6sscQuFnXsFCy6m1BKgv_izNz0a1TlYSc,1355
542
542
  django_cfg/core/generation/generation.py,sha256=uLLJnJ_9kq8zV_auySK05dXwZB-BJx920mID0Pm4RCo,2524
543
- django_cfg/core/generation/orchestrator.py,sha256=pOcelYVdX1aMEwtGUu5a0Z3ECWOkEhCwZicq-N0lP2s,10862
543
+ django_cfg/core/generation/orchestrator.py,sha256=50ZPI8xpAO7SnmRIHLOL8sWZsVA-u8YKfBQ2-XfLSEg,11398
544
544
  django_cfg/core/generation/protocols.py,sha256=9pqGsZD_Y5v3jdYp4YdkL-i--8feuvX_iKXxV-Cc4Bg,676
545
545
  django_cfg/core/generation/core_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
546
546
  django_cfg/core/generation/core_generators/settings.py,sha256=Rto9qjqQC-MeQJMNyoflS91RrNDS_lBNH4d4ZtgER-8,2632
@@ -556,6 +556,7 @@ django_cfg/core/generation/integration_generators/tailwind.py,sha256=YgiV5c-l0DD
556
556
  django_cfg/core/generation/integration_generators/tasks.py,sha256=B-oeneUUdvjiE6N5MVC98imptlj4dkAxeoxfv50sbkM,2514
557
557
  django_cfg/core/generation/integration_generators/third_party.py,sha256=ef3sdpfDIf6B_dRuRjoIYc9rlqMYoKgTH4luFvjy9UM,3971
558
558
  django_cfg/core/generation/security_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
559
+ django_cfg/core/generation/security_generators/crypto_fields.py,sha256=5HcvXM2NKW7t-yPGCaXGsKOlAv5SLbwu_agPrlYU7d8,1923
559
560
  django_cfg/core/generation/utility_generators/__init__.py,sha256=6zbvaE2g8p42w0jHFeFHyIyPsDuoCuyeKm-Z74msmpo,593
560
561
  django_cfg/core/generation/utility_generators/email.py,sha256=444q8uMmvLdubjwqmTWGTBQcyHwMMhIZ4XNCsto3-Ak,1236
561
562
  django_cfg/core/generation/utility_generators/i18n.py,sha256=RhAD1Yw_gOHc2CHWWCR3-F-Xf4BUbxWyCEyC80ekW_Y,1533
@@ -613,7 +614,7 @@ django_cfg/middleware/authentication.py,sha256=Gi9oEdu2XKbYUSDtCo3Uw5Os8sBBzbyuS
613
614
  django_cfg/middleware/pagination.py,sha256=xnaFH1olDH_m4ecwpTTUyFWV6jKoF6IxJvagSZSJR0E,8603
614
615
  django_cfg/middleware/public_endpoints.py,sha256=p-VCjeu0k7B4OuQIe2OVUx7Onh9gsM2HweWcYNxEaRA,6775
615
616
  django_cfg/middleware/user_activity.py,sha256=bgftHXXeGBS-jCa8mLzTx4Gcz2fHTaQz_nbRCR5Yqio,5980
616
- django_cfg/models/__init__.py,sha256=nyFBy1H2hEkryjTgjlgjQ9LVMKuGe212qHKYx5XSY6k,2683
617
+ django_cfg/models/__init__.py,sha256=HNWzUAj19jtNtPMfgnJgcZCrvVWAIIlTMizkm5q8XiA,2762
617
618
  django_cfg/models/api/__init__.py,sha256=VWkiYs38A7Tx5ZWePeBxL1lMiXKsonb5TQfoVRRCBac,605
618
619
  django_cfg/models/api/config.py,sha256=KzaDn2Ubc7SpZ_8xt6-Q-XxnZbf9Glu1xJhJWbAI--o,4455
619
620
  django_cfg/models/api/cors.py,sha256=kRDGD-HcCK39QhoyvKnn2yGcwzGFp2QIw50G7TNx78I,3467
@@ -631,6 +632,7 @@ django_cfg/models/base/module.py,sha256=nxN1Y9J4l94kOfSXLQJ2eGgIGWTq8kyh7hUGvCQN
631
632
  django_cfg/models/django/__init__.py,sha256=xY_ts1oGmMROXfKHLuERqwG35dQf3EpsZxqj9DcRYwI,397
632
633
  django_cfg/models/django/axes.py,sha256=-4nk2gSfpj7lNY5vnm_2jHVLz8VAKoEd9yF2TuCR8O8,5624
633
634
  django_cfg/models/django/constance.py,sha256=E4U3HS_gFq5_q2nhI1R8inONGtD7IgvSwxOEGNGGrEI,9127
635
+ django_cfg/models/django/crypto_fields.py,sha256=u8OY5BmdwB7F2fLR2fcSwOk2XSGtqGdLMFhpodr9YMY,2919
634
636
  django_cfg/models/django/environment.py,sha256=lBCHBs1lphv9tlu1BCTfLZeH_kUame0p66A_BIjBY7M,9440
635
637
  django_cfg/models/django/openapi.py,sha256=avE3iapaCj8eyOqVUum_v2EExR3V-hwHrexqtXMHtTQ,3739
636
638
  django_cfg/models/django/revolution_legacy.py,sha256=Z4SPUS7QSv62EuPAeFFoXGEgqLmdXnVEr7Ofk1IDtVc,8918
@@ -717,7 +719,7 @@ django_cfg/modules/django_client/core/generator/go/templates/go.mod.j2,sha256=nh
717
719
  django_cfg/modules/django_client/core/generator/go/templates/main_client.go.j2,sha256=8inEuBYVZNE06uVbOG2THzclUJpGV2D7dUAe_qk8vxk,1395
718
720
  django_cfg/modules/django_client/core/generator/go/templates/middleware.go.j2,sha256=AQH2IbQZbhf58V7VHXwvrymORLcEUUaZQ6PMfvWbGBw,10022
719
721
  django_cfg/modules/django_client/core/generator/go/templates/models.go.j2,sha256=9UThdTAGbILmzxIvu_Mn5cQsxs6dGPLtEdCK-DDrvUU,631
720
- django_cfg/modules/django_client/core/generator/go/templates/operations_client.go.j2,sha256=u0cud1-BgetiDn1rlrb6p_y3fbISzTCDjY9dc3fwHSc,3714
722
+ django_cfg/modules/django_client/core/generator/go/templates/operations_client.go.j2,sha256=Qxjr8kO1n-3FSlWfNWyBlt8ldrdh4Ym-FusC4cMQ9X0,3716
721
723
  django_cfg/modules/django_client/core/generator/go/templates/validation.go.j2,sha256=3BzI7pOuuh-19wNwuRq7GtRda-Pmaw57Jug35bdtamA,5154
722
724
  django_cfg/modules/django_client/core/generator/python/__init__.py,sha256=DOPkZBmNVX8qKZBulnE-49iMlBsMHszidzBhWG17c2E,448
723
725
  django_cfg/modules/django_client/core/generator/python/async_client_gen.py,sha256=zFviFo0PLg3Zb-0TL5AS_Ghhvl-jS180Cl-AWIAWIa0,6030
@@ -819,7 +821,7 @@ django_cfg/modules/django_client/core/validation/rules/base.py,sha256=xVJli0eSEz
819
821
  django_cfg/modules/django_client/core/validation/rules/type_hints.py,sha256=hwjTMADillsTPruDvXZQeZMj4LVV443zxY9o0Gqgg6k,10200
820
822
  django_cfg/modules/django_client/management/__init__.py,sha256=mCTPP_bIOmqNnn0WAG2n4BuF6zwc9PTgdZr_dORfNDk,54
821
823
  django_cfg/modules/django_client/management/commands/__init__.py,sha256=CJ55pHUNYQ5h-QHUe3axeTtxzlUJv7wbEuZmGN21iCM,36
822
- django_cfg/modules/django_client/management/commands/generate_client.py,sha256=QVpq2pg6Pl7wdVWFWbEZ1oUvyLU4R3scNV8dR6Ds9No,18669
824
+ django_cfg/modules/django_client/management/commands/generate_client.py,sha256=OaNiuiwA8BTDTaCTdGVsldwxithSvl-9WuLVRlGhAk8,18701
823
825
  django_cfg/modules/django_client/management/commands/validate_openapi.py,sha256=IBKk7oRP3tMQzXjvZNIgQtMPk3k_mB2diNS7bkaSLz4,11011
824
826
  django_cfg/modules/django_client/spectacular/__init__.py,sha256=M8fG-odu2ltkG36aMMr0KDkCKGX676TwdrJO8vky2cI,345
825
827
  django_cfg/modules/django_client/spectacular/async_detection.py,sha256=S_pwGR7_2SIWHjZJyiu7SCfySF3Nr3P8eqjDyBSkkLs,5731
@@ -1007,7 +1009,7 @@ django_cfg/modules/django_unfold/models/navigation.py,sha256=PPEeqA2HBaA1-VjADiX
1007
1009
  django_cfg/modules/django_unfold/models/tabs.py,sha256=rvU3jAyddXCNNc0IgKfYmRG9fIhV5B_W1YQlqmvN310,843
1008
1010
  django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html,sha256=ZjhHa2C8ilpAD1eZ0a7aP24aVlkkZn_jSXDGypccoc4,5919
1009
1011
  django_cfg/registry/__init__.py,sha256=CaiL9KwqPzXlIe5-4Qr7PQu5ZxAW1HtuDIXZ7-ktRQg,538
1010
- django_cfg/registry/core.py,sha256=t6LLYXqhKvLndRyCUfcuO-sQv147HZEvG3iEQTTLiSU,3215
1012
+ django_cfg/registry/core.py,sha256=Vn7Q1-1MzkKAWsWzkALr8jO7gQSFfAzz17h9ZR5OtSU,3346
1011
1013
  django_cfg/registry/exceptions.py,sha256=b4pIakeRxhT1-ST3lbAnmAQaASRBARCoah_w6vb3VF0,399
1012
1014
  django_cfg/registry/modules.py,sha256=nA7u65pZDfsYLG5R9cE64bPIulCnrl-3CK3kpgkkXrs,1799
1013
1015
  django_cfg/registry/services.py,sha256=l0V2twGpF9BwVlo-TTfFu8dV7GVBS7XKCsScIZXWWbc,2457
@@ -1103,9 +1105,9 @@ django_cfg/utils/version_check.py,sha256=WO51J2m2e-wVqWCRwbultEwu3q1lQasV67Mw2aa
1103
1105
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
1104
1106
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
1105
1107
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1106
- django_cfg/pyproject.toml,sha256=1-Wg8Zd5b1rjUXJEhM7lzHjw-FGm-Nvgs220cfZIBOs,8155
1107
- django_cfg-1.4.69.dist-info/METADATA,sha256=QjQ5P7rM1QqosLgSJTnyvRAfgDsk9ABZeK__0VEiTTw,22589
1108
- django_cfg-1.4.69.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1109
- django_cfg-1.4.69.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1110
- django_cfg-1.4.69.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1111
- django_cfg-1.4.69.dist-info/RECORD,,
1108
+ django_cfg/pyproject.toml,sha256=7Zn6UAvEXMXiiiHcKVr09VYY_X6b4RJ2Xiq5-oDfkzg,8164
1109
+ django_cfg-1.4.71.dist-info/METADATA,sha256=ZmMQg9GKyytymev_KUJB76A_cWtR5KQu15cVaoURgz0,22624
1110
+ django_cfg-1.4.71.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1111
+ django_cfg-1.4.71.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
1112
+ django_cfg-1.4.71.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
1113
+ django_cfg-1.4.71.dist-info/RECORD,,