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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/api/health/views.py +4 -2
- django_cfg/apps/knowbase/config/settings.py +16 -15
- django_cfg/apps/payments/README.md +326 -0
- django_cfg/apps/payments/admin/__init__.py +20 -10
- django_cfg/apps/payments/admin/api_keys_admin.py +521 -237
- django_cfg/apps/payments/admin/balance_admin.py +592 -297
- django_cfg/apps/payments/admin/currencies_admin.py +526 -222
- django_cfg/apps/payments/admin/filters.py +306 -199
- django_cfg/apps/payments/admin/payments_admin.py +465 -70
- django_cfg/apps/payments/admin/subscriptions_admin.py +578 -128
- django_cfg/apps/payments/admin_interface/__init__.py +18 -0
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +162 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +38 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/loading_spinner.html +16 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/notification.html +27 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_card.html +86 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +39 -0
- django_cfg/apps/payments/admin_interface/templates/payments/currency_converter.html +382 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +300 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +303 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +382 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_status.html +500 -0
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +594 -0
- django_cfg/apps/payments/admin_interface/views/__init__.py +23 -0
- django_cfg/apps/payments/admin_interface/views/payment_views.py +259 -0
- django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +37 -0
- django_cfg/apps/payments/apps.py +34 -9
- django_cfg/apps/payments/config/__init__.py +28 -51
- django_cfg/apps/payments/config/constance/__init__.py +22 -0
- django_cfg/apps/payments/config/constance/config_service.py +123 -0
- django_cfg/apps/payments/config/constance/fields.py +69 -0
- django_cfg/apps/payments/config/constance/settings.py +160 -0
- django_cfg/apps/payments/config/django_cfg_integration.py +202 -0
- django_cfg/apps/payments/config/helpers.py +130 -0
- django_cfg/apps/payments/management/__init__.py +1 -3
- django_cfg/apps/payments/management/commands/__init__.py +1 -3
- django_cfg/apps/payments/management/commands/manage_currencies.py +303 -151
- django_cfg/apps/payments/management/commands/manage_providers.py +333 -160
- django_cfg/apps/payments/middleware/__init__.py +3 -1
- django_cfg/apps/payments/middleware/api_access.py +329 -222
- django_cfg/apps/payments/middleware/rate_limiting.py +342 -152
- django_cfg/apps/payments/middleware/usage_tracking.py +249 -240
- django_cfg/apps/payments/migrations/0001_initial.py +708 -536
- django_cfg/apps/payments/models/__init__.py +13 -18
- django_cfg/apps/payments/models/api_keys.py +121 -43
- django_cfg/apps/payments/models/balance.py +150 -115
- django_cfg/apps/payments/models/base.py +68 -15
- django_cfg/apps/payments/models/currencies.py +172 -148
- django_cfg/apps/payments/models/managers/__init__.py +44 -0
- django_cfg/apps/payments/models/managers/api_key_managers.py +329 -0
- django_cfg/apps/payments/models/managers/balance_managers.py +599 -0
- django_cfg/apps/payments/models/managers/currency_managers.py +385 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +511 -0
- django_cfg/apps/payments/models/managers/subscription_managers.py +641 -0
- django_cfg/apps/payments/models/payments.py +235 -285
- django_cfg/apps/payments/models/subscriptions.py +257 -177
- django_cfg/apps/payments/models/tariffs.py +147 -40
- django_cfg/apps/payments/services/__init__.py +209 -56
- django_cfg/apps/payments/services/cache/__init__.py +6 -6
- django_cfg/apps/payments/services/cache/{simple_cache.py → cache_service.py} +112 -12
- django_cfg/apps/payments/services/core/__init__.py +10 -6
- django_cfg/apps/payments/services/core/balance_service.py +435 -360
- django_cfg/apps/payments/services/core/base.py +166 -0
- django_cfg/apps/payments/services/core/currency_service.py +478 -0
- django_cfg/apps/payments/services/core/payment_service.py +346 -467
- django_cfg/apps/payments/services/core/subscription_service.py +425 -481
- django_cfg/apps/payments/services/core/webhook_service.py +410 -0
- django_cfg/apps/payments/services/integrations/__init__.py +29 -0
- django_cfg/apps/payments/services/integrations/ngrok_service.py +47 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +107 -0
- django_cfg/apps/payments/services/providers/__init__.py +9 -14
- django_cfg/apps/payments/services/providers/base.py +234 -174
- django_cfg/apps/payments/services/providers/nowpayments.py +478 -0
- django_cfg/apps/payments/services/providers/registry.py +367 -301
- django_cfg/apps/payments/services/types/__init__.py +78 -0
- django_cfg/apps/payments/services/types/data.py +177 -0
- django_cfg/apps/payments/services/types/requests.py +150 -0
- django_cfg/apps/payments/services/types/responses.py +156 -0
- django_cfg/apps/payments/services/types/webhooks.py +232 -0
- django_cfg/apps/payments/signals/__init__.py +33 -8
- django_cfg/apps/payments/signals/api_key_signals.py +210 -129
- django_cfg/apps/payments/signals/balance_signals.py +174 -0
- django_cfg/apps/payments/signals/payment_signals.py +128 -103
- django_cfg/apps/payments/signals/subscription_signals.py +194 -142
- django_cfg/apps/payments/static/payments/css/components.css +380 -0
- django_cfg/apps/payments/static/payments/css/dashboard.css +188 -0
- django_cfg/apps/payments/static/payments/js/components.js +545 -0
- django_cfg/apps/payments/static/payments/js/utils.js +412 -0
- django_cfg/apps/payments/templatetags/__init__.py +1 -1
- django_cfg/apps/payments/templatetags/payment_tags.py +466 -0
- django_cfg/apps/payments/urls.py +45 -48
- django_cfg/apps/payments/urls_admin.py +33 -42
- django_cfg/apps/payments/views/api/__init__.py +101 -0
- django_cfg/apps/payments/views/api/api_keys.py +387 -0
- django_cfg/apps/payments/views/api/balances.py +381 -0
- django_cfg/apps/payments/views/api/base.py +298 -0
- django_cfg/apps/payments/views/api/currencies.py +402 -0
- django_cfg/apps/payments/views/api/payments.py +415 -0
- django_cfg/apps/payments/views/api/subscriptions.py +475 -0
- django_cfg/apps/payments/views/api/webhooks.py +476 -0
- django_cfg/apps/payments/views/serializers/__init__.py +99 -0
- django_cfg/apps/payments/views/serializers/api_keys.py +424 -0
- django_cfg/apps/payments/views/serializers/balances.py +300 -0
- django_cfg/apps/payments/views/serializers/currencies.py +335 -0
- django_cfg/apps/payments/views/serializers/payments.py +387 -0
- django_cfg/apps/payments/views/serializers/subscriptions.py +429 -0
- django_cfg/apps/payments/views/serializers/webhooks.py +137 -0
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +40 -4
- django_cfg/core/generation.py +25 -4
- django_cfg/core/integration/README.md +363 -0
- django_cfg/core/integration/__init__.py +47 -0
- django_cfg/core/integration/commands_collector.py +239 -0
- django_cfg/core/integration/display/__init__.py +15 -0
- django_cfg/core/integration/display/base.py +157 -0
- django_cfg/core/integration/display/ngrok.py +164 -0
- django_cfg/core/integration/display/startup.py +815 -0
- django_cfg/core/integration/url_integration.py +123 -0
- django_cfg/core/integration/version_checker.py +160 -0
- django_cfg/management/commands/auto_generate.py +4 -0
- django_cfg/management/commands/check_settings.py +6 -0
- django_cfg/management/commands/clear_constance.py +5 -2
- django_cfg/management/commands/create_token.py +6 -0
- django_cfg/management/commands/list_urls.py +6 -0
- django_cfg/management/commands/migrate_all.py +6 -0
- django_cfg/management/commands/migrator.py +3 -0
- django_cfg/management/commands/rundramatiq.py +6 -0
- django_cfg/management/commands/runserver_ngrok.py +51 -29
- django_cfg/management/commands/script.py +6 -0
- django_cfg/management/commands/show_config.py +12 -2
- django_cfg/management/commands/show_urls.py +4 -0
- django_cfg/management/commands/superuser.py +6 -0
- django_cfg/management/commands/task_clear.py +4 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -0
- django_cfg/management/commands/test_telegram.py +6 -0
- django_cfg/management/commands/test_twilio.py +6 -0
- django_cfg/management/commands/tree.py +6 -0
- django_cfg/management/commands/validate_config.py +155 -149
- django_cfg/models/constance.py +31 -11
- django_cfg/models/payments.py +175 -492
- django_cfg/modules/django_logger.py +160 -146
- django_cfg/modules/django_unfold/dashboard.py +64 -16
- django_cfg/registry/core.py +1 -0
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/utils/smart_defaults.py +222 -571
- django_cfg/utils/toolkit.py +51 -11
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/METADATA +4 -1
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/RECORD +153 -185
- django_cfg/apps/payments/__init__.py +0 -8
- django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
- django_cfg/apps/payments/config/module.py +0 -70
- django_cfg/apps/payments/config/providers.py +0 -105
- django_cfg/apps/payments/config/settings.py +0 -96
- django_cfg/apps/payments/config/utils.py +0 -52
- django_cfg/apps/payments/decorators.py +0 -291
- django_cfg/apps/payments/management/commands/README.md +0 -146
- django_cfg/apps/payments/management/commands/currency_stats.py +0 -304
- django_cfg/apps/payments/managers/__init__.py +0 -23
- django_cfg/apps/payments/managers/api_key_manager.py +0 -35
- django_cfg/apps/payments/managers/balance_manager.py +0 -361
- django_cfg/apps/payments/managers/currency_manager.py +0 -306
- django_cfg/apps/payments/managers/payment_manager.py +0 -192
- django_cfg/apps/payments/managers/subscription_manager.py +0 -37
- django_cfg/apps/payments/managers/tariff_manager.py +0 -29
- django_cfg/apps/payments/migrations/0002_network_providercurrency_and_more.py +0 -241
- django_cfg/apps/payments/migrations/0003_add_usd_rate_cache.py +0 -30
- django_cfg/apps/payments/models/events.py +0 -73
- django_cfg/apps/payments/serializers/__init__.py +0 -57
- django_cfg/apps/payments/serializers/api_keys.py +0 -51
- django_cfg/apps/payments/serializers/balance.py +0 -59
- django_cfg/apps/payments/serializers/currencies.py +0 -63
- django_cfg/apps/payments/serializers/payments.py +0 -62
- django_cfg/apps/payments/serializers/subscriptions.py +0 -71
- django_cfg/apps/payments/serializers/tariffs.py +0 -56
- django_cfg/apps/payments/services/billing/__init__.py +0 -8
- django_cfg/apps/payments/services/cache/base.py +0 -30
- django_cfg/apps/payments/services/core/fallback_service.py +0 -432
- django_cfg/apps/payments/services/internal_types.py +0 -461
- django_cfg/apps/payments/services/middleware/__init__.py +0 -8
- django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
- django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -76
- django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
- django_cfg/apps/payments/services/providers/cryptapi/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/cryptapi/config.py +0 -8
- django_cfg/apps/payments/services/providers/cryptapi/models.py +0 -192
- django_cfg/apps/payments/services/providers/cryptapi/provider.py +0 -439
- django_cfg/apps/payments/services/providers/cryptomus/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/cryptomus/models.py +0 -176
- django_cfg/apps/payments/services/providers/cryptomus/provider.py +0 -429
- django_cfg/apps/payments/services/providers/cryptomus/provider_v2.py +0 -564
- django_cfg/apps/payments/services/providers/models/__init__.py +0 -34
- django_cfg/apps/payments/services/providers/models/currencies.py +0 -190
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/nowpayments/models.py +0 -196
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +0 -380
- django_cfg/apps/payments/services/providers/stripe/__init__.py +0 -4
- django_cfg/apps/payments/services/providers/stripe/models.py +0 -184
- django_cfg/apps/payments/services/providers/stripe/provider.py +0 -109
- django_cfg/apps/payments/services/security/__init__.py +0 -34
- django_cfg/apps/payments/services/security/error_handler.py +0 -635
- django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
- django_cfg/apps/payments/services/security/webhook_validator.py +0 -474
- django_cfg/apps/payments/static/payments/css/payments.css +0 -340
- django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
- django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
- django_cfg/apps/payments/static/payments/js/theme.js +0 -86
- django_cfg/apps/payments/tasks/__init__.py +0 -12
- django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
- django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +0 -50
- django_cfg/apps/payments/templates/payments/base.html +0 -182
- django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
- django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
- django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -43
- django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
- django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -34
- django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -148
- django_cfg/apps/payments/templates/payments/dashboard.html +0 -258
- django_cfg/apps/payments/templates/payments/dashboard_simple_test.html +0 -35
- django_cfg/apps/payments/templates/payments/payment_create.html +0 -579
- django_cfg/apps/payments/templates/payments/payment_detail.html +0 -373
- django_cfg/apps/payments/templates/payments/payment_list.html +0 -354
- django_cfg/apps/payments/templates/payments/stats.html +0 -261
- django_cfg/apps/payments/templates/payments/test.html +0 -213
- django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
- django_cfg/apps/payments/utils/__init__.py +0 -43
- django_cfg/apps/payments/utils/billing_utils.py +0 -342
- django_cfg/apps/payments/utils/config_utils.py +0 -239
- django_cfg/apps/payments/utils/middleware_utils.py +0 -228
- django_cfg/apps/payments/utils/validation_utils.py +0 -94
- django_cfg/apps/payments/views/__init__.py +0 -63
- django_cfg/apps/payments/views/api_key_views.py +0 -164
- django_cfg/apps/payments/views/balance_views.py +0 -75
- django_cfg/apps/payments/views/currency_views.py +0 -122
- django_cfg/apps/payments/views/payment_views.py +0 -149
- django_cfg/apps/payments/views/subscription_views.py +0 -135
- django_cfg/apps/payments/views/tariff_views.py +0 -131
- django_cfg/apps/payments/views/templates/__init__.py +0 -25
- django_cfg/apps/payments/views/templates/ajax.py +0 -451
- django_cfg/apps/payments/views/templates/base.py +0 -212
- django_cfg/apps/payments/views/templates/dashboard.py +0 -60
- django_cfg/apps/payments/views/templates/payment_detail.py +0 -102
- django_cfg/apps/payments/views/templates/payment_management.py +0 -158
- django_cfg/apps/payments/views/templates/qr_code.py +0 -174
- django_cfg/apps/payments/views/templates/stats.py +0 -244
- django_cfg/apps/payments/views/templates/utils.py +0 -181
- django_cfg/apps/payments/views/webhook_views.py +0 -266
- django_cfg/apps/payments/viewsets.py +0 -66
- django_cfg/core/integration.py +0 -160
- django_cfg/template_archive/.gitignore +0 -1
- django_cfg/template_archive/__init__.py +0 -0
- django_cfg/urls.py +0 -33
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
- {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
|
+
]
|