django-cfg 1.2.29__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 -9
- 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 +600 -108
- django_cfg/apps/payments/admin/filters.py +306 -199
- django_cfg/apps/payments/admin/payments_admin.py +470 -64
- 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 +381 -0
- django_cfg/apps/payments/management/commands/manage_providers.py +408 -0
- 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 +343 -163
- django_cfg/apps/payments/middleware/usage_tracking.py +250 -238
- django_cfg/apps/payments/migrations/0001_initial.py +708 -536
- django_cfg/apps/payments/models/__init__.py +16 -20
- 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 +207 -67
- 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 -284
- 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 +344 -468
- django_cfg/apps/payments/services/core/subscription_service.py +425 -484
- 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 +232 -71
- django_cfg/apps/payments/services/providers/nowpayments.py +404 -219
- django_cfg/apps/payments/services/providers/registry.py +429 -80
- 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 +211 -130
- django_cfg/apps/payments/signals/balance_signals.py +174 -0
- django_cfg/apps/payments/signals/payment_signals.py +129 -98
- django_cfg/apps/payments/signals/subscription_signals.py +195 -143
- 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 +46 -47
- django_cfg/apps/payments/urls_admin.py +49 -0
- 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/apps/tasks/urls.py +0 -2
- django_cfg/apps/tasks/urls_admin.py +14 -0
- django_cfg/apps/urls.py +4 -4
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +75 -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 -498
- django_cfg/modules/django_currency/__init__.py +16 -11
- django_cfg/modules/django_currency/clients/__init__.py +4 -4
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +289 -0
- django_cfg/modules/django_currency/clients/yahoo_client.py +157 -0
- django_cfg/modules/django_currency/core/__init__.py +1 -7
- django_cfg/modules/django_currency/core/converter.py +18 -23
- django_cfg/modules/django_currency/core/models.py +122 -11
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +190 -309
- django_cfg/modules/django_logger.py +160 -146
- django_cfg/modules/django_unfold/dashboard.py +65 -12
- django_cfg/registry/core.py +1 -0
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/admin/components/action_grid.html +9 -9
- django_cfg/templates/admin/components/metric_card.html +5 -5
- django_cfg/templates/admin/components/status_badge.html +2 -2
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +152 -24
- django_cfg/templates/admin/snippets/components/quick_actions.html +3 -3
- django_cfg/templates/admin/snippets/components/system_health.html +1 -1
- django_cfg/templates/admin/snippets/tabs/overview_tab.html +49 -52
- django_cfg/utils/smart_defaults.py +222 -571
- django_cfg/utils/toolkit.py +51 -11
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/METADATA +5 -4
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/RECORD +172 -182
- 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 -178
- django_cfg/apps/payments/management/commands/currency_stats.py +0 -323
- django_cfg/apps/payments/management/commands/populate_currencies.py +0 -246
- django_cfg/apps/payments/management/commands/update_currencies.py +0 -336
- django_cfg/apps/payments/managers/__init__.py +0 -22
- 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 -83
- django_cfg/apps/payments/managers/payment_manager.py +0 -44
- django_cfg/apps/payments/managers/subscription_manager.py +0 -37
- django_cfg/apps/payments/managers/tariff_manager.py +0 -29
- django_cfg/apps/payments/models/events.py +0 -73
- django_cfg/apps/payments/serializers/__init__.py +0 -56
- 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 -55
- 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 -297
- 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 -222
- django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
- django_cfg/apps/payments/services/providers/cryptapi.py +0 -273
- django_cfg/apps/payments/services/providers/cryptomus.py +0 -311
- django_cfg/apps/payments/services/security/__init__.py +0 -34
- django_cfg/apps/payments/services/security/error_handler.py +0 -637
- django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
- django_cfg/apps/payments/services/security/webhook_validator.py +0 -475
- django_cfg/apps/payments/services/validators/__init__.py +0 -8
- 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/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 -36
- django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
- django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -27
- django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -144
- django_cfg/apps/payments/templates/payments/dashboard.html +0 -346
- django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
- django_cfg/apps/payments/urls_templates.py +0 -52
- django_cfg/apps/payments/utils/__init__.py +0 -45
- django_cfg/apps/payments/utils/billing_utils.py +0 -342
- django_cfg/apps/payments/utils/config_utils.py +0 -245
- 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 -62
- 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 -111
- 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 -312
- django_cfg/apps/payments/views/templates/base.py +0 -204
- 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 -164
- django_cfg/apps/payments/views/templates/qr_code.py +0 -174
- django_cfg/apps/payments/views/templates/stats.py +0 -240
- 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 -65
- django_cfg/core/integration.py +0 -160
- django_cfg/modules/django_currency/clients/coingecko_client.py +0 -257
- django_cfg/modules/django_currency/clients/yfinance_client.py +0 -246
- 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.29.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/licenses/LICENSE +0 -0
django_cfg/core/config.py
CHANGED
@@ -11,6 +11,7 @@ Following CRITICAL_REQUIREMENTS.md:
|
|
11
11
|
from typing import Dict, List, Optional, Any, Union
|
12
12
|
from pathlib import Path
|
13
13
|
from pydantic import BaseModel, Field, field_validator, model_validator, PrivateAttr
|
14
|
+
from enum import Enum
|
14
15
|
import os
|
15
16
|
from pathlib import Path
|
16
17
|
from urllib.parse import urlparse
|
@@ -66,6 +67,25 @@ DEFAULT_APPS = [
|
|
66
67
|
]
|
67
68
|
|
68
69
|
|
70
|
+
class EnvironmentMode(str, Enum):
|
71
|
+
"""Environment mode enumeration."""
|
72
|
+
DEVELOPMENT = "development"
|
73
|
+
PRODUCTION = "production"
|
74
|
+
TEST = "test"
|
75
|
+
|
76
|
+
@classmethod
|
77
|
+
def from_debug(cls, debug: bool) -> "EnvironmentMode":
|
78
|
+
"""Get environment mode from debug flag."""
|
79
|
+
return cls.DEVELOPMENT if debug else cls.PRODUCTION
|
80
|
+
|
81
|
+
|
82
|
+
class StartupInfoMode(str, Enum):
|
83
|
+
"""Startup information display mode."""
|
84
|
+
NONE = "none" # Minimal info only (version, environment, critical errors)
|
85
|
+
SHORT = "short" # Essential info (apps, endpoints, status, updates)
|
86
|
+
FULL = "full" # Complete info (everything from old system)
|
87
|
+
|
88
|
+
|
69
89
|
class DjangoConfig(BaseModel):
|
70
90
|
"""
|
71
91
|
Base configuration class for Django projects.
|
@@ -105,6 +125,12 @@ class DjangoConfig(BaseModel):
|
|
105
125
|
"str_strip_whitespace": True,
|
106
126
|
}
|
107
127
|
|
128
|
+
# === Environment Configuration ===
|
129
|
+
env_mode: EnvironmentMode = Field(
|
130
|
+
default=EnvironmentMode.PRODUCTION,
|
131
|
+
description="Environment mode: development, production, or test",
|
132
|
+
)
|
133
|
+
|
108
134
|
# === Project Information ===
|
109
135
|
project_name: str = Field(
|
110
136
|
...,
|
@@ -131,6 +157,11 @@ class DjangoConfig(BaseModel):
|
|
131
157
|
)
|
132
158
|
|
133
159
|
# === Django CFG Features ===
|
160
|
+
startup_info_mode: StartupInfoMode = Field(
|
161
|
+
default=StartupInfoMode.FULL,
|
162
|
+
description="Startup information display mode: none (minimal), short (essential), full (complete)",
|
163
|
+
)
|
164
|
+
|
134
165
|
enable_support: bool = Field(
|
135
166
|
default=True,
|
136
167
|
description="Enable django-cfg Support application (tickets, messages, chat interface)",
|
@@ -401,6 +432,22 @@ class DjangoConfig(BaseModel):
|
|
401
432
|
|
402
433
|
return self
|
403
434
|
|
435
|
+
# === Environment Mode Properties ===
|
436
|
+
@property
|
437
|
+
def is_development(self) -> bool:
|
438
|
+
"""Check if running in development mode."""
|
439
|
+
return self.env_mode == EnvironmentMode.DEVELOPMENT
|
440
|
+
|
441
|
+
@property
|
442
|
+
def is_production(self) -> bool:
|
443
|
+
"""Check if running in production mode."""
|
444
|
+
return self.env_mode == EnvironmentMode.PRODUCTION
|
445
|
+
|
446
|
+
@property
|
447
|
+
def is_test(self) -> bool:
|
448
|
+
"""Check if running in test mode."""
|
449
|
+
return self.env_mode == EnvironmentMode.TEST
|
450
|
+
|
404
451
|
def _detect_environment(self) -> None:
|
405
452
|
"""Detect current environment from various sources."""
|
406
453
|
from django_cfg.core.environment import EnvironmentDetector
|
@@ -566,16 +613,40 @@ class DjangoConfig(BaseModel):
|
|
566
613
|
if self.enable_knowbase or self.enable_agents:
|
567
614
|
return True
|
568
615
|
|
569
|
-
# Check if payments module requires tasks
|
570
|
-
if self.payments and self.payments.should_enable_tasks():
|
571
|
-
return True
|
572
|
-
|
573
616
|
# Check if agents module requires tasks
|
574
617
|
if self.enable_agents:
|
575
618
|
return True
|
576
619
|
|
577
620
|
return False
|
578
621
|
|
622
|
+
def get_enabled_apps(self) -> List[str]:
|
623
|
+
"""
|
624
|
+
Get list of enabled django-cfg apps.
|
625
|
+
"""
|
626
|
+
|
627
|
+
apps = [
|
628
|
+
"django_cfg.apps.api.health",
|
629
|
+
"django_cfg.apps.api.commands",
|
630
|
+
]
|
631
|
+
|
632
|
+
if self.enable_support:
|
633
|
+
apps.append("django_cfg.apps.support")
|
634
|
+
if self.enable_accounts:
|
635
|
+
apps.append("django_cfg.apps.accounts")
|
636
|
+
if self.enable_newsletter:
|
637
|
+
apps.append("django_cfg.apps.newsletter")
|
638
|
+
if self.enable_leads:
|
639
|
+
apps.append("django_cfg.apps.leads")
|
640
|
+
if self.enable_knowbase:
|
641
|
+
apps.append("django_cfg.apps.knowbase")
|
642
|
+
if self.enable_agents:
|
643
|
+
apps.append("django_cfg.apps.agents")
|
644
|
+
if self.enable_maintenance:
|
645
|
+
apps.append("django_cfg.apps.maintenance")
|
646
|
+
if self.payments and self.payments.enabled:
|
647
|
+
apps.append("django_cfg.apps.payments")
|
648
|
+
return apps
|
649
|
+
|
579
650
|
def get_installed_apps(self) -> List[str]:
|
580
651
|
"""
|
581
652
|
Get complete list of installed Django apps.
|
django_cfg/core/generation.py
CHANGED
@@ -114,13 +114,34 @@ class SettingsGenerator:
|
|
114
114
|
|
115
115
|
# Add templates configuration
|
116
116
|
django_cfg_templates = Path(__file__).parent.parent / "templates"
|
117
|
+
|
118
|
+
# Collect all django-cfg template directories
|
119
|
+
template_dirs = [
|
120
|
+
config.base_dir / "templates",
|
121
|
+
django_cfg_templates, # Add django_cfg templates
|
122
|
+
]
|
123
|
+
|
124
|
+
# Auto-discover app template directories
|
125
|
+
django_cfg_dir = Path(__file__).parent.parent
|
126
|
+
apps_dir = django_cfg_dir / 'apps'
|
127
|
+
if apps_dir.exists():
|
128
|
+
for app_dir in apps_dir.iterdir():
|
129
|
+
if app_dir.is_dir() and not app_dir.name.startswith(('@', '_', '.')):
|
130
|
+
# Look for common template directory patterns
|
131
|
+
possible_template_dirs = [
|
132
|
+
app_dir / 'templates',
|
133
|
+
app_dir / 'admin_interface' / 'templates',
|
134
|
+
app_dir / 'frontend' / 'templates',
|
135
|
+
]
|
136
|
+
|
137
|
+
for template_dir in possible_template_dirs:
|
138
|
+
if template_dir.exists():
|
139
|
+
template_dirs.append(template_dir)
|
140
|
+
|
117
141
|
settings["TEMPLATES"] = [
|
118
142
|
{
|
119
143
|
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
120
|
-
"DIRS":
|
121
|
-
config.base_dir / "templates",
|
122
|
-
django_cfg_templates, # Add django_cfg templates
|
123
|
-
],
|
144
|
+
"DIRS": template_dirs,
|
124
145
|
"APP_DIRS": True,
|
125
146
|
"OPTIONS": {
|
126
147
|
"context_processors": [
|
@@ -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
|
+
]
|