django-cfg 1.2.31__py3-none-any.whl → 1.3.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.
Files changed (256) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/api/health/views.py +4 -2
  3. django_cfg/apps/knowbase/config/settings.py +16 -15
  4. django_cfg/apps/payments/README.md +326 -0
  5. django_cfg/apps/payments/admin/__init__.py +20 -10
  6. django_cfg/apps/payments/admin/api_keys_admin.py +521 -237
  7. django_cfg/apps/payments/admin/balance_admin.py +592 -297
  8. django_cfg/apps/payments/admin/currencies_admin.py +526 -222
  9. django_cfg/apps/payments/admin/filters.py +306 -199
  10. django_cfg/apps/payments/admin/payments_admin.py +465 -70
  11. django_cfg/apps/payments/admin/subscriptions_admin.py +578 -128
  12. django_cfg/apps/payments/admin_interface/__init__.py +18 -0
  13. django_cfg/apps/payments/admin_interface/templates/payments/base.html +162 -0
  14. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +38 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/components/loading_spinner.html +16 -0
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/notification.html +27 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_card.html +86 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +39 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/currency_converter.html +382 -0
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +300 -0
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +303 -0
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +382 -0
  23. django_cfg/apps/payments/admin_interface/templates/payments/payment_status.html +500 -0
  24. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +594 -0
  25. django_cfg/apps/payments/admin_interface/views/__init__.py +23 -0
  26. django_cfg/apps/payments/admin_interface/views/payment_views.py +259 -0
  27. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +37 -0
  28. django_cfg/apps/payments/apps.py +34 -9
  29. django_cfg/apps/payments/config/__init__.py +28 -51
  30. django_cfg/apps/payments/config/constance/__init__.py +22 -0
  31. django_cfg/apps/payments/config/constance/config_service.py +123 -0
  32. django_cfg/apps/payments/config/constance/fields.py +69 -0
  33. django_cfg/apps/payments/config/constance/settings.py +160 -0
  34. django_cfg/apps/payments/config/django_cfg_integration.py +202 -0
  35. django_cfg/apps/payments/config/helpers.py +130 -0
  36. django_cfg/apps/payments/management/__init__.py +1 -3
  37. django_cfg/apps/payments/management/commands/__init__.py +1 -3
  38. django_cfg/apps/payments/management/commands/manage_currencies.py +303 -151
  39. django_cfg/apps/payments/management/commands/manage_providers.py +333 -160
  40. django_cfg/apps/payments/middleware/__init__.py +3 -1
  41. django_cfg/apps/payments/middleware/api_access.py +329 -222
  42. django_cfg/apps/payments/middleware/rate_limiting.py +342 -152
  43. django_cfg/apps/payments/middleware/usage_tracking.py +249 -240
  44. django_cfg/apps/payments/migrations/0001_initial.py +708 -536
  45. django_cfg/apps/payments/models/__init__.py +13 -18
  46. django_cfg/apps/payments/models/api_keys.py +121 -43
  47. django_cfg/apps/payments/models/balance.py +150 -115
  48. django_cfg/apps/payments/models/base.py +68 -15
  49. django_cfg/apps/payments/models/currencies.py +172 -148
  50. django_cfg/apps/payments/models/managers/__init__.py +44 -0
  51. django_cfg/apps/payments/models/managers/api_key_managers.py +329 -0
  52. django_cfg/apps/payments/models/managers/balance_managers.py +599 -0
  53. django_cfg/apps/payments/models/managers/currency_managers.py +385 -0
  54. django_cfg/apps/payments/models/managers/payment_managers.py +511 -0
  55. django_cfg/apps/payments/models/managers/subscription_managers.py +641 -0
  56. django_cfg/apps/payments/models/payments.py +235 -285
  57. django_cfg/apps/payments/models/subscriptions.py +257 -177
  58. django_cfg/apps/payments/models/tariffs.py +147 -40
  59. django_cfg/apps/payments/services/__init__.py +209 -56
  60. django_cfg/apps/payments/services/cache/__init__.py +6 -6
  61. django_cfg/apps/payments/services/cache/{simple_cache.py → cache_service.py} +112 -12
  62. django_cfg/apps/payments/services/core/__init__.py +10 -6
  63. django_cfg/apps/payments/services/core/balance_service.py +435 -360
  64. django_cfg/apps/payments/services/core/base.py +166 -0
  65. django_cfg/apps/payments/services/core/currency_service.py +478 -0
  66. django_cfg/apps/payments/services/core/payment_service.py +346 -467
  67. django_cfg/apps/payments/services/core/subscription_service.py +425 -481
  68. django_cfg/apps/payments/services/core/webhook_service.py +410 -0
  69. django_cfg/apps/payments/services/integrations/__init__.py +29 -0
  70. django_cfg/apps/payments/services/integrations/ngrok_service.py +47 -0
  71. django_cfg/apps/payments/services/integrations/providers_config.py +107 -0
  72. django_cfg/apps/payments/services/providers/__init__.py +9 -14
  73. django_cfg/apps/payments/services/providers/base.py +234 -174
  74. django_cfg/apps/payments/services/providers/nowpayments.py +478 -0
  75. django_cfg/apps/payments/services/providers/registry.py +367 -301
  76. django_cfg/apps/payments/services/types/__init__.py +78 -0
  77. django_cfg/apps/payments/services/types/data.py +177 -0
  78. django_cfg/apps/payments/services/types/requests.py +150 -0
  79. django_cfg/apps/payments/services/types/responses.py +156 -0
  80. django_cfg/apps/payments/services/types/webhooks.py +232 -0
  81. django_cfg/apps/payments/signals/__init__.py +33 -8
  82. django_cfg/apps/payments/signals/api_key_signals.py +210 -129
  83. django_cfg/apps/payments/signals/balance_signals.py +174 -0
  84. django_cfg/apps/payments/signals/payment_signals.py +128 -103
  85. django_cfg/apps/payments/signals/subscription_signals.py +194 -142
  86. django_cfg/apps/payments/static/payments/css/components.css +380 -0
  87. django_cfg/apps/payments/static/payments/css/dashboard.css +188 -0
  88. django_cfg/apps/payments/static/payments/js/components.js +545 -0
  89. django_cfg/apps/payments/static/payments/js/utils.js +412 -0
  90. django_cfg/apps/payments/templatetags/__init__.py +1 -1
  91. django_cfg/apps/payments/templatetags/payment_tags.py +466 -0
  92. django_cfg/apps/payments/urls.py +45 -48
  93. django_cfg/apps/payments/urls_admin.py +33 -42
  94. django_cfg/apps/payments/views/api/__init__.py +101 -0
  95. django_cfg/apps/payments/views/api/api_keys.py +387 -0
  96. django_cfg/apps/payments/views/api/balances.py +381 -0
  97. django_cfg/apps/payments/views/api/base.py +298 -0
  98. django_cfg/apps/payments/views/api/currencies.py +402 -0
  99. django_cfg/apps/payments/views/api/payments.py +415 -0
  100. django_cfg/apps/payments/views/api/subscriptions.py +475 -0
  101. django_cfg/apps/payments/views/api/webhooks.py +476 -0
  102. django_cfg/apps/payments/views/serializers/__init__.py +99 -0
  103. django_cfg/apps/payments/views/serializers/api_keys.py +424 -0
  104. django_cfg/apps/payments/views/serializers/balances.py +300 -0
  105. django_cfg/apps/payments/views/serializers/currencies.py +335 -0
  106. django_cfg/apps/payments/views/serializers/payments.py +387 -0
  107. django_cfg/apps/payments/views/serializers/subscriptions.py +429 -0
  108. django_cfg/apps/payments/views/serializers/webhooks.py +137 -0
  109. django_cfg/config.py +1 -1
  110. django_cfg/core/config.py +40 -4
  111. django_cfg/core/generation.py +25 -4
  112. django_cfg/core/integration/README.md +363 -0
  113. django_cfg/core/integration/__init__.py +47 -0
  114. django_cfg/core/integration/commands_collector.py +239 -0
  115. django_cfg/core/integration/display/__init__.py +15 -0
  116. django_cfg/core/integration/display/base.py +157 -0
  117. django_cfg/core/integration/display/ngrok.py +164 -0
  118. django_cfg/core/integration/display/startup.py +815 -0
  119. django_cfg/core/integration/url_integration.py +123 -0
  120. django_cfg/core/integration/version_checker.py +160 -0
  121. django_cfg/management/commands/auto_generate.py +4 -0
  122. django_cfg/management/commands/check_settings.py +6 -0
  123. django_cfg/management/commands/clear_constance.py +5 -2
  124. django_cfg/management/commands/create_token.py +6 -0
  125. django_cfg/management/commands/list_urls.py +6 -0
  126. django_cfg/management/commands/migrate_all.py +6 -0
  127. django_cfg/management/commands/migrator.py +3 -0
  128. django_cfg/management/commands/rundramatiq.py +6 -0
  129. django_cfg/management/commands/runserver_ngrok.py +51 -29
  130. django_cfg/management/commands/script.py +6 -0
  131. django_cfg/management/commands/show_config.py +12 -2
  132. django_cfg/management/commands/show_urls.py +4 -0
  133. django_cfg/management/commands/superuser.py +6 -0
  134. django_cfg/management/commands/task_clear.py +4 -1
  135. django_cfg/management/commands/task_status.py +3 -1
  136. django_cfg/management/commands/test_email.py +3 -0
  137. django_cfg/management/commands/test_telegram.py +6 -0
  138. django_cfg/management/commands/test_twilio.py +6 -0
  139. django_cfg/management/commands/tree.py +6 -0
  140. django_cfg/management/commands/validate_config.py +155 -149
  141. django_cfg/models/constance.py +31 -11
  142. django_cfg/models/payments.py +175 -492
  143. django_cfg/modules/django_logger.py +160 -146
  144. django_cfg/modules/django_unfold/dashboard.py +64 -16
  145. django_cfg/registry/core.py +1 -0
  146. django_cfg/template_archive/django_sample.zip +0 -0
  147. django_cfg/utils/smart_defaults.py +222 -571
  148. django_cfg/utils/toolkit.py +51 -11
  149. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/METADATA +4 -1
  150. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/RECORD +153 -185
  151. django_cfg/apps/payments/__init__.py +0 -8
  152. django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
  153. django_cfg/apps/payments/config/module.py +0 -70
  154. django_cfg/apps/payments/config/providers.py +0 -105
  155. django_cfg/apps/payments/config/settings.py +0 -96
  156. django_cfg/apps/payments/config/utils.py +0 -52
  157. django_cfg/apps/payments/decorators.py +0 -291
  158. django_cfg/apps/payments/management/commands/README.md +0 -146
  159. django_cfg/apps/payments/management/commands/currency_stats.py +0 -304
  160. django_cfg/apps/payments/managers/__init__.py +0 -23
  161. django_cfg/apps/payments/managers/api_key_manager.py +0 -35
  162. django_cfg/apps/payments/managers/balance_manager.py +0 -361
  163. django_cfg/apps/payments/managers/currency_manager.py +0 -306
  164. django_cfg/apps/payments/managers/payment_manager.py +0 -192
  165. django_cfg/apps/payments/managers/subscription_manager.py +0 -37
  166. django_cfg/apps/payments/managers/tariff_manager.py +0 -29
  167. django_cfg/apps/payments/migrations/0002_network_providercurrency_and_more.py +0 -241
  168. django_cfg/apps/payments/migrations/0003_add_usd_rate_cache.py +0 -30
  169. django_cfg/apps/payments/models/events.py +0 -73
  170. django_cfg/apps/payments/serializers/__init__.py +0 -57
  171. django_cfg/apps/payments/serializers/api_keys.py +0 -51
  172. django_cfg/apps/payments/serializers/balance.py +0 -59
  173. django_cfg/apps/payments/serializers/currencies.py +0 -63
  174. django_cfg/apps/payments/serializers/payments.py +0 -62
  175. django_cfg/apps/payments/serializers/subscriptions.py +0 -71
  176. django_cfg/apps/payments/serializers/tariffs.py +0 -56
  177. django_cfg/apps/payments/services/billing/__init__.py +0 -8
  178. django_cfg/apps/payments/services/cache/base.py +0 -30
  179. django_cfg/apps/payments/services/core/fallback_service.py +0 -432
  180. django_cfg/apps/payments/services/internal_types.py +0 -461
  181. django_cfg/apps/payments/services/middleware/__init__.py +0 -8
  182. django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
  183. django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -76
  184. django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
  185. django_cfg/apps/payments/services/providers/cryptapi/__init__.py +0 -4
  186. django_cfg/apps/payments/services/providers/cryptapi/config.py +0 -8
  187. django_cfg/apps/payments/services/providers/cryptapi/models.py +0 -192
  188. django_cfg/apps/payments/services/providers/cryptapi/provider.py +0 -439
  189. django_cfg/apps/payments/services/providers/cryptomus/__init__.py +0 -4
  190. django_cfg/apps/payments/services/providers/cryptomus/models.py +0 -176
  191. django_cfg/apps/payments/services/providers/cryptomus/provider.py +0 -429
  192. django_cfg/apps/payments/services/providers/cryptomus/provider_v2.py +0 -564
  193. django_cfg/apps/payments/services/providers/models/__init__.py +0 -34
  194. django_cfg/apps/payments/services/providers/models/currencies.py +0 -190
  195. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +0 -4
  196. django_cfg/apps/payments/services/providers/nowpayments/models.py +0 -196
  197. django_cfg/apps/payments/services/providers/nowpayments/provider.py +0 -380
  198. django_cfg/apps/payments/services/providers/stripe/__init__.py +0 -4
  199. django_cfg/apps/payments/services/providers/stripe/models.py +0 -184
  200. django_cfg/apps/payments/services/providers/stripe/provider.py +0 -109
  201. django_cfg/apps/payments/services/security/__init__.py +0 -34
  202. django_cfg/apps/payments/services/security/error_handler.py +0 -635
  203. django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
  204. django_cfg/apps/payments/services/security/webhook_validator.py +0 -474
  205. django_cfg/apps/payments/static/payments/css/payments.css +0 -340
  206. django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
  207. django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
  208. django_cfg/apps/payments/static/payments/js/theme.js +0 -86
  209. django_cfg/apps/payments/tasks/__init__.py +0 -12
  210. django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
  211. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +0 -50
  212. django_cfg/apps/payments/templates/payments/base.html +0 -182
  213. django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
  214. django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
  215. django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -43
  216. django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
  217. django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -34
  218. django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -148
  219. django_cfg/apps/payments/templates/payments/dashboard.html +0 -258
  220. django_cfg/apps/payments/templates/payments/dashboard_simple_test.html +0 -35
  221. django_cfg/apps/payments/templates/payments/payment_create.html +0 -579
  222. django_cfg/apps/payments/templates/payments/payment_detail.html +0 -373
  223. django_cfg/apps/payments/templates/payments/payment_list.html +0 -354
  224. django_cfg/apps/payments/templates/payments/stats.html +0 -261
  225. django_cfg/apps/payments/templates/payments/test.html +0 -213
  226. django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
  227. django_cfg/apps/payments/utils/__init__.py +0 -43
  228. django_cfg/apps/payments/utils/billing_utils.py +0 -342
  229. django_cfg/apps/payments/utils/config_utils.py +0 -239
  230. django_cfg/apps/payments/utils/middleware_utils.py +0 -228
  231. django_cfg/apps/payments/utils/validation_utils.py +0 -94
  232. django_cfg/apps/payments/views/__init__.py +0 -63
  233. django_cfg/apps/payments/views/api_key_views.py +0 -164
  234. django_cfg/apps/payments/views/balance_views.py +0 -75
  235. django_cfg/apps/payments/views/currency_views.py +0 -122
  236. django_cfg/apps/payments/views/payment_views.py +0 -149
  237. django_cfg/apps/payments/views/subscription_views.py +0 -135
  238. django_cfg/apps/payments/views/tariff_views.py +0 -131
  239. django_cfg/apps/payments/views/templates/__init__.py +0 -25
  240. django_cfg/apps/payments/views/templates/ajax.py +0 -451
  241. django_cfg/apps/payments/views/templates/base.py +0 -212
  242. django_cfg/apps/payments/views/templates/dashboard.py +0 -60
  243. django_cfg/apps/payments/views/templates/payment_detail.py +0 -102
  244. django_cfg/apps/payments/views/templates/payment_management.py +0 -158
  245. django_cfg/apps/payments/views/templates/qr_code.py +0 -174
  246. django_cfg/apps/payments/views/templates/stats.py +0 -244
  247. django_cfg/apps/payments/views/templates/utils.py +0 -181
  248. django_cfg/apps/payments/views/webhook_views.py +0 -266
  249. django_cfg/apps/payments/viewsets.py +0 -66
  250. django_cfg/core/integration.py +0 -160
  251. django_cfg/template_archive/.gitignore +0 -1
  252. django_cfg/template_archive/__init__.py +0 -0
  253. django_cfg/urls.py +0 -33
  254. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
  255. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
  256. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,363 @@
