django-cfg 1.1.82__py3-none-any.whl → 1.2.0__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 (244) hide show
  1. django_cfg/__init__.py +20 -448
  2. django_cfg/apps/accounts/README.md +3 -3
  3. django_cfg/apps/accounts/admin/__init__.py +0 -2
  4. django_cfg/apps/accounts/admin/activity.py +2 -9
  5. django_cfg/apps/accounts/admin/filters.py +0 -42
  6. django_cfg/apps/accounts/admin/inlines.py +8 -8
  7. django_cfg/apps/accounts/admin/otp.py +5 -5
  8. django_cfg/apps/accounts/admin/registration_source.py +1 -8
  9. django_cfg/apps/accounts/admin/user.py +12 -20
  10. django_cfg/apps/accounts/managers/user_manager.py +2 -129
  11. django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +46 -0
  12. django_cfg/apps/accounts/models.py +3 -123
  13. django_cfg/apps/accounts/serializers/otp.py +40 -44
  14. django_cfg/apps/accounts/serializers/profile.py +0 -2
  15. django_cfg/apps/accounts/services/otp_service.py +98 -186
  16. django_cfg/apps/accounts/signals.py +25 -15
  17. django_cfg/apps/accounts/utils/auth_email_service.py +84 -0
  18. django_cfg/apps/accounts/views/otp.py +35 -36
  19. django_cfg/apps/agents/README.md +129 -0
  20. django_cfg/apps/agents/__init__.py +68 -0
  21. django_cfg/apps/agents/admin/__init__.py +17 -0
  22. django_cfg/apps/agents/admin/execution_admin.py +460 -0
  23. django_cfg/apps/agents/admin/registry_admin.py +360 -0
  24. django_cfg/apps/agents/admin/toolsets_admin.py +482 -0
  25. django_cfg/apps/agents/apps.py +29 -0
  26. django_cfg/apps/agents/core/__init__.py +20 -0
  27. django_cfg/apps/agents/core/agent.py +281 -0
  28. django_cfg/apps/agents/core/dependencies.py +154 -0
  29. django_cfg/apps/agents/core/exceptions.py +66 -0
  30. django_cfg/apps/agents/core/models.py +106 -0
  31. django_cfg/apps/agents/core/orchestrator.py +391 -0
  32. django_cfg/apps/agents/examples/__init__.py +3 -0
  33. django_cfg/apps/agents/examples/simple_example.py +161 -0
  34. django_cfg/apps/agents/integration/__init__.py +14 -0
  35. django_cfg/apps/agents/integration/middleware.py +80 -0
  36. django_cfg/apps/agents/integration/registry.py +345 -0
  37. django_cfg/apps/agents/integration/signals.py +50 -0
  38. django_cfg/apps/agents/management/__init__.py +3 -0
  39. django_cfg/apps/agents/management/commands/__init__.py +3 -0
  40. django_cfg/apps/agents/management/commands/create_agent.py +365 -0
  41. django_cfg/apps/agents/management/commands/orchestrator_status.py +191 -0
  42. django_cfg/apps/agents/managers/__init__.py +23 -0
  43. django_cfg/apps/agents/managers/execution.py +236 -0
  44. django_cfg/apps/agents/managers/registry.py +254 -0
  45. django_cfg/apps/agents/managers/toolsets.py +496 -0
  46. django_cfg/apps/agents/migrations/0001_initial.py +286 -0
  47. django_cfg/apps/agents/migrations/__init__.py +5 -0
  48. django_cfg/apps/agents/models/__init__.py +15 -0
  49. django_cfg/apps/agents/models/execution.py +215 -0
  50. django_cfg/apps/agents/models/registry.py +220 -0
  51. django_cfg/apps/agents/models/toolsets.py +305 -0
  52. django_cfg/apps/agents/patterns/__init__.py +24 -0
  53. django_cfg/apps/agents/patterns/content_agents.py +234 -0
  54. django_cfg/apps/agents/toolsets/__init__.py +15 -0
  55. django_cfg/apps/agents/toolsets/cache_toolset.py +285 -0
  56. django_cfg/apps/agents/toolsets/django_toolset.py +220 -0
  57. django_cfg/apps/agents/toolsets/file_toolset.py +324 -0
  58. django_cfg/apps/agents/toolsets/orm_toolset.py +319 -0
  59. django_cfg/apps/agents/urls.py +46 -0
  60. django_cfg/apps/knowbase/README.md +150 -0
  61. django_cfg/apps/knowbase/__init__.py +27 -0
  62. django_cfg/apps/knowbase/admin/__init__.py +23 -0
  63. django_cfg/apps/knowbase/admin/archive_admin.py +857 -0
  64. django_cfg/apps/knowbase/admin/chat_admin.py +386 -0
  65. django_cfg/apps/knowbase/admin/document_admin.py +650 -0
  66. django_cfg/apps/knowbase/admin/external_data_admin.py +685 -0
  67. django_cfg/apps/knowbase/apps.py +81 -0
  68. django_cfg/apps/knowbase/config/README.md +176 -0
  69. django_cfg/apps/knowbase/config/__init__.py +51 -0
  70. django_cfg/apps/knowbase/config/constance_fields.py +186 -0
  71. django_cfg/apps/knowbase/config/constance_settings.py +200 -0
  72. django_cfg/apps/knowbase/config/settings.py +444 -0
  73. django_cfg/apps/knowbase/examples/__init__.py +3 -0
  74. django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
  75. django_cfg/apps/knowbase/management/__init__.py +0 -0
  76. django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
  77. django_cfg/apps/knowbase/management/commands/knowbase_stats.py +158 -0
  78. django_cfg/apps/knowbase/management/commands/setup_knowbase.py +59 -0
  79. django_cfg/apps/knowbase/managers/__init__.py +22 -0
  80. django_cfg/apps/knowbase/managers/archive.py +426 -0
  81. django_cfg/apps/knowbase/managers/base.py +32 -0
  82. django_cfg/apps/knowbase/managers/chat.py +141 -0
  83. django_cfg/apps/knowbase/managers/document.py +203 -0
  84. django_cfg/apps/knowbase/managers/external_data.py +471 -0
  85. django_cfg/apps/knowbase/migrations/0001_initial.py +427 -0
  86. django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +434 -0
  87. django_cfg/apps/knowbase/migrations/__init__.py +5 -0
  88. django_cfg/apps/knowbase/mixins/__init__.py +15 -0
  89. django_cfg/apps/knowbase/mixins/config.py +108 -0
  90. django_cfg/apps/knowbase/mixins/creator.py +81 -0
  91. django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
  92. django_cfg/apps/knowbase/mixins/external_data_mixin.py +813 -0
  93. django_cfg/apps/knowbase/mixins/service.py +362 -0
  94. django_cfg/apps/knowbase/models/__init__.py +41 -0
  95. django_cfg/apps/knowbase/models/archive.py +599 -0
  96. django_cfg/apps/knowbase/models/base.py +58 -0
  97. django_cfg/apps/knowbase/models/chat.py +157 -0
  98. django_cfg/apps/knowbase/models/document.py +267 -0
  99. django_cfg/apps/knowbase/models/external_data.py +376 -0
  100. django_cfg/apps/knowbase/serializers/__init__.py +68 -0
  101. django_cfg/apps/knowbase/serializers/archive_serializers.py +386 -0
  102. django_cfg/apps/knowbase/serializers/chat_serializers.py +137 -0
  103. django_cfg/apps/knowbase/serializers/document_serializers.py +94 -0
  104. django_cfg/apps/knowbase/serializers/external_data_serializers.py +256 -0
  105. django_cfg/apps/knowbase/serializers/public_serializers.py +74 -0
  106. django_cfg/apps/knowbase/services/__init__.py +40 -0
  107. django_cfg/apps/knowbase/services/archive/__init__.py +42 -0
  108. django_cfg/apps/knowbase/services/archive/archive_service.py +541 -0
  109. django_cfg/apps/knowbase/services/archive/chunking_service.py +791 -0
  110. django_cfg/apps/knowbase/services/archive/exceptions.py +52 -0
  111. django_cfg/apps/knowbase/services/archive/extraction_service.py +508 -0
  112. django_cfg/apps/knowbase/services/archive/vectorization_service.py +362 -0
  113. django_cfg/apps/knowbase/services/base.py +53 -0
  114. django_cfg/apps/knowbase/services/chat_service.py +239 -0
  115. django_cfg/apps/knowbase/services/document_service.py +144 -0
  116. django_cfg/apps/knowbase/services/embedding/__init__.py +43 -0
  117. django_cfg/apps/knowbase/services/embedding/async_processor.py +244 -0
  118. django_cfg/apps/knowbase/services/embedding/batch_processor.py +250 -0
  119. django_cfg/apps/knowbase/services/embedding/batch_result.py +61 -0
  120. django_cfg/apps/knowbase/services/embedding/models.py +229 -0
  121. django_cfg/apps/knowbase/services/embedding/processors.py +148 -0
  122. django_cfg/apps/knowbase/services/embedding/utils.py +176 -0
  123. django_cfg/apps/knowbase/services/prompt_builder.py +191 -0
  124. django_cfg/apps/knowbase/services/search_service.py +293 -0
  125. django_cfg/apps/knowbase/signals/__init__.py +21 -0
  126. django_cfg/apps/knowbase/signals/archive_signals.py +211 -0
  127. django_cfg/apps/knowbase/signals/chat_signals.py +37 -0
  128. django_cfg/apps/knowbase/signals/document_signals.py +143 -0
  129. django_cfg/apps/knowbase/signals/external_data_signals.py +157 -0
  130. django_cfg/apps/knowbase/tasks/__init__.py +39 -0
  131. django_cfg/apps/knowbase/tasks/archive_tasks.py +316 -0
  132. django_cfg/apps/knowbase/tasks/document_processing.py +341 -0
  133. django_cfg/apps/knowbase/tasks/external_data_tasks.py +341 -0
  134. django_cfg/apps/knowbase/tasks/maintenance.py +195 -0
  135. django_cfg/apps/knowbase/urls.py +43 -0
  136. django_cfg/apps/knowbase/utils/__init__.py +12 -0
  137. django_cfg/apps/knowbase/utils/chunk_settings.py +261 -0
  138. django_cfg/apps/knowbase/utils/text_processing.py +375 -0
  139. django_cfg/apps/knowbase/utils/validation.py +99 -0
  140. django_cfg/apps/knowbase/views/__init__.py +28 -0
  141. django_cfg/apps/knowbase/views/archive_views.py +469 -0
  142. django_cfg/apps/knowbase/views/base.py +49 -0
  143. django_cfg/apps/knowbase/views/chat_views.py +181 -0
  144. django_cfg/apps/knowbase/views/document_views.py +183 -0
  145. django_cfg/apps/knowbase/views/public_views.py +129 -0
  146. django_cfg/apps/leads/admin.py +70 -0
  147. django_cfg/apps/newsletter/admin.py +234 -0
  148. django_cfg/apps/newsletter/admin_filters.py +124 -0
  149. django_cfg/apps/support/admin.py +196 -0
  150. django_cfg/apps/support/admin_filters.py +71 -0
  151. django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
  152. django_cfg/apps/urls.py +5 -4
  153. django_cfg/cli/README.md +1 -1
  154. django_cfg/cli/commands/create_project.py +2 -2
  155. django_cfg/cli/commands/info.py +1 -1
  156. django_cfg/config.py +44 -0
  157. django_cfg/core/config.py +29 -82
  158. django_cfg/core/environment.py +1 -1
  159. django_cfg/core/generation.py +19 -107
  160. django_cfg/{integration.py → core/integration.py} +18 -16
  161. django_cfg/core/validation.py +1 -1
  162. django_cfg/management/__init__.py +1 -1
  163. django_cfg/management/commands/__init__.py +1 -1
  164. django_cfg/management/commands/auto_generate.py +482 -0
  165. django_cfg/management/commands/migrator.py +19 -101
  166. django_cfg/management/commands/test_email.py +1 -1
  167. django_cfg/middleware/README.md +0 -158
  168. django_cfg/middleware/__init__.py +0 -2
  169. django_cfg/middleware/user_activity.py +3 -3
  170. django_cfg/models/api.py +145 -0
  171. django_cfg/models/base.py +287 -0
  172. django_cfg/models/cache.py +4 -4
  173. django_cfg/models/constance.py +25 -88
  174. django_cfg/models/database.py +9 -9
  175. django_cfg/models/drf.py +3 -36
  176. django_cfg/models/email.py +163 -0
  177. django_cfg/models/environment.py +276 -0
  178. django_cfg/models/limits.py +1 -1
  179. django_cfg/models/logging.py +366 -0
  180. django_cfg/models/revolution.py +41 -2
  181. django_cfg/models/security.py +125 -0
  182. django_cfg/models/services.py +1 -1
  183. django_cfg/modules/__init__.py +2 -56
  184. django_cfg/modules/base.py +78 -52
  185. django_cfg/modules/django_currency/service.py +2 -2
  186. django_cfg/modules/django_email.py +2 -2
  187. django_cfg/modules/django_health.py +267 -0
  188. django_cfg/modules/django_llm/llm/client.py +79 -17
  189. django_cfg/modules/django_llm/translator/translator.py +2 -2
  190. django_cfg/modules/django_logger.py +2 -2
  191. django_cfg/modules/django_ngrok.py +2 -2
  192. django_cfg/modules/django_tasks.py +68 -3
  193. django_cfg/modules/django_telegram.py +3 -3
  194. django_cfg/modules/django_twilio/sendgrid_service.py +2 -2
  195. django_cfg/modules/django_twilio/service.py +2 -2
  196. django_cfg/modules/django_twilio/simple_service.py +2 -2
  197. django_cfg/modules/django_twilio/twilio_service.py +2 -2
  198. django_cfg/modules/django_unfold/__init__.py +69 -0
  199. django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
  200. django_cfg/modules/django_unfold/dashboard.py +278 -0
  201. django_cfg/modules/django_unfold/icons/README.md +145 -0
  202. django_cfg/modules/django_unfold/icons/__init__.py +12 -0
  203. django_cfg/modules/django_unfold/icons/constants.py +2851 -0
  204. django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
  205. django_cfg/modules/django_unfold/models/__init__.py +42 -0
  206. django_cfg/modules/django_unfold/models/config.py +601 -0
  207. django_cfg/modules/django_unfold/models/dashboard.py +206 -0
  208. django_cfg/modules/django_unfold/models/dropdown.py +40 -0
  209. django_cfg/modules/django_unfold/models/navigation.py +73 -0
  210. django_cfg/modules/django_unfold/models/tabs.py +25 -0
  211. django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
  212. django_cfg/modules/django_unfold/utils.py +140 -0
  213. django_cfg/registry/__init__.py +23 -0
  214. django_cfg/registry/core.py +61 -0
  215. django_cfg/registry/exceptions.py +11 -0
  216. django_cfg/registry/modules.py +12 -0
  217. django_cfg/registry/services.py +26 -0
  218. django_cfg/registry/third_party.py +52 -0
  219. django_cfg/routing/__init__.py +19 -0
  220. django_cfg/routing/callbacks.py +198 -0
  221. django_cfg/routing/routers.py +48 -0
  222. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
  223. django_cfg/templatetags/__init__.py +0 -0
  224. django_cfg/templatetags/django_cfg.py +33 -0
  225. django_cfg/urls.py +33 -0
  226. django_cfg/utils/path_resolution.py +1 -1
  227. django_cfg/utils/smart_defaults.py +7 -61
  228. django_cfg/utils/toolkit.py +663 -0
  229. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/METADATA +83 -86
  230. django_cfg-1.2.0.dist-info/RECORD +441 -0
  231. django_cfg/archive/django_sample.zip +0 -0
  232. django_cfg/models/unfold.py +0 -271
  233. django_cfg/modules/unfold/__init__.py +0 -29
  234. django_cfg/modules/unfold/dashboard.py +0 -318
  235. django_cfg/pyproject.toml +0 -370
  236. django_cfg/routers.py +0 -83
  237. django_cfg-1.1.82.dist-info/RECORD +0 -278
  238. /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
  239. /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
  240. /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
  241. /django_cfg/{version_check.py → utils/version_check.py} +0 -0
  242. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/WHEEL +0 -0
  243. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
  244. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.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'