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/__init__.py
CHANGED
@@ -13,12 +13,12 @@ Key Features:
|
|
13
13
|
|
14
14
|
Example:
|
15
15
|
```python
|
16
|
-
from django_cfg import DjangoConfig,
|
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,
|
21
|
-
"default":
|
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
|
42
|
-
__author__ = "Unrealos Team"
|
43
|
-
__email__ = "info@unrealos.com"
|
35
|
+
__version__ = "1.2.1"
|
44
36
|
__license__ = "MIT"
|
45
37
|
|
46
|
-
#
|
47
|
-
|
48
|
-
|
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
|
-
|
65
|
-
|
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
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
return
|
78
|
-
|
79
|
-
|
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
|
-
#
|
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
|
-
- `
|
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 `
|
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.
|
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
|
19
|
-
"""Enhanced admin for UserActivity model
|
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
|
57
|
-
base_module =
|
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
|
90
|
-
base_module =
|
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
|
104
|
-
base_module =
|
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
|
137
|
-
base_module =
|
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 = ["
|
16
|
-
list_display_links = ["
|
17
|
-
list_filter = [OTPStatusFilter, "
|
18
|
-
search_fields = ["
|
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": ("
|
26
|
+
"fields": ("email", "secret", "is_used"),
|
27
27
|
},
|
28
28
|
),
|
29
29
|
(
|