django-cfg 1.1.81__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 (246) 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/templates/guide.md +266 -0
  198. django_cfg/modules/django_twilio/twilio_service.py +2 -2
  199. django_cfg/modules/django_unfold/__init__.py +69 -0
  200. django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
  201. django_cfg/modules/django_unfold/dashboard.py +278 -0
  202. django_cfg/modules/django_unfold/icons/README.md +145 -0
  203. django_cfg/modules/django_unfold/icons/__init__.py +12 -0
  204. django_cfg/modules/django_unfold/icons/constants.py +2851 -0
  205. django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
  206. django_cfg/modules/django_unfold/models/__init__.py +42 -0
  207. django_cfg/modules/django_unfold/models/config.py +601 -0
  208. django_cfg/modules/django_unfold/models/dashboard.py +206 -0
  209. django_cfg/modules/django_unfold/models/dropdown.py +40 -0
  210. django_cfg/modules/django_unfold/models/navigation.py +73 -0
  211. django_cfg/modules/django_unfold/models/tabs.py +25 -0
  212. django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
  213. django_cfg/modules/django_unfold/utils.py +140 -0
  214. django_cfg/registry/__init__.py +23 -0
  215. django_cfg/registry/core.py +61 -0
  216. django_cfg/registry/exceptions.py +11 -0
  217. django_cfg/registry/modules.py +12 -0
  218. django_cfg/registry/services.py +26 -0
  219. django_cfg/registry/third_party.py +52 -0
  220. django_cfg/routing/__init__.py +19 -0
  221. django_cfg/routing/callbacks.py +198 -0
  222. django_cfg/routing/routers.py +48 -0
  223. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
  224. django_cfg/templatetags/__init__.py +0 -0
  225. django_cfg/templatetags/django_cfg.py +33 -0
  226. django_cfg/urls.py +33 -0
  227. django_cfg/utils/path_resolution.py +1 -1
  228. django_cfg/utils/smart_defaults.py +7 -61
  229. django_cfg/utils/toolkit.py +663 -0
  230. {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/METADATA +83 -86
  231. django_cfg-1.2.0.dist-info/RECORD +441 -0
  232. django_cfg/apps/tasks/@docs/README.md +0 -195
  233. django_cfg/archive/django_sample.zip +0 -0
  234. django_cfg/models/unfold.py +0 -271
  235. django_cfg/modules/unfold/__init__.py +0 -29
  236. django_cfg/modules/unfold/dashboard.py +0 -318
  237. django_cfg/pyproject.toml +0 -370
  238. django_cfg/routers.py +0 -83
  239. django_cfg-1.1.81.dist-info/RECORD +0 -278
  240. /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
  241. /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
  242. /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
  243. /django_cfg/{version_check.py → utils/version_check.py} +0 -0
  244. {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/WHEEL +0 -0
  245. {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
  246. {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py CHANGED
@@ -13,12 +13,12 @@ Key Features:
13
13
 
14
14
  Example:
15
15
  ```python
16
- from django_cfg import DjangoConfig, DatabaseConnection
16
+ from django_cfg import DjangoConfig, DatabaseConfig
17
17
 
18
18
  class MyConfig(DjangoConfig):
19
19
  project_name: str = "My Project"
20
- databases: Dict[str, DatabaseConnection] = {
21
- "default": DatabaseConnection(
20
+ databases: Dict[str, DatabaseConfig] = {
21
+ "default": DatabaseConfig(
22
22
  engine="django.db.backends.postgresql",
23
23
  name="${DATABASE_URL:mydb}",
24
24
  )
@@ -28,460 +28,32 @@ Example:
28
28
  ```
29
29
  """
30
30
 
31
- # Check Python version immediately on import
32
- from .version_check import check_python_version
33
- check_python_version("django-cfg")
34
-
35
31
  # Configure Django app
36
32
  default_app_config = "django_cfg.apps.DjangoCfgConfig"
37
33
 
38
- from typing import TYPE_CHECKING
39
-
40
34
  # Version information
41
- __version__ = "1.1.81"
42
- __author__ = "Unrealos Team"
43
- __email__ = "info@unrealos.com"
35
+ __version__ = "1.2.0"
44
36
  __license__ = "MIT"
45
37
 
46
- # Core exports - only import when needed to avoid circular imports
47
- if TYPE_CHECKING:
48
- from django_cfg.core.config import DjangoConfig
49
- from django_cfg.models.database import DatabaseConnection, DatabaseRoutingRule
50
- from django_cfg.models.cache import CacheBackend
51
- from django_cfg.models.security import SecuritySettings
52
- from django_cfg.models.services import EmailConfig, TelegramConfig
53
- from django_cfg.models.jwt import JWTConfig
54
- from django_cfg.modules.django_twilio.models import TwilioConfig
55
- from django_cfg.modules.django_twilio.service import DjangoTwilioService
56
- from django_cfg.models.logging import LoggingConfig
57
- from django_cfg.models.limits import LimitsConfig
58
- from django_cfg.models.ngrok import NgrokConfig, NgrokAuthConfig, NgrokTunnelConfig
59
- from django_cfg.models.third_party.revolution import RevolutionConfig, APIZone
60
- from django_cfg.models.unfold import UnfoldConfig, UnfoldColors, UnfoldSidebar
61
- from django_cfg.models.constance import ConstanceConfig, ConstanceField
62
- # LLM models are deprecated - use direct LLMClient injection instead
38
+ # Import registry for organized lazy loading
39
+ from .registry import DJANGO_CFG_REGISTRY
40
+ from .config import LIB_NAME
63
41
 
64
- # Dashboard models are now part of unfold module
65
- from django_cfg.models.environment import EnvironmentConfig
66
- from django_cfg.exceptions import DjangoCfgException, ConfigurationError, ValidationError
42
+ # Get author from library config
43
+ __author__ = LIB_NAME
67
44
 
68
45
 
69
- # Lazy imports to avoid import time overhead
70
46
  def __getattr__(name: str):
71
- """Lazy import mechanism to avoid circular imports and improve startup time."""
72
-
73
- # Core classes
74
- if name == "DjangoConfig":
75
- from django_cfg.core.config import DjangoConfig
76
-
77
- return DjangoConfig
78
-
79
- # Database models
80
- elif name == "DatabaseConnection":
81
- from django_cfg.models.database import DatabaseConnection
82
-
83
- return DatabaseConnection
84
-
85
- # Cache models
86
- elif name == "CacheBackend":
87
- from django_cfg.models.cache import CacheBackend
88
-
89
- return CacheBackend
90
-
91
- # Security models
92
- elif name == "SecuritySettings":
93
- from django_cfg.models.security import SecuritySettings
94
-
95
- return SecuritySettings
96
-
97
- # Service models
98
- elif name == "EmailConfig":
99
- from django_cfg.models.services import EmailConfig
100
-
101
- return EmailConfig
102
- elif name == "TelegramConfig":
103
- from django_cfg.models.services import TelegramConfig
104
-
105
- return TelegramConfig
106
- elif name == "TwilioConfig":
107
- from django_cfg.modules.django_twilio.models import TwilioConfig
108
-
109
- return TwilioConfig
110
- elif name == "JWTConfig":
111
- from django_cfg.models.jwt import JWTConfig
112
-
113
- return JWTConfig
114
-
115
- # Limits models
116
- elif name == "LimitsConfig":
117
- from django_cfg.models.limits import LimitsConfig
118
-
119
- return LimitsConfig
120
-
121
- # Ngrok models
122
- elif name == "NgrokConfig":
123
- from django_cfg.models.ngrok import NgrokConfig
124
-
125
- return NgrokConfig
126
- elif name == "NgrokAuthConfig":
127
- from django_cfg.models.ngrok import NgrokAuthConfig
128
-
129
- return NgrokAuthConfig
130
- elif name == "NgrokTunnelConfig":
131
- from django_cfg.models.ngrok import NgrokTunnelConfig
132
-
133
- return NgrokTunnelConfig
134
-
135
- # Logging models
136
- elif name == "LoggingConfig":
137
- from django_cfg.models.logging import LoggingConfig
138
-
139
- return LoggingConfig
140
-
141
- # Third-party models - Django Revolution (always available)
142
- elif name == "RevolutionConfig":
143
- from django_cfg.models.revolution import RevolutionConfig
144
-
145
- return RevolutionConfig
146
- elif name == "APIZone":
147
- from django_revolution.config import ZoneModel as APIZone
148
-
149
- return APIZone
150
- elif name == "ZoneModel":
151
- from django_revolution.config import ZoneModel
152
-
153
- return ZoneModel
154
- elif name == "ZoneConfig":
155
- from django_revolution.app_config import ZoneConfig
156
-
157
- return ZoneConfig
158
- elif name == "DjangoRevolutionSettings":
159
- from django_revolution.config import DjangoRevolutionSettings
160
-
161
- return DjangoRevolutionSettings
162
-
163
- elif name == "UnfoldConfig":
164
- from django_cfg.models.unfold import UnfoldConfig
165
-
166
- return UnfoldConfig
167
- elif name == "UnfoldColors":
168
- from django_cfg.models.unfold import UnfoldColors
169
-
170
- return UnfoldColors
171
- elif name == "UnfoldSidebar":
172
- from django_cfg.models.unfold import UnfoldSidebar
173
-
174
- return UnfoldSidebar
175
-
176
- # Dashboard models
177
- elif name == "DashboardConfig":
178
- from django_cfg.models.unfold import DashboardWidget as DashboardConfig
179
-
180
- return DashboardConfig
181
- elif name == "QuickAction":
182
- from django_cfg.models.unfold import QuickAction
183
-
184
- return QuickAction
185
- elif name == "NavigationItem":
186
- from django_cfg.models.unfold import NavigationItem
187
-
188
- return NavigationItem
189
- elif name == "NavigationGroup":
190
- from django_cfg.models.unfold import NavigationGroup
191
-
192
- return NavigationGroup
193
-
194
- # Environment models
195
- elif name == "EnvironmentConfig":
196
- from django_cfg.models.environment import EnvironmentConfig
197
-
198
- return EnvironmentConfig
199
-
200
- # Exceptions
201
- elif name == "DjangoCfgException":
202
- from django_cfg.exceptions import DjangoCfgException
203
-
204
- return DjangoCfgException
205
- elif name == "ConfigurationError":
206
- from django_cfg.exceptions import ConfigurationError
207
-
208
- return ConfigurationError
209
- elif name == "ValidationError":
210
- from django_cfg.exceptions import ValidationError
211
-
212
- return ValidationError
213
-
214
- # Auto-configuring modules
215
- elif name == "DjangoLogger":
216
- from django_cfg.modules.django_logger import DjangoLogger
217
-
218
- return DjangoLogger
219
- elif name == "get_logger":
220
- from django_cfg.modules.django_logger import get_logger
221
-
222
- return get_logger
223
- elif name == "DjangoEmailService":
224
- from django_cfg.modules.django_email import DjangoEmailService
225
-
226
- return DjangoEmailService
227
- elif name == "send_email":
228
- from django_cfg.modules.django_email import send_email
229
-
230
- return send_email
231
- elif name == "DjangoTelegram":
232
- from django_cfg.modules.django_telegram import DjangoTelegram
233
-
234
- return DjangoTelegram
235
- elif name == "send_telegram_message":
236
- from django_cfg.modules.django_telegram import send_telegram_message
237
-
238
- return send_telegram_message
239
- elif name == "send_telegram_photo":
240
- from django_cfg.modules.django_telegram import send_telegram_photo
241
-
242
- return send_telegram_photo
243
- elif name == "DjangoTwilioService":
244
- from django_cfg.modules.django_twilio.service import DjangoTwilioService
245
-
246
- return DjangoTwilioService
247
- elif name == "send_whatsapp_otp":
248
- from django_cfg.modules.django_twilio.service import send_whatsapp_otp
249
-
250
- return send_whatsapp_otp
251
- elif name == "send_email_otp":
252
- from django_cfg.modules.django_twilio.service import send_email_otp
253
-
254
- return send_email_otp
255
- elif name == "send_sms_otp":
256
- from django_cfg.modules.django_twilio.service import send_sms_otp
257
-
258
- return send_sms_otp
259
- elif name == "verify_otp":
260
- from django_cfg.modules.django_twilio.service import verify_otp
261
-
262
- return verify_otp
263
- elif name == "DjangoLLM":
264
- from django_cfg.modules.django_llm import DjangoLLM
265
-
266
- return DjangoLLM
267
- elif name == "DjangoTranslator":
268
- from django_cfg.modules.django_llm import DjangoTranslator
269
-
270
- return DjangoTranslator
271
- elif name == "chat_completion":
272
- from django_cfg.modules.django_llm import chat_completion
273
-
274
- return chat_completion
275
- elif name == "translate_text":
276
- from django_cfg.modules.django_llm import translate_text
277
-
278
- return translate_text
279
- elif name == "translate_json":
280
- from django_cfg.modules.django_llm import translate_json
281
-
282
- return translate_json
283
-
284
- # Ngrok service
285
- elif name == "DjangoNgrok":
286
- from django_cfg.modules.django_ngrok import DjangoNgrok
287
-
288
- return DjangoNgrok
289
- elif name == "get_ngrok_service":
290
- from django_cfg.modules.django_ngrok import get_ngrok_service
291
-
292
- return get_ngrok_service
293
- elif name == "start_tunnel":
294
- from django_cfg.modules.django_ngrok import start_tunnel
295
-
296
- return start_tunnel
297
- elif name == "stop_tunnel":
298
- from django_cfg.modules.django_ngrok import stop_tunnel
299
-
300
- return stop_tunnel
301
- elif name == "get_tunnel_url":
302
- from django_cfg.modules.django_ngrok import get_tunnel_url
303
-
304
- return get_tunnel_url
305
- elif name == "get_webhook_url":
306
- from django_cfg.modules.django_ngrok import get_webhook_url
307
-
308
- return get_webhook_url
309
- elif name == "get_api_url":
310
- from django_cfg.modules.django_ngrok import get_api_url
311
-
312
- return get_api_url
313
-
314
- # Unfold models
315
- elif name == "UnfoldConfig":
316
- from django_cfg.models.unfold import UnfoldConfig
317
-
318
- return UnfoldConfig
319
- elif name == "UnfoldTheme":
320
- from django_cfg.models.unfold import UnfoldTheme
321
-
322
- return UnfoldTheme
323
- elif name == "UnfoldColors":
324
- from django_cfg.models.unfold import UnfoldColors
325
-
326
- return UnfoldColors
327
- elif name == "UnfoldSidebar":
328
- from django_cfg.models.unfold import UnfoldSidebar
329
-
330
- return UnfoldSidebar
331
- elif name == "NavigationItem":
332
- from django_cfg.models.unfold import NavigationItem
333
-
334
- return NavigationItem
335
- elif name == "NavigationGroup":
336
- from django_cfg.models.unfold import NavigationGroup
337
-
338
- return NavigationGroup
339
- elif name == "QuickAction":
340
- from django_cfg.models.unfold import QuickAction
341
-
342
- return QuickAction
343
- elif name == "DashboardWidget":
344
- from django_cfg.models.unfold import DashboardWidget
345
-
346
- return DashboardWidget
347
- elif name == "DropdownItem":
348
- from django_cfg.models.unfold import DropdownItem
349
-
350
- return DropdownItem
351
-
352
- # DRF models
353
- elif name == "DRFConfig":
354
- from django_cfg.models.drf import DRFConfig
355
-
356
- return DRFConfig
357
- elif name == "SpectacularConfig":
358
- from django_cfg.models.drf import SpectacularConfig
359
-
360
- return SpectacularConfig
361
- elif name == "SwaggerUISettings":
362
- from django_cfg.models.drf import SwaggerUISettings
363
-
364
- return SwaggerUISettings
365
- elif name == "RedocUISettings":
366
- from django_cfg.models.drf import RedocUISettings
367
-
368
- return RedocUISettings
369
-
370
- # Constance models
371
- elif name == "ConstanceConfig":
372
- from django_cfg.models.constance import ConstanceConfig
373
-
374
- return ConstanceConfig
375
- elif name == "ConstanceField":
376
- from django_cfg.models.constance import ConstanceField
377
-
378
- return ConstanceField
379
-
380
- # URL integration
381
- elif name == "add_django_cfg_urls":
382
- from django_cfg.integration import add_django_cfg_urls
383
-
384
- return add_django_cfg_urls
385
- elif name == "get_django_cfg_urls_info":
386
- from django_cfg.integration import get_django_cfg_urls_info
387
-
388
- return get_django_cfg_urls_info
389
-
390
- # Unknown attribute
391
- else:
392
- raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
47
+ """Lazy import mechanism using registry pattern."""
48
+ if name in DJANGO_CFG_REGISTRY:
49
+ module_path, class_name = DJANGO_CFG_REGISTRY[name]
50
+
51
+ import importlib
52
+ module = importlib.import_module(module_path)
53
+ return getattr(module, class_name)
54
+
55
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
393
56
 
394
57
 
395
- # Public API - what users can import
396
- __all__ = [
397
- # Core
398
- "DjangoConfig",
399
- # Database
400
- "DatabaseConnection",
401
- # Cache
402
- "CacheBackend",
403
- # Security
404
- "SecuritySettings",
405
- # Services
406
- "EmailConfig",
407
- "TelegramConfig",
408
- "TwilioConfig",
409
- "JWTConfig",
410
- # Limits
411
- "LimitsConfig",
412
- # Logging
413
- "LoggingConfig",
414
- # Ngrok
415
- "NgrokConfig",
416
- "NgrokAuthConfig",
417
- "NgrokTunnelConfig",
418
- # Third-party integrations
419
- "RevolutionConfig",
420
- "APIZone",
421
- "UnfoldConfig",
422
- "UnfoldColors",
423
- "UnfoldSidebar",
424
- # Dashboard
425
- "DashboardConfig",
426
- "QuickAction",
427
- "NavigationItem",
428
- "NavigationGroup",
429
- # Environment
430
- "EnvironmentConfig",
431
- # LLM Configuration
432
- # LLM configs deprecated
433
- # Exceptions
434
- "DjangoCfgException",
435
- "ConfigurationError",
436
- "ValidationError",
437
- # Auto-configuring modules
438
- "DjangoLogger",
439
- "get_logger",
440
- "DjangoEmailService",
441
- "send_email",
442
- "DjangoTelegram",
443
- "send_telegram_message",
444
- "send_telegram_photo",
445
- # Twilio services
446
- "DjangoTwilioService",
447
- "send_whatsapp_otp",
448
- "send_email_otp",
449
- "send_sms_otp",
450
- "verify_otp",
451
- "DjangoLLM",
452
- "DjangoTranslator",
453
- "chat_completion",
454
- "translate_text",
455
- "translate_json",
456
- # Ngrok service
457
- "DjangoNgrok",
458
- "get_ngrok_service",
459
- "start_tunnel",
460
- "stop_tunnel",
461
- "get_tunnel_url",
462
- "get_webhook_url",
463
- "get_api_url",
464
- # Unfold admin interface
465
- "UnfoldConfig",
466
- "UnfoldTheme",
467
- "UnfoldColors",
468
- "UnfoldSidebar",
469
- "NavigationItem",
470
- "NavigationGroup",
471
- "DropdownItem",
472
- "QuickAction",
473
- "DashboardWidget",
474
- # DRF
475
- "DRFConfig",
476
- "SpectacularConfig",
477
- "SwaggerUISettings",
478
- "RedocUISettings",
479
- # Constance
480
- "ConstanceConfig",
481
- "ConstanceField",
482
- # LLM
483
- # LLM configs deprecated
484
- # URL integration
485
- "add_django_cfg_urls",
486
- "get_django_cfg_urls_info",
487
- ]
58
+ # Export all registered components
59
+ __all__ = list(DJANGO_CFG_REGISTRY.keys())
@@ -68,7 +68,7 @@ The accounts module provides a complete user authentication and management syste
68
68
 
69
69
  **Services**:
70
70
  - `OTPService`: Handles OTP generation, sending, and verification
71
- - `AccountNotifications`: Centralized email and telegram notifications for authentication events
71
+ - `AuthEmailService`: Email notifications for authentication events
72
72
 
73
73
  **Key Methods**:
74
74
  - `request_otp()`: Generates and sends OTP
@@ -181,7 +181,7 @@ user = OTPService.verify_otp("user@example.com", "123456")
181
181
 
182
182
  1. User submits email → `OTPRequestView` receives request
183
183
  2. `OTPService.request_otp()` generates OTP secret
184
- 3. Email sent via `AccountNotifications.send_otp_notification()`
184
+ 3. Email sent via `AuthEmailService.send_otp_email()`
185
185
  4. User receives email with OTP code
186
186
  5. User submits OTP → `OTPVerifyView` processes verification
187
187
  6. `OTPService.verify_otp()` validates and creates user
@@ -190,7 +190,7 @@ user = OTPService.verify_otp("user@example.com", "123456")
190
190
  **Modules**:
191
191
  - `@accounts/views.otp`
192
192
  - `@accounts/services.otp_service`
193
- - `@accounts/utils.notifications`
193
+ - `@accounts/utils.auth_email_service`
194
194
  - `@accounts/managers.user_manager`
195
195
 
196
196
  ---
@@ -7,7 +7,6 @@ from .otp import OTPSecretAdmin
7
7
  from .registration_source import RegistrationSourceAdmin, UserRegistrationSourceAdmin
8
8
  from .activity import UserActivityAdmin
9
9
  from .group import GroupAdmin
10
- from .twilio_response import TwilioResponseAdmin
11
10
 
12
11
  __all__ = [
13
12
  'CustomUserAdmin',
@@ -16,5 +15,4 @@ __all__ = [
16
15
  'UserRegistrationSourceAdmin',
17
16
  'UserActivityAdmin',
18
17
  'GroupAdmin',
19
- 'TwilioResponseAdmin',
20
18
  ]
@@ -6,21 +6,14 @@ from django.contrib import admin
6
6
  from django.utils.html import format_html
7
7
  from django.contrib.humanize.templatetags.humanize import naturaltime
8
8
  from unfold.admin import ModelAdmin
9
- from import_export.admin import ExportMixin
10
- from unfold.contrib.import_export.forms import ExportForm
11
9
 
12
10
  from ..models import UserActivity
13
11
  from .filters import ActivityTypeFilter
14
- from .resources import UserActivityResource
15
12
 
16
13
 
17
14
  @admin.register(UserActivity)
18
- class UserActivityAdmin(ModelAdmin, ExportMixin):
19
- """Enhanced admin for UserActivity model with export functionality."""
20
-
21
- # Export-only configuration
22
- resource_class = UserActivityResource
23
- export_form_class = ExportForm
15
+ class UserActivityAdmin(ModelAdmin):
16
+ """Enhanced admin for UserActivity model."""
24
17
 
25
18
  list_display = [
26
19
  'user_display',
@@ -4,7 +4,6 @@ Custom admin filters for Accounts app.
4
4
 
5
5
  from django.contrib import admin
6
6
  from django.utils import timezone
7
- from django.db import models
8
7
  from datetime import timedelta
9
8
 
10
9
 
@@ -97,44 +96,3 @@ class ActivityTypeFilter(admin.SimpleListFilter):
97
96
  elif self.value():
98
97
  return queryset.filter(activity_type=self.value())
99
98
  return queryset
100
-
101
-
102
- class TwilioResponseStatusFilter(admin.SimpleListFilter):
103
- title = "Response Status"
104
- parameter_name = "twilio_status"
105
-
106
- def lookups(self, request, model_admin):
107
- return (
108
- ("successful", "Successful"),
109
- ("error", "Has Error"),
110
- ("recent", "Recent (24h)"),
111
- )
112
-
113
- def queryset(self, request, queryset):
114
- now = timezone.now()
115
- if self.value() == "successful":
116
- return queryset.filter(error_code__isnull=True, error_message__isnull=True)
117
- elif self.value() == "error":
118
- return queryset.filter(
119
- models.Q(error_code__isnull=False) | models.Q(error_message__isnull=False)
120
- )
121
- elif self.value() == "recent":
122
- return queryset.filter(created_at__gte=now - timedelta(hours=24))
123
- return queryset
124
-
125
-
126
- class TwilioResponseTypeFilter(admin.SimpleListFilter):
127
- title = "Response Type"
128
- parameter_name = "twilio_response_type"
129
-
130
- def lookups(self, request, model_admin):
131
- return (
132
- ("sms", "SMS"),
133
- ("verification", "Verification"),
134
- ("call", "Call"),
135
- )
136
-
137
- def queryset(self, request, queryset):
138
- if self.value():
139
- return queryset.filter(response_type=self.value())
140
- return queryset
@@ -53,8 +53,8 @@ class UserEmailLogInline(TabularInline):
53
53
  # Check if newsletter app is available and enabled
54
54
  self.model = None
55
55
  try:
56
- from django_cfg.modules.base import BaseModule
57
- base_module = BaseModule()
56
+ from django_cfg.modules.base import BaseCfgModule
57
+ base_module = BaseCfgModule()
58
58
 
59
59
  # Only import if newsletter is enabled
60
60
  if base_module.is_newsletter_enabled():
@@ -86,8 +86,8 @@ class UserEmailLogInline(TabularInline):
86
86
  if not self.model:
87
87
  return False
88
88
  try:
89
- from django_cfg.modules.base import BaseModule
90
- base_module = BaseModule()
89
+ from django_cfg.modules.base import BaseCfgModule
90
+ base_module = BaseCfgModule()
91
91
  return base_module.is_newsletter_enabled()
92
92
  except Exception:
93
93
  return False
@@ -100,8 +100,8 @@ class UserSupportTicketsInline(TabularInline):
100
100
  # Check if support app is available and enabled
101
101
  self.model = None
102
102
  try:
103
- from django_cfg.modules.base import BaseModule
104
- base_module = BaseModule()
103
+ from django_cfg.modules.base import BaseCfgModule
104
+ base_module = BaseCfgModule()
105
105
 
106
106
  # Only import if support is enabled
107
107
  if base_module.is_support_enabled():
@@ -133,8 +133,8 @@ class UserSupportTicketsInline(TabularInline):
133
133
  if not self.model:
134
134
  return False
135
135
  try:
136
- from django_cfg.modules.base import BaseModule
137
- base_module = BaseModule()
136
+ from django_cfg.modules.base import BaseCfgModule
137
+ base_module = BaseCfgModule()
138
138
  return base_module.is_support_enabled()
139
139
  except Exception:
140
140
  return False
@@ -12,10 +12,10 @@ from .filters import OTPStatusFilter
12
12
 
13
13
  @admin.register(OTPSecret)
14
14
  class OTPSecretAdmin(ModelAdmin):
15
- list_display = ["recipient", "channel_type", "secret", "status", "created", "expires"]
16
- list_display_links = ["recipient", "secret"]
17
- list_filter = [OTPStatusFilter, "channel_type", "is_used", "created_at"]
18
- search_fields = ["recipient", "secret"]
15
+ list_display = ["email", "secret", "status", "created", "expires"]
16
+ list_display_links = ["email", "secret"]
17
+ list_filter = [OTPStatusFilter, "is_used", "created_at"]
18
+ search_fields = ["email", "secret"]
19
19
  readonly_fields = ["created_at", "expires_at"]
20
20
  ordering = ["-created_at"]
21
21
 
@@ -23,7 +23,7 @@ class OTPSecretAdmin(ModelAdmin):
23
23
  (
24
24
  "OTP Details",
25
25
  {
26
- "fields": ("channel_type", "recipient", "secret", "is_used"),
26
+ "fields": ("email", "secret", "is_used"),
27
27
  },
28
28
  ),
29
29
  (