django-cfg 1.1.82__py3-none-any.whl → 1.2.1__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 +20 -448
- django_cfg/apps/accounts/README.md +3 -3
- django_cfg/apps/accounts/admin/__init__.py +0 -2
- django_cfg/apps/accounts/admin/activity.py +2 -9
- django_cfg/apps/accounts/admin/filters.py +0 -42
- django_cfg/apps/accounts/admin/inlines.py +8 -8
- django_cfg/apps/accounts/admin/otp.py +5 -5
- django_cfg/apps/accounts/admin/registration_source.py +1 -8
- django_cfg/apps/accounts/admin/user.py +12 -20
- django_cfg/apps/accounts/managers/user_manager.py +2 -129
- django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +46 -0
- django_cfg/apps/accounts/models.py +3 -123
- django_cfg/apps/accounts/serializers/otp.py +40 -44
- django_cfg/apps/accounts/serializers/profile.py +0 -2
- django_cfg/apps/accounts/services/otp_service.py +98 -186
- django_cfg/apps/accounts/signals.py +25 -15
- django_cfg/apps/accounts/utils/auth_email_service.py +84 -0
- django_cfg/apps/accounts/views/otp.py +35 -36
- django_cfg/apps/agents/README.md +129 -0
- django_cfg/apps/agents/__init__.py +68 -0
- django_cfg/apps/agents/admin/__init__.py +17 -0
- django_cfg/apps/agents/admin/execution_admin.py +460 -0
- django_cfg/apps/agents/admin/registry_admin.py +360 -0
- django_cfg/apps/agents/admin/toolsets_admin.py +482 -0
- django_cfg/apps/agents/apps.py +29 -0
- django_cfg/apps/agents/core/__init__.py +20 -0
- django_cfg/apps/agents/core/agent.py +281 -0
- django_cfg/apps/agents/core/dependencies.py +154 -0
- django_cfg/apps/agents/core/exceptions.py +66 -0
- django_cfg/apps/agents/core/models.py +106 -0
- django_cfg/apps/agents/core/orchestrator.py +391 -0
- django_cfg/apps/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- django_cfg/apps/agents/integration/__init__.py +14 -0
- django_cfg/apps/agents/integration/middleware.py +80 -0
- django_cfg/apps/agents/integration/registry.py +345 -0
- django_cfg/apps/agents/integration/signals.py +50 -0
- django_cfg/apps/agents/management/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/create_agent.py +365 -0
- django_cfg/apps/agents/management/commands/orchestrator_status.py +191 -0
- django_cfg/apps/agents/managers/__init__.py +23 -0
- django_cfg/apps/agents/managers/execution.py +236 -0
- django_cfg/apps/agents/managers/registry.py +254 -0
- django_cfg/apps/agents/managers/toolsets.py +496 -0
- django_cfg/apps/agents/migrations/0001_initial.py +286 -0
- django_cfg/apps/agents/migrations/__init__.py +5 -0
- django_cfg/apps/agents/models/__init__.py +15 -0
- django_cfg/apps/agents/models/execution.py +215 -0
- django_cfg/apps/agents/models/registry.py +220 -0
- django_cfg/apps/agents/models/toolsets.py +305 -0
- django_cfg/apps/agents/patterns/__init__.py +24 -0
- django_cfg/apps/agents/patterns/content_agents.py +234 -0
- django_cfg/apps/agents/toolsets/__init__.py +15 -0
- django_cfg/apps/agents/toolsets/cache_toolset.py +285 -0
- django_cfg/apps/agents/toolsets/django_toolset.py +220 -0
- django_cfg/apps/agents/toolsets/file_toolset.py +324 -0
- django_cfg/apps/agents/toolsets/orm_toolset.py +319 -0
- django_cfg/apps/agents/urls.py +46 -0
- django_cfg/apps/knowbase/README.md +150 -0
- django_cfg/apps/knowbase/__init__.py +27 -0
- django_cfg/apps/knowbase/admin/__init__.py +23 -0
- django_cfg/apps/knowbase/admin/archive_admin.py +857 -0
- django_cfg/apps/knowbase/admin/chat_admin.py +386 -0
- django_cfg/apps/knowbase/admin/document_admin.py +650 -0
- django_cfg/apps/knowbase/admin/external_data_admin.py +685 -0
- django_cfg/apps/knowbase/apps.py +81 -0
- django_cfg/apps/knowbase/config/README.md +176 -0
- django_cfg/apps/knowbase/config/__init__.py +51 -0
- django_cfg/apps/knowbase/config/constance_fields.py +186 -0
- django_cfg/apps/knowbase/config/constance_settings.py +200 -0
- django_cfg/apps/knowbase/config/settings.py +450 -0
- django_cfg/apps/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- django_cfg/apps/knowbase/management/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +158 -0
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +59 -0
- django_cfg/apps/knowbase/managers/__init__.py +22 -0
- django_cfg/apps/knowbase/managers/archive.py +426 -0
- django_cfg/apps/knowbase/managers/base.py +32 -0
- django_cfg/apps/knowbase/managers/chat.py +141 -0
- django_cfg/apps/knowbase/managers/document.py +203 -0
- django_cfg/apps/knowbase/managers/external_data.py +471 -0
- django_cfg/apps/knowbase/migrations/0001_initial.py +427 -0
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +434 -0
- django_cfg/apps/knowbase/migrations/__init__.py +5 -0
- django_cfg/apps/knowbase/mixins/__init__.py +15 -0
- django_cfg/apps/knowbase/mixins/config.py +108 -0
- django_cfg/apps/knowbase/mixins/creator.py +81 -0
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +813 -0
- django_cfg/apps/knowbase/mixins/service.py +362 -0
- django_cfg/apps/knowbase/models/__init__.py +41 -0
- django_cfg/apps/knowbase/models/archive.py +599 -0
- django_cfg/apps/knowbase/models/base.py +58 -0
- django_cfg/apps/knowbase/models/chat.py +157 -0
- django_cfg/apps/knowbase/models/document.py +267 -0
- django_cfg/apps/knowbase/models/external_data.py +376 -0
- django_cfg/apps/knowbase/serializers/__init__.py +68 -0
- django_cfg/apps/knowbase/serializers/archive_serializers.py +386 -0
- django_cfg/apps/knowbase/serializers/chat_serializers.py +137 -0
- django_cfg/apps/knowbase/serializers/document_serializers.py +94 -0
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +256 -0
- django_cfg/apps/knowbase/serializers/public_serializers.py +74 -0
- django_cfg/apps/knowbase/services/__init__.py +40 -0
- django_cfg/apps/knowbase/services/archive/__init__.py +42 -0
- django_cfg/apps/knowbase/services/archive/archive_service.py +541 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +791 -0
- django_cfg/apps/knowbase/services/archive/exceptions.py +52 -0
- django_cfg/apps/knowbase/services/archive/extraction_service.py +508 -0
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +362 -0
- django_cfg/apps/knowbase/services/base.py +53 -0
- django_cfg/apps/knowbase/services/chat_service.py +239 -0
- django_cfg/apps/knowbase/services/document_service.py +144 -0
- django_cfg/apps/knowbase/services/embedding/__init__.py +43 -0
- django_cfg/apps/knowbase/services/embedding/async_processor.py +244 -0
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +250 -0
- django_cfg/apps/knowbase/services/embedding/batch_result.py +61 -0
- django_cfg/apps/knowbase/services/embedding/models.py +229 -0
- django_cfg/apps/knowbase/services/embedding/processors.py +148 -0
- django_cfg/apps/knowbase/services/embedding/utils.py +176 -0
- django_cfg/apps/knowbase/services/prompt_builder.py +191 -0
- django_cfg/apps/knowbase/services/search_service.py +293 -0
- django_cfg/apps/knowbase/signals/__init__.py +21 -0
- django_cfg/apps/knowbase/signals/archive_signals.py +211 -0
- django_cfg/apps/knowbase/signals/chat_signals.py +37 -0
- django_cfg/apps/knowbase/signals/document_signals.py +143 -0
- django_cfg/apps/knowbase/signals/external_data_signals.py +157 -0
- django_cfg/apps/knowbase/tasks/__init__.py +39 -0
- django_cfg/apps/knowbase/tasks/archive_tasks.py +316 -0
- django_cfg/apps/knowbase/tasks/document_processing.py +341 -0
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +341 -0
- django_cfg/apps/knowbase/tasks/maintenance.py +195 -0
- django_cfg/apps/knowbase/urls.py +43 -0
- django_cfg/apps/knowbase/utils/__init__.py +12 -0
- django_cfg/apps/knowbase/utils/chunk_settings.py +261 -0
- django_cfg/apps/knowbase/utils/text_processing.py +375 -0
- django_cfg/apps/knowbase/utils/validation.py +99 -0
- django_cfg/apps/knowbase/views/__init__.py +28 -0
- django_cfg/apps/knowbase/views/archive_views.py +469 -0
- django_cfg/apps/knowbase/views/base.py +49 -0
- django_cfg/apps/knowbase/views/chat_views.py +181 -0
- django_cfg/apps/knowbase/views/document_views.py +183 -0
- django_cfg/apps/knowbase/views/public_views.py +129 -0
- django_cfg/apps/leads/admin.py +70 -0
- django_cfg/apps/newsletter/admin.py +234 -0
- django_cfg/apps/newsletter/admin_filters.py +124 -0
- django_cfg/apps/support/admin.py +196 -0
- django_cfg/apps/support/admin_filters.py +71 -0
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
- django_cfg/apps/urls.py +5 -4
- django_cfg/cli/README.md +1 -1
- django_cfg/cli/commands/create_project.py +2 -2
- django_cfg/cli/commands/info.py +1 -1
- django_cfg/config.py +44 -0
- django_cfg/core/config.py +29 -82
- django_cfg/core/environment.py +1 -1
- django_cfg/core/generation.py +19 -107
- django_cfg/{integration.py → core/integration.py} +18 -16
- django_cfg/core/validation.py +1 -1
- django_cfg/management/__init__.py +1 -1
- django_cfg/management/commands/__init__.py +1 -1
- django_cfg/management/commands/auto_generate.py +482 -0
- django_cfg/management/commands/migrator.py +19 -101
- django_cfg/management/commands/test_email.py +1 -1
- django_cfg/middleware/README.md +0 -158
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/middleware/user_activity.py +3 -3
- django_cfg/models/api.py +145 -0
- django_cfg/models/base.py +287 -0
- django_cfg/models/cache.py +4 -4
- django_cfg/models/constance.py +25 -88
- django_cfg/models/database.py +9 -9
- django_cfg/models/drf.py +3 -36
- django_cfg/models/email.py +163 -0
- django_cfg/models/environment.py +276 -0
- django_cfg/models/limits.py +1 -1
- django_cfg/models/logging.py +366 -0
- django_cfg/models/revolution.py +41 -2
- django_cfg/models/security.py +125 -0
- django_cfg/models/services.py +1 -1
- django_cfg/modules/__init__.py +2 -56
- django_cfg/modules/base.py +78 -52
- django_cfg/modules/django_currency/service.py +2 -2
- django_cfg/modules/django_email.py +2 -2
- django_cfg/modules/django_health.py +267 -0
- django_cfg/modules/django_llm/llm/client.py +91 -19
- django_cfg/modules/django_llm/translator/translator.py +2 -2
- django_cfg/modules/django_logger.py +2 -2
- django_cfg/modules/django_ngrok.py +2 -2
- django_cfg/modules/django_tasks.py +68 -3
- django_cfg/modules/django_telegram.py +3 -3
- django_cfg/modules/django_twilio/sendgrid_service.py +2 -2
- django_cfg/modules/django_twilio/service.py +2 -2
- django_cfg/modules/django_twilio/simple_service.py +2 -2
- django_cfg/modules/django_twilio/twilio_service.py +2 -2
- django_cfg/modules/django_unfold/__init__.py +69 -0
- django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
- django_cfg/modules/django_unfold/dashboard.py +278 -0
- django_cfg/modules/django_unfold/icons/README.md +145 -0
- django_cfg/modules/django_unfold/icons/__init__.py +12 -0
- django_cfg/modules/django_unfold/icons/constants.py +2851 -0
- django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
- django_cfg/modules/django_unfold/models/__init__.py +42 -0
- django_cfg/modules/django_unfold/models/config.py +601 -0
- django_cfg/modules/django_unfold/models/dashboard.py +206 -0
- django_cfg/modules/django_unfold/models/dropdown.py +40 -0
- django_cfg/modules/django_unfold/models/navigation.py +73 -0
- django_cfg/modules/django_unfold/models/tabs.py +25 -0
- django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
- django_cfg/modules/django_unfold/utils.py +140 -0
- django_cfg/registry/__init__.py +23 -0
- django_cfg/registry/core.py +61 -0
- django_cfg/registry/exceptions.py +11 -0
- django_cfg/registry/modules.py +12 -0
- django_cfg/registry/services.py +26 -0
- django_cfg/registry/third_party.py +52 -0
- django_cfg/routing/__init__.py +19 -0
- django_cfg/routing/callbacks.py +198 -0
- django_cfg/routing/routers.py +48 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
- django_cfg/templatetags/__init__.py +0 -0
- django_cfg/templatetags/django_cfg.py +33 -0
- django_cfg/urls.py +33 -0
- django_cfg/utils/path_resolution.py +1 -1
- django_cfg/utils/smart_defaults.py +7 -61
- django_cfg/utils/toolkit.py +663 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/METADATA +83 -86
- django_cfg-1.2.1.dist-info/RECORD +441 -0
- django_cfg/archive/django_sample.zip +0 -0
- django_cfg/models/unfold.py +0 -271
- django_cfg/modules/unfold/__init__.py +0 -29
- django_cfg/modules/unfold/dashboard.py +0 -318
- django_cfg/pyproject.toml +0 -370
- django_cfg/routers.py +0 -83
- django_cfg-1.1.82.dist-info/RECORD +0 -278
- /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
- /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
- /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
- /django_cfg/{version_check.py → utils/version_check.py} +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/licenses/LICENSE +0 -0
django_cfg/pyproject.toml
DELETED
@@ -1,370 +0,0 @@
|
|
1
|
-
[build-system]
|
2
|
-
requires = ["hatchling"]
|
3
|
-
build-backend = "hatchling.build"
|
4
|
-
|
5
|
-
[project]
|
6
|
-
name = "django-cfg"
|
7
|
-
version = "1.1.64"
|
8
|
-
description = "🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience"
|
9
|
-
readme = "README.md"
|
10
|
-
license = {text = "MIT"}
|
11
|
-
authors = [
|
12
|
-
{name = "ReformsAI Team", email = "dev@reforms.ai"},
|
13
|
-
]
|
14
|
-
maintainers = [
|
15
|
-
{name = "ReformsAI Team", email = "dev@reforms.ai"},
|
16
|
-
]
|
17
|
-
keywords = [
|
18
|
-
"django",
|
19
|
-
"configuration",
|
20
|
-
"pydantic",
|
21
|
-
"settings",
|
22
|
-
"developer-experience",
|
23
|
-
"type-safety",
|
24
|
-
]
|
25
|
-
classifiers = [
|
26
|
-
"Development Status :: 4 - Beta",
|
27
|
-
"Framework :: Django",
|
28
|
-
"Framework :: Django :: 5.2",
|
29
|
-
"Intended Audience :: Developers",
|
30
|
-
"License :: OSI Approved :: MIT License",
|
31
|
-
"Operating System :: OS Independent",
|
32
|
-
"Programming Language :: Python",
|
33
|
-
"Programming Language :: Python :: 3",
|
34
|
-
"Programming Language :: Python :: 3.10",
|
35
|
-
"Programming Language :: Python :: 3.11",
|
36
|
-
"Programming Language :: Python :: 3.12",
|
37
|
-
"Programming Language :: Python :: 3.13",
|
38
|
-
"Topic :: Internet :: WWW/HTTP",
|
39
|
-
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
|
40
|
-
"Topic :: Software Development :: Libraries :: Python Modules",
|
41
|
-
"Topic :: System :: Systems Administration",
|
42
|
-
"Typing :: Typed",
|
43
|
-
]
|
44
|
-
requires-python = ">=3.12,<4.0"
|
45
|
-
|
46
|
-
# Core dependencies - minimal and essential only
|
47
|
-
# Note: Django is a peer dependency - users should install it themselves
|
48
|
-
dependencies = [
|
49
|
-
# Core configuration
|
50
|
-
"pydantic>=2.11,<3.0",
|
51
|
-
"pydantic[email]>=2.11,<3.0",
|
52
|
-
"PyYAML>=6.0",
|
53
|
-
"pydantic-yaml>=1.6.0",
|
54
|
-
|
55
|
-
# CLI and utilities
|
56
|
-
"click>=8.2.0",
|
57
|
-
"questionary>=2.1.0",
|
58
|
-
"rich>=14.1.0",
|
59
|
-
"loguru>=0.7.0",
|
60
|
-
"colorlog>=6.9.0",
|
61
|
-
"cachetools>=6.1.0",
|
62
|
-
|
63
|
-
# Development tools (Python 3.12+ only)
|
64
|
-
"ngrok>=1.5.1; python_version>='3.12'",
|
65
|
-
|
66
|
-
# Database utilities - using psycopg3 with connection pooling support
|
67
|
-
"psycopg[binary,pool]>=3.2.0",
|
68
|
-
"dj-database-url>=3.0.0",
|
69
|
-
|
70
|
-
# Django packages (require Django as peer dependency)
|
71
|
-
"whitenoise>=6.8.0",
|
72
|
-
"django-cors-headers>=4.7.0",
|
73
|
-
"djangorestframework>=3.16.0",
|
74
|
-
"djangorestframework-simplejwt>=5.5.0",
|
75
|
-
"djangorestframework-simplejwt[token-blacklist]>=5.5.0",
|
76
|
-
"drf-nested-routers>=0.94.2",
|
77
|
-
"django-filter>=25.0",
|
78
|
-
"django-ratelimit (>=4.1.0,<5.0.0)",
|
79
|
-
"drf-spectacular>=0.28.0",
|
80
|
-
"drf-spectacular-sidecar>=2025.8.1",
|
81
|
-
"django-json-widget>=2.0.3",
|
82
|
-
"django-extensions>=4.1",
|
83
|
-
"django-constance>=4.3.2",
|
84
|
-
"django-revolution>=1.0.34",
|
85
|
-
"django-unfold>=0.64.0",
|
86
|
-
"django-redis>=6.0.0",
|
87
|
-
"redis>=6.4.0",
|
88
|
-
"hiredis>=2.0.0",
|
89
|
-
|
90
|
-
# Optional services
|
91
|
-
"pyTelegramBotAPI>=4.28.0",
|
92
|
-
"coolname>=2.2.0,<3.0.0",
|
93
|
-
"django-admin-rangefilter>=0.13.3,<0.14.0",
|
94
|
-
"python-json-logger>=3.3.0,<4.0.0",
|
95
|
-
"requests (>=2.32.5,<3.0.0)",
|
96
|
-
"currencyconverter (>=0.18.9,<0.19.0)",
|
97
|
-
"tiktoken (>=0.11.0,<0.12.0)",
|
98
|
-
"openai (>=1.107.1,<2.0.0)",
|
99
|
-
"twilio (>=9.8.0,<10.0.0)",
|
100
|
-
"sendgrid (>=6.12.4,<7.0.0)",
|
101
|
-
|
102
|
-
# Knowbase
|
103
|
-
"beautifulsoup4 (>=4.13.5,<5.0.0)",
|
104
|
-
"lxml (>=6.0.1,<7.0.0)",
|
105
|
-
"pgvector (>=0.4.1,<0.5.0)",
|
106
|
-
"toml (>=0.10.2,<0.11.0)",
|
107
|
-
]
|
108
|
-
|
109
|
-
[project.optional-dependencies]
|
110
|
-
|
111
|
-
# Django compatibility - users should install one of these (minimum 5.2)
|
112
|
-
django52 = ["django>=5.2,<6.0"]
|
113
|
-
|
114
|
-
# Development dependencies
|
115
|
-
dev = [
|
116
|
-
# Django for development
|
117
|
-
"django>=5.2,<6.0",
|
118
|
-
# Testing
|
119
|
-
"pytest>=7.0",
|
120
|
-
"pytest-django>=4.5.0",
|
121
|
-
"pytest-cov>=4.0.0",
|
122
|
-
"pytest-mock>=3.10.0",
|
123
|
-
"factory-boy>=3.2.0",
|
124
|
-
# Code quality
|
125
|
-
"black>=23.0.0",
|
126
|
-
"isort>=5.12.0",
|
127
|
-
"flake8>=6.0.0",
|
128
|
-
"mypy>=1.5.0",
|
129
|
-
"pre-commit>=3.0.0",
|
130
|
-
# Build and publish tools
|
131
|
-
"build>=1.0.0",
|
132
|
-
"twine>=4.0.0",
|
133
|
-
"tomlkit>=0.13.3",
|
134
|
-
"questionary>=2.1.0",
|
135
|
-
"rich>=13.0.0",
|
136
|
-
# Documentation
|
137
|
-
"mkdocs>=1.5.0",
|
138
|
-
"mkdocs-material>=9.0.0",
|
139
|
-
"mkdocstrings[python]>=0.22.0",
|
140
|
-
# Task processing for development
|
141
|
-
"dramatiq[redis]>=1.18.0,<2.0",
|
142
|
-
"django-dramatiq>=0.14.0,<1.0",
|
143
|
-
"redis>=6.4.0,<7.0",
|
144
|
-
]
|
145
|
-
|
146
|
-
|
147
|
-
# Testing dependencies
|
148
|
-
test = [
|
149
|
-
"django>=5.2,<6.0",
|
150
|
-
"pytest>=7.0",
|
151
|
-
"pytest-django>=4.5.0",
|
152
|
-
"pytest-cov>=4.0.0",
|
153
|
-
"pytest-mock>=3.10.0",
|
154
|
-
"pytest-xdist>=3.0.0",
|
155
|
-
"factory-boy>=3.2.0",
|
156
|
-
]
|
157
|
-
|
158
|
-
# Documentation dependencies
|
159
|
-
docs = [
|
160
|
-
"mkdocs>=1.5.0",
|
161
|
-
"mkdocs-material>=9.0.0",
|
162
|
-
"mkdocstrings[python]>=0.22.0",
|
163
|
-
"pymdown-extensions>=10.0.0",
|
164
|
-
]
|
165
|
-
|
166
|
-
# Background task processing dependencies
|
167
|
-
tasks = [
|
168
|
-
"dramatiq[redis]>=1.18.0,<2.0",
|
169
|
-
"django-dramatiq>=0.14.0,<1.0",
|
170
|
-
"redis>=6.4.0,<7.0",
|
171
|
-
]
|
172
|
-
|
173
|
-
# Full feature set (includes all optional dependencies)
|
174
|
-
full = [
|
175
|
-
"django>=5.2,<6.0",
|
176
|
-
# Task processing
|
177
|
-
"dramatiq[redis]>=1.18.0,<2.0",
|
178
|
-
"django-dramatiq>=0.14.0,<1.0",
|
179
|
-
"redis>=6.4.0,<7.0",
|
180
|
-
]
|
181
|
-
|
182
|
-
[project.urls]
|
183
|
-
Homepage = "https://github.com/markolofsen/django-cfg"
|
184
|
-
Documentation = "https://django-cfg.readthedocs.io"
|
185
|
-
Repository = "https://github.com/markolofsen/django-cfg.git"
|
186
|
-
Issues = "https://github.com/markolofsen/django-cfg/issues"
|
187
|
-
Changelog = "https://github.com/markolofsen/django-cfg/blob/main/CHANGELOG.md"
|
188
|
-
|
189
|
-
[project.scripts]
|
190
|
-
django-cfg = "django_cfg.cli.main:main"
|
191
|
-
|
192
|
-
[tool.hatch.build.targets.wheel]
|
193
|
-
packages = ["src/django_cfg"]
|
194
|
-
exclude = [
|
195
|
-
"django_sample", # Exclude django_sample directory (use archive instead)
|
196
|
-
"scripts/", # Exclude scripts from wheel package
|
197
|
-
]
|
198
|
-
|
199
|
-
[tool.hatch.metadata]
|
200
|
-
allow-direct-references = true
|
201
|
-
|
202
|
-
[tool.hatch.build.targets.sdist]
|
203
|
-
include = [
|
204
|
-
"src/django_cfg",
|
205
|
-
"README.md",
|
206
|
-
"LICENSE",
|
207
|
-
"CHANGELOG.md",
|
208
|
-
"requirements*.txt",
|
209
|
-
"MANIFEST.in",
|
210
|
-
]
|
211
|
-
exclude = [
|
212
|
-
"@*",
|
213
|
-
"tests",
|
214
|
-
"scripts", # Exclude development scripts
|
215
|
-
"*.log",
|
216
|
-
".env*",
|
217
|
-
"django_sample", # Exclude django_sample directory (use archive instead)
|
218
|
-
]
|
219
|
-
|
220
|
-
# Black configuration
|
221
|
-
[tool.black]
|
222
|
-
line-length = 100
|
223
|
-
target-version = ['py39']
|
224
|
-
include = '\.pyi?$'
|
225
|
-
extend-exclude = '''
|
226
|
-
/(
|
227
|
-
\.eggs
|
228
|
-
| \.git
|
229
|
-
| \.hg
|
230
|
-
| \.mypy_cache
|
231
|
-
| \.tox
|
232
|
-
| \.venv
|
233
|
-
| _build
|
234
|
-
| buck-out
|
235
|
-
| build
|
236
|
-
| dist
|
237
|
-
| migrations
|
238
|
-
)/
|
239
|
-
'''
|
240
|
-
|
241
|
-
# isort configuration
|
242
|
-
[tool.isort]
|
243
|
-
profile = "black"
|
244
|
-
line_length = 100
|
245
|
-
multi_line_output = 3
|
246
|
-
include_trailing_comma = true
|
247
|
-
force_grid_wrap = 0
|
248
|
-
use_parentheses = true
|
249
|
-
ensure_newline_before_comments = true
|
250
|
-
known_django = ["django"]
|
251
|
-
known_first_party = ["django_cfg"]
|
252
|
-
sections = ["FUTURE", "STDLIB", "DJANGO", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
|
253
|
-
|
254
|
-
# MyPy configuration
|
255
|
-
[tool.mypy]
|
256
|
-
python_version = "3.9"
|
257
|
-
check_untyped_defs = true
|
258
|
-
ignore_missing_imports = true
|
259
|
-
warn_unused_ignores = true
|
260
|
-
warn_redundant_casts = true
|
261
|
-
warn_unused_configs = true
|
262
|
-
disallow_untyped_defs = true
|
263
|
-
disallow_incomplete_defs = true
|
264
|
-
disallow_untyped_decorators = true
|
265
|
-
strict_optional = true
|
266
|
-
show_error_codes = true
|
267
|
-
|
268
|
-
[[tool.mypy.overrides]]
|
269
|
-
module = [
|
270
|
-
"django.*",
|
271
|
-
"rest_framework.*",
|
272
|
-
"django_redis.*",
|
273
|
-
"yaml.*",
|
274
|
-
]
|
275
|
-
ignore_missing_imports = true
|
276
|
-
|
277
|
-
# Pytest configuration
|
278
|
-
[tool.pytest.ini_options]
|
279
|
-
addopts = [
|
280
|
-
"--cov=django_cfg",
|
281
|
-
"--cov-report=term-missing",
|
282
|
-
"--cov-report=html",
|
283
|
-
"--cov-report=xml",
|
284
|
-
"--cov-fail-under=50",
|
285
|
-
"--strict-markers",
|
286
|
-
"--strict-config",
|
287
|
-
"--verbose",
|
288
|
-
]
|
289
|
-
testpaths = ["tests"]
|
290
|
-
markers = [
|
291
|
-
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
292
|
-
"integration: marks tests as integration tests",
|
293
|
-
"unit: marks tests as unit tests",
|
294
|
-
"django_db: marks tests that require database access",
|
295
|
-
]
|
296
|
-
filterwarnings = [
|
297
|
-
"error",
|
298
|
-
"ignore::UserWarning",
|
299
|
-
"ignore::DeprecationWarning",
|
300
|
-
]
|
301
|
-
|
302
|
-
# Coverage configuration
|
303
|
-
[tool.coverage.run]
|
304
|
-
source = ["src/django_cfg"]
|
305
|
-
omit = [
|
306
|
-
"*/tests/*",
|
307
|
-
"*/migrations/*",
|
308
|
-
"*/__pycache__/*",
|
309
|
-
"*/venv/*",
|
310
|
-
"*/.venv/*",
|
311
|
-
]
|
312
|
-
|
313
|
-
[tool.coverage.report]
|
314
|
-
exclude_lines = [
|
315
|
-
"pragma: no cover",
|
316
|
-
"def __repr__",
|
317
|
-
"if self.debug:",
|
318
|
-
"if settings.DEBUG",
|
319
|
-
"raise AssertionError",
|
320
|
-
"raise NotImplementedError",
|
321
|
-
"if 0:",
|
322
|
-
"if __name__ == .__main__.:",
|
323
|
-
"class .*\\bProtocol\\):",
|
324
|
-
"@(abc\\.)?abstractmethod",
|
325
|
-
]
|
326
|
-
|
327
|
-
[tool.coverage.html]
|
328
|
-
directory = "htmlcov"
|
329
|
-
|
330
|
-
# Ruff configuration (alternative to flake8)
|
331
|
-
[tool.ruff]
|
332
|
-
target-version = "py39"
|
333
|
-
line-length = 100
|
334
|
-
select = [
|
335
|
-
"E", # pycodestyle errors
|
336
|
-
"W", # pycodestyle warnings
|
337
|
-
"F", # pyflakes
|
338
|
-
"I", # isort
|
339
|
-
"B", # flake8-bugbear
|
340
|
-
"C4", # flake8-comprehensions
|
341
|
-
"UP", # pyupgrade
|
342
|
-
"N", # pep8-naming
|
343
|
-
"S", # bandit
|
344
|
-
]
|
345
|
-
ignore = [
|
346
|
-
"E501", # line too long, handled by black
|
347
|
-
"B008", # do not perform function calls in argument defaults
|
348
|
-
"S101", # use of assert
|
349
|
-
"S311", # pseudo-random generators are not suitable for cryptographic purposes
|
350
|
-
]
|
351
|
-
|
352
|
-
[tool.ruff.per-file-ignores]
|
353
|
-
"tests/*" = ["S101", "S106"] # Allow assert and hardcoded passwords in tests
|
354
|
-
"*/migrations/*" = ["N806"] # Allow non-lowercase variable names in migrations
|
355
|
-
|
356
|
-
# Bandit security configuration
|
357
|
-
[tool.bandit]
|
358
|
-
exclude_dirs = ["tests", "migrations"]
|
359
|
-
skips = ["B101", "B601"] # Skip assert_used and shell injection (handled by other tools)
|
360
|
-
|
361
|
-
[tool.poetry.group.dev.dependencies]
|
362
|
-
tomlkit = "^0.13.3"
|
363
|
-
build = "^1.3.0"
|
364
|
-
rich = "^14.1.0"
|
365
|
-
questionary = "^2.1.0"
|
366
|
-
psutil = "^7.0.0"
|
367
|
-
aiohttp = "^3.12.15"
|
368
|
-
pytest-asyncio = "^1.2.0"
|
369
|
-
pillow = "^11.3.0"
|
370
|
-
|
django_cfg/routers.py
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Database Router for Django Config Toolkit
|
3
|
-
|
4
|
-
Simple and reliable database routing.
|
5
|
-
"""
|
6
|
-
|
7
|
-
from django.conf import settings
|
8
|
-
from django.apps import apps
|
9
|
-
|
10
|
-
|
11
|
-
class DatabaseRouter:
|
12
|
-
"""
|
13
|
-
Simple database router that routes based on app labels.
|
14
|
-
|
15
|
-
Uses DATABASE_ROUTING_RULES setting to determine which apps
|
16
|
-
should use which databases.
|
17
|
-
"""
|
18
|
-
|
19
|
-
def _get_database_for_app(self, app_label):
|
20
|
-
"""
|
21
|
-
Get database for app_label, trying multiple approaches.
|
22
|
-
|
23
|
-
1. Direct app_label lookup
|
24
|
-
2. Find full app path and lookup
|
25
|
-
"""
|
26
|
-
rules = getattr(settings, 'DATABASE_ROUTING_RULES', {})
|
27
|
-
|
28
|
-
# Try direct app_label first
|
29
|
-
if app_label in rules:
|
30
|
-
return rules[app_label]
|
31
|
-
|
32
|
-
# Try to find full app path using Django's app registry
|
33
|
-
try:
|
34
|
-
app_config = apps.get_app_config(app_label)
|
35
|
-
app_module = app_config.module.__name__
|
36
|
-
|
37
|
-
# Check if full module path is in rules
|
38
|
-
if app_module in rules:
|
39
|
-
return rules[app_module]
|
40
|
-
|
41
|
-
except LookupError:
|
42
|
-
pass
|
43
|
-
|
44
|
-
return None
|
45
|
-
|
46
|
-
def db_for_read(self, model, **hints):
|
47
|
-
"""Route reads to correct database."""
|
48
|
-
return self._get_database_for_app(model._meta.app_label)
|
49
|
-
|
50
|
-
def db_for_write(self, model, **hints):
|
51
|
-
"""Route writes to correct database."""
|
52
|
-
return self._get_database_for_app(model._meta.app_label)
|
53
|
-
|
54
|
-
def allow_relation(self, obj1, obj2, **hints):
|
55
|
-
"""Allow relations between databases."""
|
56
|
-
app_label1 = obj1._meta.app_label
|
57
|
-
app_label2 = obj2._meta.app_label
|
58
|
-
|
59
|
-
db1 = self._get_database_for_app(app_label1)
|
60
|
-
db2 = self._get_database_for_app(app_label2)
|
61
|
-
|
62
|
-
# Allow relations if both are in same database
|
63
|
-
if db1 and db2:
|
64
|
-
return db1 == db2
|
65
|
-
|
66
|
-
# Allow relations between routed apps and default database
|
67
|
-
# (e.g., User from default can relate to Document from knowbase)
|
68
|
-
if (db1 and not db2) or (db2 and not db1):
|
69
|
-
return True
|
70
|
-
|
71
|
-
# Allow all other relations (both in default)
|
72
|
-
return True
|
73
|
-
|
74
|
-
def allow_migrate(self, db, app_label, **hints):
|
75
|
-
"""Allow migrations to correct database."""
|
76
|
-
target_db = self._get_database_for_app(app_label)
|
77
|
-
|
78
|
-
if target_db:
|
79
|
-
# This app IS configured in the rules
|
80
|
-
return db == target_db
|
81
|
-
else:
|
82
|
-
# This app is NOT configured, allow migration to default only
|
83
|
-
return db == 'default'
|