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
@@ -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
-