django-cfg 1.4.68__py3-none-any.whl → 1.4.70__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 +1 -1
- django_cfg/core/base/config_model.py +6 -0
- django_cfg/core/builders/apps_builder.py +3 -0
- django_cfg/core/generation/orchestrator.py +10 -0
- django_cfg/core/generation/security_generators/crypto_fields.py +71 -0
- django_cfg/models/__init__.py +2 -0
- django_cfg/models/django/crypto_fields.py +102 -0
- django_cfg/modules/django_admin/config/admin_config.py +8 -0
- django_cfg/pyproject.toml +4 -3
- django_cfg/registry/core.py +3 -0
- {django_cfg-1.4.68.dist-info → django_cfg-1.4.70.dist-info}/METADATA +4 -3
- {django_cfg-1.4.68.dist-info → django_cfg-1.4.70.dist-info}/RECORD +15 -13
- {django_cfg-1.4.68.dist-info → django_cfg-1.4.70.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.68.dist-info → django_cfg-1.4.70.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.68.dist-info → django_cfg-1.4.70.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py
CHANGED
|
@@ -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"]
|
django_cfg/models/__init__.py
CHANGED
|
@@ -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"]
|
|
@@ -96,6 +96,14 @@ class AdminConfig(BaseModel):
|
|
|
96
96
|
default_factory=list,
|
|
97
97
|
description="Fields with raw ID widget"
|
|
98
98
|
)
|
|
99
|
+
filter_horizontal: List[str] = Field(
|
|
100
|
+
default_factory=list,
|
|
101
|
+
description="M2M fields with horizontal filter widget"
|
|
102
|
+
)
|
|
103
|
+
filter_vertical: List[str] = Field(
|
|
104
|
+
default_factory=list,
|
|
105
|
+
description="M2M fields with vertical filter widget"
|
|
106
|
+
)
|
|
99
107
|
prepopulated_fields: Dict[str, tuple] = Field(
|
|
100
108
|
default_factory=dict,
|
|
101
109
|
description="Auto-populate fields (e.g., {'slug': ('name',)})"
|
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.
|
|
7
|
+
version = "1.4.70"
|
|
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,<
|
|
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", "
|
|
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",]
|
django_cfg/registry/core.py
CHANGED
|
@@ -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.
|
|
3
|
+
Version: 1.4.70
|
|
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: <
|
|
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=
|
|
2
|
+
django_cfg/__init__.py,sha256=tNsfpDzCejBNXsoWZc54cDzc_KdFePOw7Q7QsF18Ubs,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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
@@ -666,7 +668,7 @@ django_cfg/modules/django_admin/base/pydantic_admin.py,sha256=0xKaELl6rCdSkw_U2n
|
|
|
666
668
|
django_cfg/modules/django_admin/base/unfold_admin.py,sha256=iqpRWSkzW5HktXDuuG7G3J6RoIfW48dWPMJTa7Yk08g,729
|
|
667
669
|
django_cfg/modules/django_admin/config/__init__.py,sha256=UJGJMP1iAguzd33E1BgeIjWaooFYylku3aR_Arib-cg,604
|
|
668
670
|
django_cfg/modules/django_admin/config/action_config.py,sha256=JjS01JxLT-FzUVq7RlKaB7L38wmVL8uibXO_iXZcljo,1668
|
|
669
|
-
django_cfg/modules/django_admin/config/admin_config.py,sha256=
|
|
671
|
+
django_cfg/modules/django_admin/config/admin_config.py,sha256=vX9CVjC8FgDLdkhUMHNqkpaoO9c1dhzR4mNltET12kM,4569
|
|
670
672
|
django_cfg/modules/django_admin/config/field_config.py,sha256=TXdmz1GHC0N7euzqgB9p5EhFCYzsEobb8VSgS4kG4ho,8928
|
|
671
673
|
django_cfg/modules/django_admin/config/fieldset_config.py,sha256=5BPUWO_HvS6YhPU_vqQPzRT2y3OIPrBCioFuer5-mrA,1249
|
|
672
674
|
django_cfg/modules/django_admin/icons/README.md,sha256=j-NUixSC1QJh7PqYKxLZpPrTxKrAnx0urQraXgv4JHI,5612
|
|
@@ -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=
|
|
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
|
|
1107
|
-
django_cfg-1.4.
|
|
1108
|
-
django_cfg-1.4.
|
|
1109
|
-
django_cfg-1.4.
|
|
1110
|
-
django_cfg-1.4.
|
|
1111
|
-
django_cfg-1.4.
|
|
1108
|
+
django_cfg/pyproject.toml,sha256=xeHf5Eto8IGui8IkXPwacHu5VZoxAForPomVQNX_BG4,8164
|
|
1109
|
+
django_cfg-1.4.70.dist-info/METADATA,sha256=q8gvHrla6XtCvM1ViCAyIsjTz_Unp_l3XmYMv3SIVYI,22624
|
|
1110
|
+
django_cfg-1.4.70.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
1111
|
+
django_cfg-1.4.70.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
|
|
1112
|
+
django_cfg-1.4.70.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
|
|
1113
|
+
django_cfg-1.4.70.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|