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.
- 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 +444 -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 +79 -17
- 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/templates/guide.md +266 -0
- 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.81.dist-info → django_cfg-1.2.0.dist-info}/METADATA +83 -86
- django_cfg-1.2.0.dist-info/RECORD +441 -0
- django_cfg/apps/tasks/@docs/README.md +0 -195
- 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.81.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.81.dist-info → django_cfg-1.2.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.1.81.dist-info → django_cfg-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,318 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Dashboard Manager for Django CFG Unfold
|
3
|
-
|
4
|
-
Manages dashboard configuration, widgets, and navigation
|
5
|
-
based on the working configuration from the old version.
|
6
|
-
"""
|
7
|
-
|
8
|
-
from typing import List, Dict, Any, Optional
|
9
|
-
from django.templatetags.static import static
|
10
|
-
from django.urls import reverse_lazy
|
11
|
-
from ..base import BaseModule
|
12
|
-
|
13
|
-
|
14
|
-
class DashboardManager(BaseModule):
|
15
|
-
"""
|
16
|
-
Dashboard configuration manager for Unfold.
|
17
|
-
|
18
|
-
Based on the working configuration from @old/api__old/api/dashboard/unfold_config.py
|
19
|
-
"""
|
20
|
-
|
21
|
-
def __init__(self):
|
22
|
-
"""Initialize dashboard manager."""
|
23
|
-
super().__init__()
|
24
|
-
self.config = self.get_config()
|
25
|
-
|
26
|
-
def get_navigation_config(self) -> List[Dict[str, Any]]:
|
27
|
-
"""Get complete default navigation configuration for Unfold sidebar."""
|
28
|
-
navigation = [
|
29
|
-
{
|
30
|
-
"title": "Dashboard",
|
31
|
-
"separator": True,
|
32
|
-
"collapsible": True,
|
33
|
-
"items": [
|
34
|
-
{
|
35
|
-
"title": "Overview",
|
36
|
-
"icon": "dashboard",
|
37
|
-
"link": "/admin/",
|
38
|
-
},
|
39
|
-
{
|
40
|
-
"title": "Settings",
|
41
|
-
"icon": "settings",
|
42
|
-
"link": '/admin/constance/config/',
|
43
|
-
},
|
44
|
-
{
|
45
|
-
"title": "Health Check",
|
46
|
-
"icon": "health_and_safety",
|
47
|
-
"link": "/cfg/health/",
|
48
|
-
},
|
49
|
-
],
|
50
|
-
},
|
51
|
-
]
|
52
|
-
|
53
|
-
# Add Accounts section if enabled
|
54
|
-
if self.is_accounts_enabled():
|
55
|
-
navigation.append({
|
56
|
-
"title": "Users & Access",
|
57
|
-
"separator": True,
|
58
|
-
"collapsible": True,
|
59
|
-
"items": [
|
60
|
-
{
|
61
|
-
"title": "Users",
|
62
|
-
"icon": "people",
|
63
|
-
"link": "/admin/django_cfg_accounts/customuser/",
|
64
|
-
},
|
65
|
-
|
66
|
-
{
|
67
|
-
"title": "User Groups",
|
68
|
-
"icon": "group",
|
69
|
-
"link": "/admin/auth/group/",
|
70
|
-
},
|
71
|
-
{
|
72
|
-
"title": "Registration Sources",
|
73
|
-
"icon": "link",
|
74
|
-
"link": "/admin/django_cfg_accounts/registrationsource/",
|
75
|
-
},
|
76
|
-
{
|
77
|
-
"title": "User Registration Sources",
|
78
|
-
"icon": "person",
|
79
|
-
"link": "/admin/django_cfg_accounts/userregistrationsource/",
|
80
|
-
},
|
81
|
-
]
|
82
|
-
})
|
83
|
-
|
84
|
-
# Add Support section if enabled
|
85
|
-
if self.is_support_enabled():
|
86
|
-
navigation.append({
|
87
|
-
"title": "Support",
|
88
|
-
"separator": True,
|
89
|
-
"collapsible": True,
|
90
|
-
"items": [
|
91
|
-
{
|
92
|
-
"title": "Tickets",
|
93
|
-
"icon": "support_agent",
|
94
|
-
"link": "/admin/django_cfg_support/ticket/",
|
95
|
-
},
|
96
|
-
{
|
97
|
-
"title": "Messages",
|
98
|
-
"icon": "chat",
|
99
|
-
"link": "/admin/django_cfg_support/message/",
|
100
|
-
},
|
101
|
-
]
|
102
|
-
})
|
103
|
-
|
104
|
-
# Add Newsletter section if enabled
|
105
|
-
if self.is_newsletter_enabled():
|
106
|
-
navigation.append({
|
107
|
-
"title": "Newsletter",
|
108
|
-
"separator": True,
|
109
|
-
"collapsible": True,
|
110
|
-
"items": [
|
111
|
-
{
|
112
|
-
"title": "Newsletters",
|
113
|
-
"icon": "email",
|
114
|
-
"link": "/admin/django_cfg_newsletter/newsletter/",
|
115
|
-
},
|
116
|
-
{
|
117
|
-
"title": "Subscriptions",
|
118
|
-
"icon": "person_add",
|
119
|
-
"link": "/admin/django_cfg_newsletter/newslettersubscription/",
|
120
|
-
},
|
121
|
-
{
|
122
|
-
"title": "Campaigns",
|
123
|
-
"icon": "campaign",
|
124
|
-
"link": "/admin/django_cfg_newsletter/newslettercampaign/",
|
125
|
-
},
|
126
|
-
{
|
127
|
-
"title": "Email Logs",
|
128
|
-
"icon": "mail_outline",
|
129
|
-
"link": "/admin/django_cfg_newsletter/emaillog/",
|
130
|
-
},
|
131
|
-
]
|
132
|
-
})
|
133
|
-
|
134
|
-
# Add Leads section if enabled
|
135
|
-
if self.is_leads_enabled():
|
136
|
-
navigation.append({
|
137
|
-
"title": "Leads",
|
138
|
-
"separator": True,
|
139
|
-
"collapsible": True,
|
140
|
-
"items": [
|
141
|
-
{
|
142
|
-
"title": "Leads",
|
143
|
-
"icon": "contact_page",
|
144
|
-
"link": "/admin/django_cfg_leads/lead/",
|
145
|
-
},
|
146
|
-
]
|
147
|
-
})
|
148
|
-
|
149
|
-
# Add Dramatiq section if enabled
|
150
|
-
if self.is_tasks_enabled():
|
151
|
-
navigation.append({
|
152
|
-
"title": "Background Tasks",
|
153
|
-
"separator": True,
|
154
|
-
"collapsible": True,
|
155
|
-
"items": [
|
156
|
-
{
|
157
|
-
"title": "Queue Dashboard",
|
158
|
-
"icon": "dashboard",
|
159
|
-
"link": "/cfg/tasks/dashboard/",
|
160
|
-
"description": "Interactive queue management and monitoring",
|
161
|
-
},
|
162
|
-
{
|
163
|
-
"title": "Task History",
|
164
|
-
"icon": "history",
|
165
|
-
"link": "/admin/django_dramatiq/task/",
|
166
|
-
"description": "View task execution history and details",
|
167
|
-
},
|
168
|
-
]
|
169
|
-
})
|
170
|
-
|
171
|
-
return navigation
|
172
|
-
|
173
|
-
def _get_reverse_lazy(self, link: str) -> str:
|
174
|
-
"""Safe reverse with fallback."""
|
175
|
-
try:
|
176
|
-
from django.urls import reverse
|
177
|
-
return reverse(link)
|
178
|
-
except Exception:
|
179
|
-
return link
|
180
|
-
|
181
|
-
|
182
|
-
def _get_user_admin_url(self) -> str:
|
183
|
-
"""Get admin changelist URL for the current AUTH_USER_MODEL."""
|
184
|
-
try:
|
185
|
-
from django.contrib.auth import get_user_model
|
186
|
-
User = get_user_model()
|
187
|
-
app_label = User._meta.app_label
|
188
|
-
model_name = User._meta.model_name
|
189
|
-
# Return string URL, not reverse_lazy object
|
190
|
-
return f'/admin/{app_label}/{model_name}/'
|
191
|
-
except Exception:
|
192
|
-
# Universal fallback - return admin index instead of hardcoded model
|
193
|
-
return '/admin/'
|
194
|
-
|
195
|
-
def get_unfold_config(self) -> Dict[str, Any]:
|
196
|
-
"""Get complete Unfold configuration based on working old version."""
|
197
|
-
return {
|
198
|
-
# Site branding and appearance
|
199
|
-
"SITE_TITLE": "Admin",
|
200
|
-
"SITE_HEADER": "Admin",
|
201
|
-
"SITE_SUBHEADER": "",
|
202
|
-
"SITE_URL": "/",
|
203
|
-
"SITE_SYMBOL": "dashboard",
|
204
|
-
|
205
|
-
# UI visibility controls
|
206
|
-
"SHOW_HISTORY": True,
|
207
|
-
"SHOW_VIEW_ON_SITE": True,
|
208
|
-
"SHOW_BACK_BUTTON": False,
|
209
|
-
|
210
|
-
# Dashboard callback
|
211
|
-
"DASHBOARD_CALLBACK": "api.dashboard.callbacks.main_dashboard_callback",
|
212
|
-
|
213
|
-
# Theme configuration
|
214
|
-
"THEME": None, # Auto-detect or force "dark"/"light"
|
215
|
-
|
216
|
-
# Login page customization
|
217
|
-
"LOGIN": {
|
218
|
-
"redirect_after": lambda request: "/admin/",
|
219
|
-
},
|
220
|
-
|
221
|
-
# Design system
|
222
|
-
"BORDER_RADIUS": "8px",
|
223
|
-
"COLORS": {
|
224
|
-
"base": {
|
225
|
-
"50": "249, 250, 251",
|
226
|
-
"100": "243, 244, 246",
|
227
|
-
"200": "229, 231, 235",
|
228
|
-
"300": "209, 213, 219",
|
229
|
-
"400": "156, 163, 175",
|
230
|
-
"500": "107, 114, 128",
|
231
|
-
"600": "75, 85, 99",
|
232
|
-
"700": "55, 65, 81",
|
233
|
-
"800": "31, 41, 55",
|
234
|
-
"900": "17, 24, 39",
|
235
|
-
"950": "3, 7, 18",
|
236
|
-
},
|
237
|
-
"primary": {
|
238
|
-
"50": "239, 246, 255",
|
239
|
-
"100": "219, 234, 254",
|
240
|
-
"200": "191, 219, 254",
|
241
|
-
"300": "147, 197, 253",
|
242
|
-
"400": "96, 165, 250",
|
243
|
-
"500": "59, 130, 246",
|
244
|
-
"600": "37, 99, 235",
|
245
|
-
"700": "29, 78, 216",
|
246
|
-
"800": "30, 64, 175",
|
247
|
-
"900": "30, 58, 138",
|
248
|
-
"950": "23, 37, 84",
|
249
|
-
},
|
250
|
-
"font": {
|
251
|
-
"subtle-light": "var(--color-base-500)",
|
252
|
-
"subtle-dark": "var(--color-base-400)",
|
253
|
-
"default-light": "var(--color-base-600)",
|
254
|
-
"default-dark": "var(--color-base-300)",
|
255
|
-
"important-light": "var(--color-base-900)",
|
256
|
-
"important-dark": "var(--color-base-100)",
|
257
|
-
},
|
258
|
-
},
|
259
|
-
|
260
|
-
# Sidebar navigation - KEY STRUCTURE!
|
261
|
-
"SIDEBAR": {
|
262
|
-
"show_search": True,
|
263
|
-
"command_search": True,
|
264
|
-
"show_all_applications": True,
|
265
|
-
"navigation": self.get_navigation_config(),
|
266
|
-
},
|
267
|
-
|
268
|
-
# Site dropdown menu - moved to top level
|
269
|
-
"SITE_DROPDOWN": [
|
270
|
-
# {
|
271
|
-
# "icon": "language",
|
272
|
-
# "title": "Documentation",
|
273
|
-
# "link": "https://docs.carapis.com",
|
274
|
-
# },
|
275
|
-
],
|
276
|
-
|
277
|
-
# Command interface
|
278
|
-
"COMMAND": {
|
279
|
-
"search_models": True,
|
280
|
-
"show_history": True,
|
281
|
-
},
|
282
|
-
|
283
|
-
# Multi-language support - DISABLED
|
284
|
-
"SHOW_LANGUAGES": False,
|
285
|
-
}
|
286
|
-
|
287
|
-
def get_widgets_config(self) -> List[Dict[str, Any]]:
|
288
|
-
"""Get dashboard widgets configuration."""
|
289
|
-
return [
|
290
|
-
{
|
291
|
-
"type": "stats_cards",
|
292
|
-
"title": "System Overview",
|
293
|
-
"cards": [
|
294
|
-
{
|
295
|
-
"title": "CPU Usage",
|
296
|
-
"value_template": "{{ cpu_percent }}%",
|
297
|
-
"icon": "memory",
|
298
|
-
"color": "blue",
|
299
|
-
},
|
300
|
-
{
|
301
|
-
"title": "Memory Usage",
|
302
|
-
"value_template": "{{ memory_percent }}%",
|
303
|
-
"icon": "storage",
|
304
|
-
"color": "green",
|
305
|
-
},
|
306
|
-
{
|
307
|
-
"title": "Disk Usage",
|
308
|
-
"value_template": "{{ disk_percent }}%",
|
309
|
-
"icon": "folder",
|
310
|
-
"color": "orange",
|
311
|
-
},
|
312
|
-
]
|
313
|
-
},
|
314
|
-
]
|
315
|
-
|
316
|
-
|
317
|
-
# Create global instance for easy import
|
318
|
-
dashboard_manager = DashboardManager()
|
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
|
-
|