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.
Files changed (258) 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 -9
  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 +600 -108
  9. django_cfg/apps/payments/admin/filters.py +306 -199
  10. django_cfg/apps/payments/admin/payments_admin.py +470 -64
  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 +381 -0
  39. django_cfg/apps/payments/management/commands/manage_providers.py +408 -0
  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 +343 -163
  43. django_cfg/apps/payments/middleware/usage_tracking.py +250 -238
  44. django_cfg/apps/payments/migrations/0001_initial.py +708 -536
  45. django_cfg/apps/payments/models/__init__.py +16 -20
  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 +207 -67
  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 -284
  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 +344 -468
  67. django_cfg/apps/payments/services/core/subscription_service.py +425 -484
  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 +232 -71
  74. django_cfg/apps/payments/services/providers/nowpayments.py +404 -219
  75. django_cfg/apps/payments/services/providers/registry.py +429 -80
  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 +211 -130
  83. django_cfg/apps/payments/signals/balance_signals.py +174 -0
  84. django_cfg/apps/payments/signals/payment_signals.py +129 -98
  85. django_cfg/apps/payments/signals/subscription_signals.py +195 -143
  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 +46 -47
  93. django_cfg/apps/payments/urls_admin.py +49 -0
  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/apps/tasks/urls.py +0 -2
  110. django_cfg/apps/tasks/urls_admin.py +14 -0
  111. django_cfg/apps/urls.py +4 -4
  112. django_cfg/config.py +1 -1
  113. django_cfg/core/config.py +75 -4
  114. django_cfg/core/generation.py +25 -4
  115. django_cfg/core/integration/README.md +363 -0
  116. django_cfg/core/integration/__init__.py +47 -0
  117. django_cfg/core/integration/commands_collector.py +239 -0
  118. django_cfg/core/integration/display/__init__.py +15 -0
  119. django_cfg/core/integration/display/base.py +157 -0
  120. django_cfg/core/integration/display/ngrok.py +164 -0
  121. django_cfg/core/integration/display/startup.py +815 -0
  122. django_cfg/core/integration/url_integration.py +123 -0
  123. django_cfg/core/integration/version_checker.py +160 -0
  124. django_cfg/management/commands/auto_generate.py +4 -0
  125. django_cfg/management/commands/check_settings.py +6 -0
  126. django_cfg/management/commands/clear_constance.py +5 -2
  127. django_cfg/management/commands/create_token.py +6 -0
  128. django_cfg/management/commands/list_urls.py +6 -0
  129. django_cfg/management/commands/migrate_all.py +6 -0
  130. django_cfg/management/commands/migrator.py +3 -0
  131. django_cfg/management/commands/rundramatiq.py +6 -0
  132. django_cfg/management/commands/runserver_ngrok.py +51 -29
  133. django_cfg/management/commands/script.py +6 -0
  134. django_cfg/management/commands/show_config.py +12 -2
  135. django_cfg/management/commands/show_urls.py +4 -0
  136. django_cfg/management/commands/superuser.py +6 -0
  137. django_cfg/management/commands/task_clear.py +4 -1
  138. django_cfg/management/commands/task_status.py +3 -1
  139. django_cfg/management/commands/test_email.py +3 -0
  140. django_cfg/management/commands/test_telegram.py +6 -0
  141. django_cfg/management/commands/test_twilio.py +6 -0
  142. django_cfg/management/commands/tree.py +6 -0
  143. django_cfg/management/commands/validate_config.py +155 -149
  144. django_cfg/models/constance.py +31 -11
  145. django_cfg/models/payments.py +175 -498
  146. django_cfg/modules/django_currency/__init__.py +16 -11
  147. django_cfg/modules/django_currency/clients/__init__.py +4 -4
  148. django_cfg/modules/django_currency/clients/coinpaprika_client.py +289 -0
  149. django_cfg/modules/django_currency/clients/yahoo_client.py +157 -0
  150. django_cfg/modules/django_currency/core/__init__.py +1 -7
  151. django_cfg/modules/django_currency/core/converter.py +18 -23
  152. django_cfg/modules/django_currency/core/models.py +122 -11
  153. django_cfg/modules/django_currency/database/__init__.py +4 -4
  154. django_cfg/modules/django_currency/database/database_loader.py +190 -309
  155. django_cfg/modules/django_logger.py +160 -146
  156. django_cfg/modules/django_unfold/dashboard.py +65 -12
  157. django_cfg/registry/core.py +1 -0
  158. django_cfg/template_archive/django_sample.zip +0 -0
  159. django_cfg/templates/admin/components/action_grid.html +9 -9
  160. django_cfg/templates/admin/components/metric_card.html +5 -5
  161. django_cfg/templates/admin/components/status_badge.html +2 -2
  162. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +152 -24
  163. django_cfg/templates/admin/snippets/components/quick_actions.html +3 -3
  164. django_cfg/templates/admin/snippets/components/system_health.html +1 -1
  165. django_cfg/templates/admin/snippets/tabs/overview_tab.html +49 -52
  166. django_cfg/utils/smart_defaults.py +222 -571
  167. django_cfg/utils/toolkit.py +51 -11
  168. {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/METADATA +5 -4
  169. {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/RECORD +172 -182
  170. django_cfg/apps/payments/__init__.py +0 -8
  171. django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
  172. django_cfg/apps/payments/config/module.py +0 -70
  173. django_cfg/apps/payments/config/providers.py +0 -105
  174. django_cfg/apps/payments/config/settings.py +0 -96
  175. django_cfg/apps/payments/config/utils.py +0 -52
  176. django_cfg/apps/payments/decorators.py +0 -291
  177. django_cfg/apps/payments/management/commands/README.md +0 -178
  178. django_cfg/apps/payments/management/commands/currency_stats.py +0 -323
  179. django_cfg/apps/payments/management/commands/populate_currencies.py +0 -246
  180. django_cfg/apps/payments/management/commands/update_currencies.py +0 -336
  181. django_cfg/apps/payments/managers/__init__.py +0 -22
  182. django_cfg/apps/payments/managers/api_key_manager.py +0 -35
  183. django_cfg/apps/payments/managers/balance_manager.py +0 -361
  184. django_cfg/apps/payments/managers/currency_manager.py +0 -83
  185. django_cfg/apps/payments/managers/payment_manager.py +0 -44
  186. django_cfg/apps/payments/managers/subscription_manager.py +0 -37
  187. django_cfg/apps/payments/managers/tariff_manager.py +0 -29
  188. django_cfg/apps/payments/models/events.py +0 -73
  189. django_cfg/apps/payments/serializers/__init__.py +0 -56
  190. django_cfg/apps/payments/serializers/api_keys.py +0 -51
  191. django_cfg/apps/payments/serializers/balance.py +0 -59
  192. django_cfg/apps/payments/serializers/currencies.py +0 -55
  193. django_cfg/apps/payments/serializers/payments.py +0 -62
  194. django_cfg/apps/payments/serializers/subscriptions.py +0 -71
  195. django_cfg/apps/payments/serializers/tariffs.py +0 -56
  196. django_cfg/apps/payments/services/billing/__init__.py +0 -8
  197. django_cfg/apps/payments/services/cache/base.py +0 -30
  198. django_cfg/apps/payments/services/core/fallback_service.py +0 -432
  199. django_cfg/apps/payments/services/internal_types.py +0 -297
  200. django_cfg/apps/payments/services/middleware/__init__.py +0 -8
  201. django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
  202. django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -222
  203. django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
  204. django_cfg/apps/payments/services/providers/cryptapi.py +0 -273
  205. django_cfg/apps/payments/services/providers/cryptomus.py +0 -311
  206. django_cfg/apps/payments/services/security/__init__.py +0 -34
  207. django_cfg/apps/payments/services/security/error_handler.py +0 -637
  208. django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
  209. django_cfg/apps/payments/services/security/webhook_validator.py +0 -475
  210. django_cfg/apps/payments/services/validators/__init__.py +0 -8
  211. django_cfg/apps/payments/static/payments/css/payments.css +0 -340
  212. django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
  213. django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
  214. django_cfg/apps/payments/static/payments/js/theme.js +0 -86
  215. django_cfg/apps/payments/tasks/__init__.py +0 -12
  216. django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
  217. django_cfg/apps/payments/templates/payments/base.html +0 -182
  218. django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
  219. django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
  220. django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -36
  221. django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
  222. django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -27
  223. django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -144
  224. django_cfg/apps/payments/templates/payments/dashboard.html +0 -346
  225. django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
  226. django_cfg/apps/payments/urls_templates.py +0 -52
  227. django_cfg/apps/payments/utils/__init__.py +0 -45
  228. django_cfg/apps/payments/utils/billing_utils.py +0 -342
  229. django_cfg/apps/payments/utils/config_utils.py +0 -245
  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 -62
  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 -111
  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 -312
  241. django_cfg/apps/payments/views/templates/base.py +0 -204
  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 -164
  245. django_cfg/apps/payments/views/templates/qr_code.py +0 -174
  246. django_cfg/apps/payments/views/templates/stats.py +0 -240
  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 -65
  250. django_cfg/core/integration.py +0 -160
  251. django_cfg/modules/django_currency/clients/coingecko_client.py +0 -257
  252. django_cfg/modules/django_currency/clients/yfinance_client.py +0 -246
  253. django_cfg/template_archive/.gitignore +0 -1
  254. django_cfg/template_archive/__init__.py +0 -0
  255. django_cfg/urls.py +0 -33
  256. {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
  257. {django_cfg-1.2.29.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
  258. {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.
@@ -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
+ ]