1
+ # Django CFG Integration System
2
+
3
+ Modern, class-based integration system with configurable startup information display and modular architecture.
4
+
5
+ ## Overview
6
+
7
+ The Django CFG integration system provides comprehensive startup information display with three configurable modes controlled by `DjangoConfig.startup_info_mode`:
8
+
9
+ - **`NONE`**: Minimal info only (version, environment, critical updates)
10
+ - **`SHORT`**: Essential info (apps, endpoints, status, updates)
11
+ - **`FULL`**: Complete info (comprehensive system overview)
12
+
13
+ ## Architecture
14
+
15
+ ### Class-Based Display System
16
+
17
+ ```
18
+ integration/
19
+ ├── __init__.py # Main exports and entry points
20
+ ├── display/ # Modular display system
21
+ │ ├── __init__.py # Display system exports
22
+ │ ├── base.py # BaseDisplayManager with common utilities
23
+ │ ├── startup.py # StartupDisplayManager for main info
24
+ │ └── ngrok.py # NgrokDisplayManager for tunnel info
25
+ ├── commands_collector.py # Management commands collection
26
+ ├── version_checker.py # Version checking with cachetools
27
+ ├── url_integration.py # URL registration system
28
+ └── README.md # This documentation
29
+ ```
30
+
31
+ ### Display Managers
32
+
33
+ #### `BaseDisplayManager`
34
+ - **Purpose**: Common utilities and base functionality
35
+ - **Features**:
36
+ - Rich console integration
37
+ - Panel creation with consistent styling
38
+ - Table creation and formatting
39
+ - Two-column layout utilities
40
+ - Full-width panel support
41
+ - URL generation helpers
42
+
43
+ #### `StartupDisplayManager`
44
+ - **Purpose**: Main startup information display
45
+ - **Features**:
46
+ - Configurable display modes (NONE/SHORT/FULL)
47
+ - Django CFG configuration panel
48
+ - Apps and endpoints overview
49
+ - Constance fields integration
50
+ - Management commands breakdown
51
+ - Background tasks status
52
+ - Update notifications
53
+
54
+ #### `NgrokDisplayManager`
55
+ - **Purpose**: Ngrok tunnel information display
56
+ - **Features**:
57
+ - Tunnel status and configuration
58
+ - Active tunnel information
59
+ - Configuration validation
60
+ - Usage instructions
61
+
62
+ ## Configuration
63
+
64
+ ### In your DjangoConfig:
65
+
66
+ ```python
67
+ from django_cfg.core.config import DjangoConfig, StartupInfoMode
68
+
69
+ class MyProjectConfig(DjangoConfig):
70
+ project_name: str = "My Project"
71
+
72
+ # Control startup information display
73
+ startup_info_mode: StartupInfoMode = StartupInfoMode.FULL # Default
74
+
75
+ # ... other config
76
+ ```
77
+
78
+ ### Environment Variables:
79
+
80
+ ```bash
81
+ # Control via environment variable
82
+ DJANGO_STARTUP_INFO_MODE=none # Minimal
83
+ DJANGO_STARTUP_INFO_MODE=short # Essential
84
+ DJANGO_STARTUP_INFO_MODE=full # Complete (default)
85
+ ```
86
+
87
+ ## Display Modes
88
+
89
+ ### 🔴 NONE Mode
90
+ **Perfect for**: Production, CI/CD, Docker containers
91
+
92
+ **Shows**:
93
+ ```
94
+ 🚀 Django CFG v1.2.30 • production • My Project • 🚨 UPDATE AVAILABLE
95
+ ```
96
+
97
+ **Features**:
98
+ - Single line output
99
+ - Critical information only
100
+ - Update notifications
101
+ - Minimal resource usage
102
+
103
+ ### 🟡 SHORT Mode
104
+ **Perfect for**: Development, staging, quick checks
105
+
106
+ **Shows**:
107
+ - Compact header with version and environment
108
+ - Apps grid (up to 8 apps)
109
+ - Essential endpoints (up to 6)
110
+ - System status metrics
111
+ - Update notifications
112
+ - Commands summary
113
+
114
+ **Layout**: Horizontal columns, space-efficient
115
+
116
+ ### 🟢 FULL Mode
117
+ **Perfect for**: Development, debugging, system analysis
118
+
119
+ **Shows**: **COMPREHENSIVE SYSTEM OVERVIEW**
120
+
121
+ #### Main Panels (Full Width):
122
+ - **Django CFG Configuration**: Version, environment, project info, health URL
123
+ - **Update Available**: Version comparison and upgrade instructions
124
+ - **Background Tasks**: Dramatiq status, queue info, worker commands
125
+ - **Constance Fields Summary**: Dynamic settings breakdown by source
126
+ - **Management Commands**: Core, app, and project commands overview
127
+
128
+ #### Two-Column Layouts (50/50):
129
+ - **Apps & Endpoints**: Enabled apps | API endpoints
130
+ - **Payments & Configuration**: Payment status | System config
131
+ - **Core & App Commands**: Django-CFG commands | App-specific commands
132
+ - **General & Blog Settings**: Constance field details by group
133
+
134
+ #### Special Layouts:
135
+ - **Project Commands**: Two-column layout within single panel
136
+ - **Ngrok Integration**: Configuration and tunnel status
137
+
138
+ ## Key Features
139
+
140
+ ### ✅ **Rich Visual Layout**
141
+ - **Fixed-width panels**: Consistent 120-character width
142
+ - **50/50 column layouts**: Perfectly proportioned two-column displays
143
+ - **Full-width panels**: Single panels matching two-column width
144
+ - **Integrated blocks**: Complex layouts with nested components
145
+
146
+ ### ⚙️ **Smart Configuration Integration**
147
+ - **Constance Integration**: Dynamic fields from multiple sources
148
+ - User-defined fields
149
+ - Tasks module fields
150
+ - Knowbase app fields
151
+ - Payments app fields
152
+ - **App-specific configurations**: Payments, tasks, knowbase status
153
+ - **Environment detection**: Development, production, testing modes
154
+
155
+ ### 🚀 **Performance Optimized**
156
+ - **Caching**: Version checking with TTL cache
157
+ - **Lazy loading**: App fields loaded only when needed
158
+ - **Error resilience**: Graceful degradation on failures
159
+ - **Resource efficiency**: Mode-based resource usage
160
+
161
+ ### 🔄 **Modular Architecture**
162
+ - **Class inheritance**: Shared utilities via BaseDisplayManager
163
+ - **Separation of concerns**: Each manager handles specific domain
164
+ - **Extensible design**: Easy to add new display managers
165
+ - **Clean imports**: Well-organized public API
166
+
167
+ ## Implementation Details
168
+
169
+ ### Panel Width System
170
+
171
+ ```python
172
+ # Fixed width constants for consistent layout
173
+ CONSOLE_WIDTH = 120
174
+ MAIN_PANEL_WIDTH = 120 # Full-width panels
175
+ HALF_PANEL_WIDTH = 55 # 50% width for columns
176
+
177
+ # Panel creation methods
178
+ create_panel() # Standard width panels
179
+ create_full_width_panel() # Full-width panels with table wrapper
180
+ print_two_column_table() # 50/50 column layout with panels
181
+ ```
182
+
183
+ ### Display Flow
184
+
185
+ 1. **Configuration Loading**: Get DjangoConfig instance
186
+ 2. **Mode Detection**: Check startup_info_mode setting
187
+ 3. **Manager Initialization**: Create appropriate display manager
188
+ 4. **Information Gathering**: Collect system information
189
+ 5. **Layout Rendering**: Display using Rich components
190
+ 6. **Error Handling**: Graceful degradation on failures
191
+
192
+ ### Integration Points
193
+
194
+ ```python
195
+ # Main entry points
196
+ from django_cfg.core.integration import print_startup_info, print_ngrok_tunnel_info
197
+
198
+ # Display managers
199
+ from django_cfg.core.integration.display import (
200
+ BaseDisplayManager,
201
+ StartupDisplayManager,
202
+ NgrokDisplayManager
203
+ )
204
+
205
+ # Utilities
206
+ from django_cfg.core.integration import (
207
+ get_version_info,
208
+ get_all_commands,
209
+ get_commands_with_descriptions
210
+ )
211
+ ```
212
+
213
+ ## Usage Examples
214
+
215
+ ### Basic Usage
216
+
217
+ ```python
218
+ # In your Django startup (settings.py, apps.py, etc.)
219
+ from django_cfg.core.integration import print_startup_info
220
+
221
+ # Display startup information based on config
222
+ print_startup_info()
223
+ ```
224
+
225
+ ### Custom Display Manager
226
+
227
+ ```python
228
+ from django_cfg.core.integration.display import BaseDisplayManager
229
+
230
+ class CustomDisplayManager(BaseDisplayManager):
231
+ def display_custom_info(self):
232
+ # Create custom panels
233
+ info_table = self.create_table()
234
+ info_table.add_column("Setting", style="cyan")
235
+ info_table.add_column("Value", style="white")
236
+
237
+ # Add your data
238
+ info_table.add_row("Custom Setting", "Custom Value")
239
+
240
+ # Display as full-width panel
241
+ panel = self.create_full_width_panel(
242
+ info_table,
243
+ title="Custom Information",
244
+ border_style="green"
245
+ )
246
+
247
+ self.console.print(panel)
248
+ ```
249
+
250
+ ### Ngrok Integration
251
+
252
+ ```python
253
+ from django_cfg.core.integration import print_ngrok_tunnel_info
254
+
255
+ # After ngrok tunnel is established
256
+ tunnel_url = "https://abc123.ngrok-free.app"
257
+ print_ngrok_tunnel_info(tunnel_url)
258
+ ```
259
+
260
+ ## Migration Guide
261
+
262
+ ### From Old Integration System:
263
+
264
+ The new system is **fully backward compatible**:
265
+
266
+ ```python
267
+ # Old usage (still works)
268
+ from django_cfg.core.integration import print_startup_info
269
+ print_startup_info()
270
+
271
+ # New usage (same result)
272
+ from django_cfg.core.integration.display import StartupDisplayManager
273
+ manager = StartupDisplayManager()
274
+ manager.display_startup_info()
275
+ ```
276
+
277
+ ### Customization Migration:
278
+
279
+ ```python
280
+ # Old: Direct function modification
281
+ # New: Class-based extension
282
+
283
+ class MyStartupDisplayManager(StartupDisplayManager):
284
+ def display_startup_info(self):
285
+ # Call parent method
286
+ super().display_startup_info()
287
+
288
+ # Add custom information
289
+ self.display_custom_section()
290
+
291
+ def display_custom_section(self):
292
+ # Your custom display logic
293
+ pass
294
+ ```
295
+
296
+ ## Advanced Features
297
+
298
+ ### Dynamic Constance Integration
299
+
300
+ The system automatically discovers and displays Constance fields from:
301
+ - **User-defined fields**: Manual configuration
302
+ - **App modules**: Tasks, knowbase, payments
303
+ - **Dynamic loading**: Only enabled apps contribute fields
304
+
305
+ ### Command Collection
306
+
307
+ Comprehensive management command discovery:
308
+ - **Core commands**: Django-CFG framework commands
309
+ - **App commands**: Application-specific commands
310
+ - **Project commands**: Local project commands
311
+ - **Categorization**: Automatic grouping and counting
312
+
313
+ ### Version Management
314
+
315
+ Smart version checking with caching:
316
+ - **Current version**: Automatic detection via importlib
317
+ - **Latest version**: PyPI API integration
318
+ - **Caching**: TTL-based cache to prevent redundant calls
319
+ - **Update notifications**: Prominent display when updates available
320
+
321
+ ## Troubleshooting
322
+
323
+ ### Common Issues
324
+
325
+ 1. **Panel width problems**: Check CONSOLE_WIDTH constants
326
+ 2. **Import errors**: Verify display manager imports
327
+ 3. **Missing information**: Check app configuration and enabled status
328
+ 4. **Layout issues**: Ensure proper panel creation methods
329
+
330
+ ### Debug Mode
331
+
332
+ ```python
333
+ # Enable detailed error reporting
334
+ import traceback
335
+
336
+ try:
337
+ from django_cfg.core.integration import print_startup_info
338
+ print_startup_info()
339
+ except Exception as e:
340
+ print(f"❌ ERROR: {e}")
341
+ traceback.print_exc()
342
+ ```
343
+
344
+ ### Performance Monitoring
345
+
346
+ ```python
347
+ import time
348
+ from django_cfg.core.integration.display import StartupDisplayManager
349
+
350
+ start_time = time.time()
351
+ manager = StartupDisplayManager()
352
+ manager.display_startup_info()
353
+ print(f"Display time: {time.time() - start_time:.2f}s")
354
+ ```
355
+
356
+ ## Future Enhancements
357
+
358
+ - **Interactive mode**: Navigate through information sections
359
+ - **Export options**: JSON/YAML output for automation
360
+ - **Custom themes**: User-defined color schemes
361
+ - **Plugin system**: Third-party display extensions
362
+ - **Performance metrics**: Built-in timing and resource monitoring
363
+ - **Configuration validation**: Real-time config checking
@@ -0,0 +1,47 @@
1
+ """
2
+ Django CFG Integration Package.
3
+
4
+ Provides URL integration and startup information display.
5
+ """
6
+
7
+ from .url_integration import add_django_cfg_urls, get_django_cfg_urls_info
8
+ from .display.startup import StartupDisplayManager
9
+ from .display.ngrok import NgrokDisplayManager
10
+
11
+ def print_startup_info():
12
+ """Print startup information based on config.startup_info_mode."""
13
+ try:
14
+ manager = StartupDisplayManager()
15
+ manager.display_startup_info()
16
+ except Exception as e:
17
+ import traceback
18
+ print(f"❌ ERROR in print_startup_info: {e}")
19
+ print("🔍 TRACEBACK:")
20
+ traceback.print_exc()
21
+
22
+ def print_ngrok_tunnel_info(tunnel_url: str):
23
+ """Print ngrok tunnel information after tunnel is established."""
24
+ try:
25
+ manager = NgrokDisplayManager()
26
+ manager.display_tunnel_info(tunnel_url)
27
+ except Exception as e:
28
+ import traceback
29
+ print(f"❌ ERROR in print_ngrok_tunnel_info: {e}")
30
+ print("🔍 TRACEBACK:")
31
+ traceback.print_exc()
32
+
33
+ from .version_checker import get_version_info, get_latest_version, get_current_version
34
+ from .commands_collector import get_all_commands, get_command_count, get_commands_with_descriptions
35
+
36
+ __all__ = [
37
+ "add_django_cfg_urls",
38
+ "get_django_cfg_urls_info",
39
+ "print_startup_info",
40
+ "print_ngrok_tunnel_info",
41
+ "get_version_info",
42
+ "get_latest_version",
43
+ "get_current_version",
44
+ "get_all_commands",
45
+ "get_command_count",
46
+ "get_commands_with_descriptions",
47
+ ]
@@ -0,0 +1,239 @@
1
+ """
2
+ Management commands collector for django-cfg.
3
+
4
+ Collects and groups all available Django management commands.
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Dict, List, Optional, Set
10
+ from collections import defaultdict
11
+
12
+ try:
13
+ from django.core.management import get_commands
14
+ from django.apps import apps
15
+ DJANGO_AVAILABLE = True
16
+ except ImportError:
17
+ DJANGO_AVAILABLE = False
18
+
19
+
20
+ class CommandsCollector:
21
+ """
22
+ Collects and organizes Django management commands by source.
23
+ """
24
+
25
+ def __init__(self):
26
+ """Initialize commands collector."""
27
+ self.django_cfg_path = Path(__file__).parent.parent.parent
28
+ self.commands_cache = None
29
+
30
+ def get_all_commands(self) -> Dict[str, Dict[str, List[str]]]:
31
+ """
32
+ Get all available commands grouped by source.
33
+
34
+ Returns:
35
+ Dictionary with command groups:
36
+ {
37
+ 'django_cfg_core': {'Core Commands': [...]},
38
+ 'django_cfg_apps': {'App Name': [...], ...},
39
+ 'project_commands': {'Project Commands': [...]}
40
+ }
41
+ """
42
+ if self.commands_cache is not None:
43
+ return self.commands_cache
44
+
45
+ commands = {
46
+ 'django_cfg_core': {},
47
+ 'django_cfg_apps': {},
48
+ 'project_commands': {}
49
+ }
50
+
51
+ # Get Django-CFG core commands
52
+ core_commands = self._get_django_cfg_core_commands()
53
+ if core_commands:
54
+ commands['django_cfg_core']['Core Commands'] = sorted(core_commands)
55
+
56
+ # Get Django-CFG app commands
57
+ app_commands = self._get_django_cfg_app_commands()
58
+ for app_name, app_cmds in app_commands.items():
59
+ if app_cmds:
60
+ commands['django_cfg_apps'][app_name] = sorted(app_cmds)
61
+
62
+ # Get project commands (if Django is available)
63
+ if DJANGO_AVAILABLE:
64
+ project_commands = self._get_project_commands()
65
+ if project_commands:
66
+ commands['project_commands']['Project Commands'] = sorted(project_commands)
67
+
68
+ self.commands_cache = commands
69
+ return commands
70
+
71
+ def _get_django_cfg_core_commands(self) -> List[str]:
72
+ """Get Django-CFG core management commands."""
73
+ commands = []
74
+ core_commands_path = self.django_cfg_path / "management" / "commands"
75
+
76
+ if core_commands_path.exists():
77
+ for file_path in core_commands_path.glob("*.py"):
78
+ if file_path.name != "__init__.py":
79
+ command_name = file_path.stem
80
+ commands.append(command_name)
81
+
82
+ return commands
83
+
84
+ def _get_django_cfg_app_commands(self) -> Dict[str, List[str]]:
85
+ """Get Django-CFG app-specific management commands."""
86
+ app_commands = defaultdict(list)
87
+ apps_path = self.django_cfg_path / "apps"
88
+
89
+ if not apps_path.exists():
90
+ return dict(app_commands)
91
+
92
+ for app_dir in apps_path.iterdir():
93
+ if app_dir.is_dir() and not app_dir.name.startswith('.') and app_dir.name != '__pycache__':
94
+ # Skip @old directory
95
+ if app_dir.name.startswith('@'):
96
+ continue
97
+
98
+ commands_path = app_dir / "management" / "commands"
99
+ if commands_path.exists():
100
+ app_name = app_dir.name.title()
101
+
102
+ for file_path in commands_path.glob("*.py"):
103
+ if file_path.name != "__init__.py":
104
+ command_name = file_path.stem
105
+ app_commands[app_name].append(command_name)
106
+
107
+ return dict(app_commands)
108
+
109
+ def _get_project_commands(self) -> List[str]:
110
+ """Get project-specific management commands (excluding Django-CFG)."""
111
+ if not DJANGO_AVAILABLE:
112
+ return []
113
+
114
+ try:
115
+ all_commands = get_commands()
116
+ django_cfg_commands = set()
117
+
118
+ # Collect all Django-CFG commands
119
+ core_commands = self._get_django_cfg_core_commands()
120
+ django_cfg_commands.update(core_commands)
121
+
122
+ app_commands = self._get_django_cfg_app_commands()
123
+ for app_cmds in app_commands.values():
124
+ django_cfg_commands.update(app_cmds)
125
+
126
+ # Filter out Django-CFG commands and Django built-ins
127
+ django_builtin_commands = {
128
+ 'check', 'compilemessages', 'createcachetable', 'dbshell',
129
+ 'diffsettings', 'dumpdata', 'flush', 'inspectdb', 'loaddata',
130
+ 'makemessages', 'makemigrations', 'migrate', 'optimizemigration',
131
+ 'runserver', 'shell', 'showmigrations', 'sqlflush', 'sqlmigrate',
132
+ 'sqlsequencereset', 'squashmigrations', 'startapp', 'startproject',
133
+ 'test', 'testserver', 'collectstatic', 'findstatic', 'clearsessions',
134
+ 'createsuperuser', 'changepassword'
135
+ }
136
+
137
+ project_commands = []
138
+ for cmd_name in all_commands.keys():
139
+ if (cmd_name not in django_cfg_commands and
140
+ cmd_name not in django_builtin_commands):
141
+ project_commands.append(cmd_name)
142
+
143
+ return project_commands
144
+
145
+ except Exception:
146
+ return []
147
+
148
+ def get_command_description(self, command_name: str) -> Optional[str]:
149
+ """
150
+ Get command description from its help text.
151
+
152
+ Args:
153
+ command_name: Name of the command
154
+
155
+ Returns:
156
+ Command description or None if not available
157
+ """
158
+ if not DJANGO_AVAILABLE:
159
+ return None
160
+
161
+ try:
162
+ from django.core.management import load_command_class
163
+ from django.core.management.base import CommandError
164
+
165
+ try:
166
+ command = load_command_class(None, command_name)
167
+ return getattr(command, 'help', None) or None
168
+ except (CommandError, ImportError, AttributeError):
169
+ return None
170
+ except Exception:
171
+ return None
172
+
173
+ def get_commands_with_descriptions(self) -> Dict[str, Dict[str, Dict[str, Optional[str]]]]:
174
+ """
175
+ Get all commands with their descriptions.
176
+
177
+ Returns:
178
+ Dictionary with commands and descriptions:
179
+ {
180
+ 'django_cfg_core': {'Core Commands': {'cmd': 'description', ...}},
181
+ 'django_cfg_apps': {'App Name': {'cmd': 'description', ...}, ...},
182
+ 'project_commands': {'Project Commands': {'cmd': 'description', ...}}
183
+ }
184
+ """
185
+ all_commands = self.get_all_commands()
186
+ commands_with_desc = {}
187
+
188
+ for category, groups in all_commands.items():
189
+ commands_with_desc[category] = {}
190
+
191
+ for group_name, commands in groups.items():
192
+ commands_with_desc[category][group_name] = {}
193
+
194
+ for cmd in commands:
195
+ desc = self.get_command_description(cmd)
196
+ commands_with_desc[category][group_name][cmd] = desc
197
+
198
+ return commands_with_desc
199
+
200
+
201
+ # Global instance
202
+ _commands_collector = CommandsCollector()
203
+
204
+
205
+ def get_all_commands() -> Dict[str, Dict[str, List[str]]]:
206
+ """
207
+ Get all available Django management commands grouped by source.
208
+
209
+ Returns:
210
+ Dictionary with command groups
211
+ """
212
+ return _commands_collector.get_all_commands()
213
+
214
+
215
+ def get_commands_with_descriptions() -> Dict[str, Dict[str, Dict[str, Optional[str]]]]:
216
+ """
217
+ Get all commands with their descriptions.
218
+
219
+ Returns:
220
+ Dictionary with commands and descriptions
221
+ """
222
+ return _commands_collector.get_commands_with_descriptions()
223
+
224
+
225
+ def get_command_count() -> int:
226
+ """
227
+ Get total count of available commands.
228
+
229
+ Returns:
230
+ Total number of commands
231
+ """
232
+ all_commands = get_all_commands()
233
+ total = 0
234
+
235
+ for category in all_commands.values():
236
+ for commands in category.values():
237
+ total += len(commands)
238
+
239
+ return total
@@ -0,0 +1,15 @@
1
+ """
2
+ Django CFG Display System.
3
+
4
+ Modular, class-based display system for startup information.
5
+ """
6
+
7
+ from .base import BaseDisplayManager
8
+ from .startup import StartupDisplayManager
9
+ from .ngrok import NgrokDisplayManager
10
+
11
+ __all__ = [
12
+ "BaseDisplayManager",
13
+ "StartupDisplayManager",
14
+ "NgrokDisplayManager",
15
+ ]