django-cfg 1.4.9__py3-none-any.whl โ†’ 1.4.11__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 (193) hide show
  1. django_cfg/apps/agents/management/commands/create_agent.py +1 -1
  2. django_cfg/apps/agents/management/commands/orchestrator_status.py +3 -3
  3. django_cfg/apps/newsletter/serializers.py +40 -3
  4. django_cfg/apps/newsletter/views/campaigns.py +12 -3
  5. django_cfg/apps/newsletter/views/emails.py +14 -3
  6. django_cfg/apps/newsletter/views/subscriptions.py +12 -2
  7. django_cfg/apps/payments/middleware/api_access.py +6 -2
  8. django_cfg/apps/payments/middleware/rate_limiting.py +2 -1
  9. django_cfg/apps/payments/middleware/usage_tracking.py +5 -1
  10. django_cfg/apps/payments/models/managers/api_key_managers.py +0 -1
  11. django_cfg/apps/payments/models/managers/subscription_managers.py +0 -1
  12. django_cfg/apps/payments/services/core/balance_service.py +5 -5
  13. django_cfg/apps/payments/services/core/subscription_service.py +1 -2
  14. django_cfg/apps/payments/views/api/balances.py +8 -7
  15. django_cfg/apps/payments/views/api/base.py +10 -6
  16. django_cfg/apps/payments/views/api/currencies.py +53 -10
  17. django_cfg/apps/payments/views/api/payments.py +3 -1
  18. django_cfg/apps/payments/views/api/subscriptions.py +2 -5
  19. django_cfg/apps/payments/views/api/webhooks.py +72 -7
  20. django_cfg/apps/payments/views/overview/serializers.py +34 -1
  21. django_cfg/apps/payments/views/overview/views.py +2 -1
  22. django_cfg/apps/payments/views/serializers/payments.py +6 -6
  23. django_cfg/apps/urls.py +106 -45
  24. django_cfg/core/base/config_model.py +2 -2
  25. django_cfg/core/constants.py +1 -1
  26. django_cfg/core/generation/integration_generators/__init__.py +1 -1
  27. django_cfg/core/generation/integration_generators/api.py +82 -41
  28. django_cfg/core/integration/display/startup.py +30 -22
  29. django_cfg/core/integration/url_integration.py +15 -16
  30. django_cfg/dashboard/sections/documentation.py +391 -0
  31. django_cfg/management/commands/check_endpoints.py +11 -160
  32. django_cfg/management/commands/check_settings.py +13 -265
  33. django_cfg/management/commands/clear_constance.py +13 -201
  34. django_cfg/management/commands/create_token.py +13 -321
  35. django_cfg/management/commands/generate_clients.py +23 -0
  36. django_cfg/management/commands/list_urls.py +13 -306
  37. django_cfg/management/commands/migrate_all.py +13 -126
  38. django_cfg/management/commands/migrator.py +13 -396
  39. django_cfg/management/commands/rundramatiq.py +15 -247
  40. django_cfg/management/commands/rundramatiq_simulator.py +12 -429
  41. django_cfg/management/commands/runserver_ngrok.py +15 -160
  42. django_cfg/management/commands/script.py +12 -488
  43. django_cfg/management/commands/show_config.py +12 -215
  44. django_cfg/management/commands/show_urls.py +12 -342
  45. django_cfg/management/commands/superuser.py +15 -295
  46. django_cfg/management/commands/task_clear.py +14 -217
  47. django_cfg/management/commands/task_status.py +13 -248
  48. django_cfg/management/commands/test_email.py +15 -86
  49. django_cfg/management/commands/test_telegram.py +14 -61
  50. django_cfg/management/commands/test_twilio.py +15 -105
  51. django_cfg/management/commands/tree.py +13 -383
  52. django_cfg/management/commands/validate_openapi.py +10 -0
  53. django_cfg/middleware/README.md +1 -1
  54. django_cfg/middleware/user_activity.py +3 -3
  55. django_cfg/models/__init__.py +2 -2
  56. django_cfg/models/api/drf/spectacular.py +6 -6
  57. django_cfg/models/django/__init__.py +2 -2
  58. django_cfg/models/django/openapi.py +238 -0
  59. django_cfg/models/django/{revolution.py โ†’ revolution_legacy.py} +8 -0
  60. django_cfg/modules/django_admin/management/__init__.py +0 -0
  61. django_cfg/modules/django_admin/management/commands/__init__.py +0 -0
  62. django_cfg/modules/django_admin/management/commands/check_endpoints.py +169 -0
  63. django_cfg/modules/django_admin/management/commands/check_settings.py +355 -0
  64. django_cfg/modules/django_admin/management/commands/clear_constance.py +208 -0
  65. django_cfg/modules/django_admin/management/commands/create_token.py +328 -0
  66. django_cfg/modules/django_admin/management/commands/list_urls.py +313 -0
  67. django_cfg/modules/django_admin/management/commands/migrate_all.py +133 -0
  68. django_cfg/modules/django_admin/management/commands/migrator.py +403 -0
  69. django_cfg/modules/django_admin/management/commands/script.py +496 -0
  70. django_cfg/modules/django_admin/management/commands/show_config.py +225 -0
  71. django_cfg/modules/django_admin/management/commands/show_urls.py +361 -0
  72. django_cfg/modules/django_admin/management/commands/superuser.py +302 -0
  73. django_cfg/modules/django_admin/management/commands/tree.py +390 -0
  74. django_cfg/modules/django_client/__init__.py +20 -0
  75. django_cfg/modules/django_client/apps.py +35 -0
  76. django_cfg/modules/django_client/core/__init__.py +56 -0
  77. django_cfg/modules/django_client/core/archive/__init__.py +11 -0
  78. django_cfg/modules/django_client/core/archive/manager.py +134 -0
  79. django_cfg/modules/django_client/core/cli/__init__.py +12 -0
  80. django_cfg/modules/django_client/core/cli/main.py +235 -0
  81. django_cfg/modules/django_client/core/config/__init__.py +18 -0
  82. django_cfg/modules/django_client/core/config/config.py +188 -0
  83. django_cfg/modules/django_client/core/config/group.py +101 -0
  84. django_cfg/modules/django_client/core/config/service.py +209 -0
  85. django_cfg/modules/django_client/core/generator/__init__.py +115 -0
  86. django_cfg/modules/django_client/core/generator/base.py +767 -0
  87. django_cfg/modules/django_client/core/generator/python.py +751 -0
  88. django_cfg/modules/django_client/core/generator/templates/python/__init__.py.jinja +9 -0
  89. django_cfg/modules/django_client/core/generator/templates/python/api_wrapper.py.jinja +130 -0
  90. django_cfg/modules/django_client/core/generator/templates/python/app_init.py.jinja +6 -0
  91. django_cfg/modules/django_client/core/generator/templates/python/client/app_client.py.jinja +18 -0
  92. django_cfg/modules/django_client/core/generator/templates/python/client/flat_client.py.jinja +38 -0
  93. django_cfg/modules/django_client/core/generator/templates/python/client/main_client.py.jinja +50 -0
  94. django_cfg/modules/django_client/core/generator/templates/python/client/main_client_file.py.jinja +13 -0
  95. django_cfg/modules/django_client/core/generator/templates/python/client/operation_method.py.jinja +7 -0
  96. django_cfg/modules/django_client/core/generator/templates/python/client/sub_client.py.jinja +11 -0
  97. django_cfg/modules/django_client/core/generator/templates/python/client_file.py.jinja +13 -0
  98. django_cfg/modules/django_client/core/generator/templates/python/main_init.py.jinja +50 -0
  99. django_cfg/modules/django_client/core/generator/templates/python/models/app_models.py.jinja +17 -0
  100. django_cfg/modules/django_client/core/generator/templates/python/models/enum_class.py.jinja +15 -0
  101. django_cfg/modules/django_client/core/generator/templates/python/models/enums.py.jinja +8 -0
  102. django_cfg/modules/django_client/core/generator/templates/python/models/models.py.jinja +17 -0
  103. django_cfg/modules/django_client/core/generator/templates/python/models/schema_class.py.jinja +19 -0
  104. django_cfg/modules/django_client/core/generator/templates/python/utils/logger.py.jinja +255 -0
  105. django_cfg/modules/django_client/core/generator/templates/python/utils/schema.py.jinja +12 -0
  106. django_cfg/modules/django_client/core/generator/templates/typescript/app_index.ts.jinja +2 -0
  107. django_cfg/modules/django_client/core/generator/templates/typescript/client/app_client.ts.jinja +18 -0
  108. django_cfg/modules/django_client/core/generator/templates/typescript/client/client.ts.jinja +327 -0
  109. django_cfg/modules/django_client/core/generator/templates/typescript/client/flat_client.ts.jinja +109 -0
  110. django_cfg/modules/django_client/core/generator/templates/typescript/client/main_client_file.ts.jinja +9 -0
  111. django_cfg/modules/django_client/core/generator/templates/typescript/client/operation.ts.jinja +61 -0
  112. django_cfg/modules/django_client/core/generator/templates/typescript/client/sub_client.ts.jinja +15 -0
  113. django_cfg/modules/django_client/core/generator/templates/typescript/client_file.ts.jinja +9 -0
  114. django_cfg/modules/django_client/core/generator/templates/typescript/index.ts.jinja +5 -0
  115. django_cfg/modules/django_client/core/generator/templates/typescript/main_index.ts.jinja +206 -0
  116. django_cfg/modules/django_client/core/generator/templates/typescript/models/app_models.ts.jinja +8 -0
  117. django_cfg/modules/django_client/core/generator/templates/typescript/models/enums.ts.jinja +4 -0
  118. django_cfg/modules/django_client/core/generator/templates/typescript/models/models.ts.jinja +8 -0
  119. django_cfg/modules/django_client/core/generator/templates/typescript/utils/errors.ts.jinja +114 -0
  120. django_cfg/modules/django_client/core/generator/templates/typescript/utils/http.ts.jinja +98 -0
  121. django_cfg/modules/django_client/core/generator/templates/typescript/utils/logger.ts.jinja +251 -0
  122. django_cfg/modules/django_client/core/generator/templates/typescript/utils/schema.ts.jinja +7 -0
  123. django_cfg/modules/django_client/core/generator/templates/typescript/utils/storage.ts.jinja +114 -0
  124. django_cfg/modules/django_client/core/generator/typescript.py +872 -0
  125. django_cfg/modules/django_client/core/groups/__init__.py +13 -0
  126. django_cfg/modules/django_client/core/groups/detector.py +178 -0
  127. django_cfg/modules/django_client/core/groups/manager.py +314 -0
  128. django_cfg/modules/django_client/core/ir/__init__.py +57 -0
  129. django_cfg/modules/django_client/core/ir/context.py +387 -0
  130. django_cfg/modules/django_client/core/ir/operation.py +518 -0
  131. django_cfg/modules/django_client/core/ir/schema.py +353 -0
  132. django_cfg/modules/django_client/core/parser/__init__.py +74 -0
  133. django_cfg/modules/django_client/core/parser/base.py +648 -0
  134. django_cfg/modules/django_client/core/parser/models/__init__.py +74 -0
  135. django_cfg/modules/django_client/core/parser/models/base.py +212 -0
  136. django_cfg/modules/django_client/core/parser/models/components.py +160 -0
  137. django_cfg/modules/django_client/core/parser/models/openapi.py +203 -0
  138. django_cfg/modules/django_client/core/parser/models/operation.py +207 -0
  139. django_cfg/modules/django_client/core/parser/models/schema.py +266 -0
  140. django_cfg/modules/django_client/core/parser/openapi30.py +56 -0
  141. django_cfg/modules/django_client/core/parser/openapi31.py +64 -0
  142. django_cfg/modules/django_client/core/validation/__init__.py +22 -0
  143. django_cfg/modules/django_client/core/validation/checker.py +134 -0
  144. django_cfg/modules/django_client/core/validation/fixer.py +216 -0
  145. django_cfg/modules/django_client/core/validation/reporter.py +480 -0
  146. django_cfg/modules/django_client/core/validation/rules/__init__.py +11 -0
  147. django_cfg/modules/django_client/core/validation/rules/base.py +96 -0
  148. django_cfg/modules/django_client/core/validation/rules/type_hints.py +288 -0
  149. django_cfg/modules/django_client/core/validation/safety.py +266 -0
  150. django_cfg/modules/django_client/management/__init__.py +3 -0
  151. django_cfg/modules/django_client/management/commands/__init__.py +3 -0
  152. django_cfg/modules/django_client/management/commands/generate_client.py +422 -0
  153. django_cfg/modules/django_client/management/commands/validate_openapi.py +343 -0
  154. django_cfg/modules/django_client/spectacular/__init__.py +9 -0
  155. django_cfg/modules/django_client/spectacular/enum_naming.py +192 -0
  156. django_cfg/modules/django_client/urls.py +72 -0
  157. django_cfg/modules/django_email/management/__init__.py +0 -0
  158. django_cfg/modules/django_email/management/commands/__init__.py +0 -0
  159. django_cfg/modules/django_email/management/commands/test_email.py +93 -0
  160. django_cfg/modules/django_logging/django_logger.py +6 -6
  161. django_cfg/modules/django_ngrok/management/__init__.py +0 -0
  162. django_cfg/modules/django_ngrok/management/commands/__init__.py +0 -0
  163. django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +167 -0
  164. django_cfg/modules/django_tasks/management/__init__.py +0 -0
  165. django_cfg/modules/django_tasks/management/commands/__init__.py +0 -0
  166. django_cfg/modules/django_tasks/management/commands/rundramatiq.py +254 -0
  167. django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +437 -0
  168. django_cfg/modules/django_tasks/management/commands/task_clear.py +226 -0
  169. django_cfg/modules/django_tasks/management/commands/task_status.py +257 -0
  170. django_cfg/modules/django_telegram/management/__init__.py +0 -0
  171. django_cfg/modules/django_telegram/management/commands/__init__.py +0 -0
  172. django_cfg/modules/django_telegram/management/commands/test_telegram.py +68 -0
  173. django_cfg/modules/django_twilio/management/__init__.py +0 -0
  174. django_cfg/modules/django_twilio/management/commands/__init__.py +0 -0
  175. django_cfg/modules/django_twilio/management/commands/test_twilio.py +112 -0
  176. django_cfg/modules/django_unfold/callbacks/main.py +16 -5
  177. django_cfg/modules/django_unfold/callbacks/revolution.py +41 -36
  178. django_cfg/modules/django_unfold/dashboard.py +1 -1
  179. django_cfg/pyproject.toml +2 -6
  180. django_cfg/registry/third_party.py +5 -7
  181. django_cfg/routing/callbacks.py +1 -1
  182. django_cfg/static/admin/css/prose-unfold.css +666 -0
  183. django_cfg/templates/admin/index.html +8 -0
  184. django_cfg/templates/admin/index_new.html +13 -0
  185. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +15 -3
  186. django_cfg/templates/admin/sections/documentation_section.html +172 -0
  187. django_cfg/templates/admin/snippets/tabs/documentation_tab.html +231 -0
  188. {django_cfg-1.4.9.dist-info โ†’ django_cfg-1.4.11.dist-info}/METADATA +2 -2
  189. {django_cfg-1.4.9.dist-info โ†’ django_cfg-1.4.11.dist-info}/RECORD +192 -71
  190. django_cfg/management/commands/generate.py +0 -107
  191. {django_cfg-1.4.9.dist-info โ†’ django_cfg-1.4.11.dist-info}/WHEEL +0 -0
  192. {django_cfg-1.4.9.dist-info โ†’ django_cfg-1.4.11.dist-info}/entry_points.txt +0 -0
  193. {django_cfg-1.4.9.dist-info โ†’ django_cfg-1.4.11.dist-info}/licenses/LICENSE +0 -0
@@ -1,169 +1,20 @@
1
1
  """
2
- Django management command to check all API endpoints status.
2
+ Django-CFG wrapper for check_endpoints command.
3
+
4
+ This is a simple alias for django_admin.management.commands.check_endpoints.
5
+ All logic is in django_admin module.
3
6
 
4
7
  Usage:
5
8
  python manage.py check_endpoints
6
- python manage.py check_endpoints --include-unnamed
7
- python manage.py check_endpoints --timeout 10
8
- python manage.py check_endpoints --json
9
9
  """
10
10
 
11
- from django.core.management.base import BaseCommand
12
- from django.urls import reverse
13
- from django_cfg.apps.api.endpoints.checker import check_all_endpoints
14
- import json
15
-
16
-
17
- class Command(BaseCommand):
18
- help = 'Check status of all Django CFG API endpoints'
19
-
20
- def add_arguments(self, parser):
21
- parser.add_argument(
22
- '--include-unnamed',
23
- action='store_true',
24
- help='Include unnamed URL patterns in the check',
25
- )
26
- parser.add_argument(
27
- '--timeout',
28
- type=int,
29
- default=5,
30
- help='Request timeout in seconds (default: 5)',
31
- )
32
- parser.add_argument(
33
- '--json',
34
- action='store_true',
35
- help='Output results as JSON',
36
- )
37
- parser.add_argument(
38
- '--url',
39
- type=str,
40
- help='Check specific endpoint by URL name (e.g., "endpoints_status")',
41
- )
42
- parser.add_argument(
43
- '--no-auth',
44
- action='store_true',
45
- help='Disable automatic JWT authentication retry (default: enabled)',
46
- )
47
-
48
- def handle(self, *args, **options):
49
- include_unnamed = options['include_unnamed']
50
- timeout = options['timeout']
51
- output_json = options['json']
52
- url_name = options.get('url')
53
- auto_auth = not options['no_auth'] # Auto-auth enabled by default
54
-
55
- # If specific URL requested, just resolve and display it
56
- if url_name:
57
- try:
58
- url = reverse(url_name)
59
- self.stdout.write(self.style.SUCCESS(f'โœ… URL name "{url_name}" resolves to: {url}'))
60
- return
61
- except Exception as e:
62
- self.stdout.write(self.style.ERROR(f'โŒ Error resolving URL "{url_name}": {e}'))
63
- return
64
-
65
- # Check all endpoints
66
- auth_msg = "with auto-auth" if auto_auth else "without auth"
67
- self.stdout.write(self.style.WARNING(f'๐Ÿ” Checking endpoints (timeout: {timeout}s, {auth_msg})...'))
68
-
69
- status_data = check_all_endpoints(
70
- include_unnamed=include_unnamed,
71
- timeout=timeout,
72
- auto_auth=auto_auth
73
- )
74
-
75
- # Output as JSON if requested
76
- if output_json:
77
- self.stdout.write(json.dumps(status_data, indent=2))
78
- return
79
-
80
- # Pretty print results
81
- self._print_results(status_data)
82
-
83
- def _print_results(self, data):
84
- """Print formatted results to console."""
85
-
86
- # Overall status
87
- status = data['status']
88
- if status == 'healthy':
89
- status_style = self.style.SUCCESS
90
- emoji = 'โœ…'
91
- elif status == 'degraded':
92
- status_style = self.style.WARNING
93
- emoji = 'โš ๏ธ'
94
- else:
95
- status_style = self.style.ERROR
96
- emoji = 'โŒ'
97
-
98
- self.stdout.write('')
99
- self.stdout.write(status_style(f'{emoji} Overall Status: {status.upper()}'))
100
- self.stdout.write('')
101
-
102
- # Summary
103
- self.stdout.write(self.style.HTTP_INFO('๐Ÿ“Š Summary:'))
104
- self.stdout.write(f' Total endpoints: {data["total_endpoints"]}')
105
- self.stdout.write(self.style.SUCCESS(f' โœ… Healthy: {data["healthy"]}'))
106
- self.stdout.write(self.style.WARNING(f' โš ๏ธ Warnings: {data["warnings"]}'))
107
- self.stdout.write(self.style.ERROR(f' โŒ Unhealthy: {data["unhealthy"]}'))
108
- self.stdout.write(self.style.ERROR(f' โŒ Errors: {data["errors"]}'))
109
- self.stdout.write(f' โญ๏ธ Skipped: {data["skipped"]}')
110
- self.stdout.write('')
111
-
112
- # Endpoints details
113
- self.stdout.write(self.style.HTTP_INFO('๐Ÿ”— Endpoints:'))
114
-
115
- for endpoint in data['endpoints']:
116
- name = endpoint.get('url_name') or 'unnamed'
117
- url = endpoint['url']
118
- status = endpoint['status']
119
-
120
- if status == 'healthy':
121
- icon = 'โœ…'
122
- style = self.style.SUCCESS
123
- elif status == 'degraded':
124
- icon = 'โš ๏ธ'
125
- style = self.style.WARNING
126
- else:
127
- icon = 'โŒ'
128
- style = self.style.ERROR
129
-
130
- self.stdout.write(f' {icon} {name}')
131
-
132
- # Show both pattern and resolved URL for parametrized endpoints
133
- if endpoint.get('has_parameters') and endpoint.get('url_pattern'):
134
- self.stdout.write(f' Pattern: {endpoint["url_pattern"]}')
135
- self.stdout.write(f' Resolved: {url}')
136
- else:
137
- self.stdout.write(f' URL: {url}')
138
-
139
- # Show status with status code
140
- status_code = endpoint.get('status_code')
141
- if status_code:
142
- self.stdout.write(style(f' Status: {status} ({status_code})'))
143
- else:
144
- self.stdout.write(style(f' Status: {status}'))
145
-
146
- if endpoint.get('response_time_ms'):
147
- self.stdout.write(f' Response time: {endpoint["response_time_ms"]:.2f}ms')
148
-
149
- if endpoint.get('error'):
150
- error_type = endpoint.get('error_type', 'general')
151
- if error_type == 'database':
152
- self.stdout.write(self.style.WARNING(f' โš ๏ธ DB Error (multi-db): {endpoint["error"]}'))
153
- else:
154
- self.stdout.write(self.style.ERROR(f' Error: {endpoint["error"]}'))
155
-
156
- # Show reason for warnings (e.g., 404 explanations)
157
- if endpoint.get('reason') and status == 'warning':
158
- self.stdout.write(self.style.WARNING(f' โš ๏ธ {endpoint["reason"]}'))
159
-
160
- if endpoint.get('required_auth'):
161
- self.stdout.write(f' ๐Ÿ” Required JWT authentication')
11
+ from django_cfg.modules.django_admin.management.commands.check_endpoints import Command as CheckEndpointsCommand
162
12
 
163
- if endpoint.get('rate_limited'):
164
- self.stdout.write(f' โฑ๏ธ Rate limited (429)')
165
13
 
166
- self.stdout.write('')
14
+ class Command(CheckEndpointsCommand):
15
+ """
16
+ Alias for check_endpoints command.
167
17
 
168
- # Timestamp
169
- self.stdout.write(self.style.HTTP_INFO(f'๐Ÿ• Checked at: {data["timestamp"]}'))
18
+ Simply inherits from CheckEndpointsCommand without any changes.
19
+ """
20
+ pass
@@ -1,272 +1,20 @@
1
1
  """
2
- Django CFG Settings Checker
2
+ Django-CFG wrapper for check_settings command.
3
3
 
4
- Comprehensive validation and debugging tool for django-cfg configuration.
5
- Helps diagnose email, database, and other configuration issues.
6
- """
7
-
8
- import os
9
- import sys
10
- from pathlib import Path
11
- from django.core.management.base import BaseCommand
12
- from django.conf import settings
13
- from django.core.exceptions import ImproperlyConfigured
14
- from django.core.mail import get_connection
15
- from datetime import datetime
16
- from django_cfg.modules.django_logging import get_logger
17
-
18
-
19
-
20
- logger = get_logger('check_settings')
21
-
22
- class Command(BaseCommand):
23
- """Command to check and debug django-cfg settings."""
24
-
25
- # Web execution metadata
26
- web_executable = True
27
- requires_input = False
28
- is_destructive = False
4
+ This is a simple alias for django_admin.management.commands.check_settings.
5
+ All logic is in django_admin module.
29
6
 
30
- help = "Check and debug django-cfg configuration settings"
31
-
32
- def add_arguments(self, parser):
33
- parser.add_argument(
34
- '--email-test',
35
- action='store_true',
36
- help='Test email configuration and SMTP connection'
37
- )
38
- parser.add_argument(
39
- '--verbose',
40
- action='store_true',
41
- help='Show detailed configuration information'
42
- )
43
-
44
- def handle(self, *args, **options):
45
- """Main command handler."""
46
- logger.info("Starting check_settings command")
47
- self.stdout.write(self.style.SUCCESS("\n๐Ÿ” Django CFG Settings Checker\n"))
48
-
49
- # Show basic info
50
- self.show_environment_info()
51
- self.show_email_config()
52
-
53
- if options['verbose']:
54
- self.show_database_config()
55
- self.show_app_config()
56
- self.show_cors_config()
57
-
58
- if options['email_test']:
59
- self.test_email_connection()
60
-
61
- def show_environment_info(self):
62
- """Show environment and debug information."""
63
- self.stdout.write(self.style.SUCCESS("๐ŸŒ Environment Information:"))
64
-
65
- # Debug mode
66
- debug = getattr(settings, 'DEBUG', False)
67
- self.stdout.write(f" ๐Ÿž DEBUG: {debug}")
68
-
69
- # Environment detection
70
- env_vars = {
71
- 'DJANGO_SETTINGS_MODULE': os.environ.get('DJANGO_SETTINGS_MODULE', 'Not set'),
72
- 'ENVIRONMENT': os.environ.get('ENVIRONMENT', 'Not set'),
73
- }
74
-
75
- for key, value in env_vars.items():
76
- self.stdout.write(f" ๐Ÿ“ {key}: {value}")
77
-
78
- def show_email_config(self):
79
- """Show detailed email configuration."""
80
- self.stdout.write(self.style.SUCCESS("\n๐Ÿ“ง Email Configuration:"))
81
-
82
- # Basic email settings
83
- email_settings = {
84
- 'EMAIL_BACKEND': getattr(settings, 'EMAIL_BACKEND', 'Not set'),
85
- 'EMAIL_HOST': getattr(settings, 'EMAIL_HOST', 'Not set'),
86
- 'EMAIL_PORT': getattr(settings, 'EMAIL_PORT', 'Not set'),
87
- 'EMAIL_USE_TLS': getattr(settings, 'EMAIL_USE_TLS', 'Not set'),
88
- 'EMAIL_USE_SSL': getattr(settings, 'EMAIL_USE_SSL', 'Not set'),
89
- 'EMAIL_HOST_USER': getattr(settings, 'EMAIL_HOST_USER', 'Not set'),
90
- 'DEFAULT_FROM_EMAIL': getattr(settings, 'DEFAULT_FROM_EMAIL', 'Not set'),
91
- }
92
-
93
- # Show password status (not actual password)
94
- password_set = bool(getattr(settings, 'EMAIL_HOST_PASSWORD', None))
95
- email_settings['EMAIL_HOST_PASSWORD'] = '***SET***' if password_set else 'Not set'
96
-
97
- for key, value in email_settings.items():
98
- icon = "โœ…" if value != 'Not set' else "โŒ"
99
- self.stdout.write(f" {icon} {key}: {value}")
100
-
101
- # Analyze backend type
102
- backend = email_settings['EMAIL_BACKEND']
103
- if 'console' in backend:
104
- self.stdout.write(self.style.WARNING(" โš ๏ธ Console backend - emails will be printed to console"))
105
- elif 'locmem' in backend:
106
- self.stdout.write(self.style.WARNING(" โš ๏ธ Local memory backend - emails stored in memory"))
107
- elif 'filebased' in backend:
108
- self.stdout.write(self.style.WARNING(" โš ๏ธ File backend - emails saved to files"))
109
- elif 'smtp' in backend:
110
- self.stdout.write(self.style.SUCCESS(" ๐Ÿ“ค SMTP backend - emails will be sent via SMTP"))
111
-
112
- # Check django-cfg email service
113
- try:
114
- from django_cfg.modules.django_email import DjangoEmailService
115
- email_service = DjangoEmailService()
116
- backend_info = email_service.get_backend_info()
117
-
118
- self.stdout.write(f"\n ๐Ÿ”ง Django CFG Email Service:")
119
- self.stdout.write(f" Backend: {backend_info['backend']}")
120
- self.stdout.write(f" Configured: {backend_info['configured']}")
121
-
122
- except Exception as e:
123
- self.stdout.write(self.style.ERROR(f" โŒ Django CFG Email Service error: {e}"))
124
-
125
- def show_database_config(self):
126
- """Show database configuration."""
127
- self.stdout.write(self.style.SUCCESS("\n๐Ÿ—„๏ธ Database Configuration:"))
128
-
129
- databases = getattr(settings, 'DATABASES', {})
130
- for db_name, db_config in databases.items():
131
- engine = db_config.get('ENGINE', 'Unknown')
132
- name = db_config.get('NAME', 'Unknown')
133
- host = db_config.get('HOST', 'localhost')
134
- port = db_config.get('PORT', 'default')
135
-
136
- self.stdout.write(f" ๐Ÿ“Š {db_name}:")
137
- self.stdout.write(f" Engine: {engine}")
138
- self.stdout.write(f" Name: {name}")
139
- if host and host != 'localhost':
140
- self.stdout.write(f" Host: {host}:{port}")
7
+ Usage:
8
+ python manage.py check_settings
9
+ """
141
10
 
142
- def show_app_config(self):
143
- """Show installed apps configuration."""
144
- self.stdout.write(self.style.SUCCESS("\n๐Ÿ“ฆ Django CFG Apps:"))
145
-
146
- installed_apps = getattr(settings, 'INSTALLED_APPS', [])
147
- cfg_apps = [app for app in installed_apps if 'django_cfg' in app]
148
-
149
- for app in cfg_apps:
150
- self.stdout.write(f" โœ… {app}")
151
-
152
- if not cfg_apps:
153
- self.stdout.write(" โŒ No django_cfg apps found")
11
+ from django_cfg.modules.django_admin.management.commands.check_settings import Command as CheckSettingsCommand
154
12
 
155
- def show_cors_config(self):
156
- """Show CORS and security configuration."""
157
- self.stdout.write(self.style.SUCCESS("\n๐ŸŒ CORS & Security Configuration:"))
158
-
159
- # Get current config
160
- try:
161
- from django_cfg.core.state import get_current_config
162
- config = get_current_config()
163
-
164
- if config:
165
- self.stdout.write(f" ๐Ÿ“‹ Security Domains: {config.security_domains}")
166
- self.stdout.write(f" ๐Ÿ”— CORS Headers: {config.cors_allow_headers}")
167
- self.stdout.write(f" ๐Ÿ”’ SSL Redirect: {config.ssl_redirect}")
168
- else:
169
- self.stdout.write(" โš ๏ธ No django-cfg config instance found")
170
-
171
- except Exception as e:
172
- self.stdout.write(self.style.ERROR(f" โŒ Error getting config: {e}"))
173
-
174
- # Show Django settings
175
- cors_settings = {
176
- 'CORS_ALLOW_ALL_ORIGINS': getattr(settings, 'CORS_ALLOW_ALL_ORIGINS', None),
177
- 'CORS_ALLOWED_ORIGINS': getattr(settings, 'CORS_ALLOWED_ORIGINS', None),
178
- 'CORS_ALLOW_CREDENTIALS': getattr(settings, 'CORS_ALLOW_CREDENTIALS', None),
179
- 'CORS_ALLOW_HEADERS': getattr(settings, 'CORS_ALLOW_HEADERS', None),
180
- 'CSRF_TRUSTED_ORIGINS': getattr(settings, 'CSRF_TRUSTED_ORIGINS', None),
181
- }
182
-
183
- self.stdout.write("\n ๐Ÿ”ง Generated Django Settings:")
184
- for key, value in cors_settings.items():
185
- if value is not None:
186
- icon = "โœ…"
187
- if key == 'CORS_ALLOW_HEADERS' and isinstance(value, list):
188
- # Show first few headers for readability
189
- display_value = value[:3] + ['...'] if len(value) > 3 else value
190
- self.stdout.write(f" {icon} {key}: {display_value} ({len(value)} total)")
191
- elif key in ['CORS_ALLOWED_ORIGINS', 'CSRF_TRUSTED_ORIGINS'] and isinstance(value, list):
192
- self.stdout.write(f" {icon} {key}: {value}")
193
- else:
194
- self.stdout.write(f" {icon} {key}: {value}")
195
- else:
196
- self.stdout.write(f" โญ• {key}: Not set")
197
-
198
- # Analysis
199
- self.stdout.write("\n ๐Ÿ“Š CORS Analysis:")
200
- if cors_settings['CORS_ALLOW_ALL_ORIGINS']:
201
- self.stdout.write(" ๐ŸŸก Development mode: All origins allowed")
202
- elif cors_settings['CORS_ALLOWED_ORIGINS']:
203
- origins_count = len(cors_settings['CORS_ALLOWED_ORIGINS'])
204
- self.stdout.write(f" ๐ŸŸข Production mode: {origins_count} specific origins allowed")
205
- else:
206
- self.stdout.write(" ๐Ÿ”ด No CORS origins configured")
207
13
 
208
- def test_email_connection(self):
209
- """Test email connection."""
210
- self.stdout.write(self.style.SUCCESS("\n๐Ÿงช Testing Email Connection:"))
211
-
212
- try:
213
- # Test Django's email connection
214
- connection = get_connection()
215
- connection.open()
216
- self.stdout.write(" โœ… Django email connection successful")
217
- connection.close()
218
-
219
- except Exception as e:
220
- self.stdout.write(self.style.ERROR(f" โŒ Django email connection failed: {e}"))
221
-
222
- try:
223
- # Test django-cfg email service
224
- from django_cfg.modules.django_email import DjangoEmailService
225
- email_service = DjangoEmailService()
226
-
227
- # Try to send a test email (dry run)
228
- self.stdout.write(" ๐Ÿ” Testing django-cfg email service...")
229
-
230
- # Just check if service can be initialized
231
- backend_info = email_service.get_backend_info()
232
- if backend_info['configured']:
233
- self.stdout.write(" โœ… Django CFG email service is properly configured")
234
- else:
235
- self.stdout.write(self.style.WARNING(" โš ๏ธ Django CFG email service configuration incomplete"))
236
-
237
- except Exception as e:
238
- self.stdout.write(self.style.ERROR(f" โŒ Django CFG email service test failed: {e}"))
239
-
240
- # Show recommendations
241
- self.show_email_recommendations()
14
+ class Command(CheckSettingsCommand):
15
+ """
16
+ Alias for check_settings command.
242
17
 
243
- def show_email_recommendations(self):
244
- """Show email configuration recommendations."""
245
- self.stdout.write(self.style.SUCCESS("\n๐Ÿ’ก Email Configuration Recommendations:"))
246
-
247
- backend = getattr(settings, 'EMAIL_BACKEND', '')
248
- debug = getattr(settings, 'DEBUG', False)
249
-
250
- if 'console' in backend and not debug:
251
- self.stdout.write(" โš ๏ธ Console backend in production - emails won't be delivered")
252
- self.stdout.write(" Consider switching to SMTP backend")
253
-
254
- if 'smtp' in backend:
255
- host = getattr(settings, 'EMAIL_HOST', '')
256
- user = getattr(settings, 'EMAIL_HOST_USER', '')
257
- password = getattr(settings, 'EMAIL_HOST_PASSWORD', '')
258
-
259
- if not host:
260
- self.stdout.write(" โŒ SMTP host not configured")
261
- if not user:
262
- self.stdout.write(" โŒ SMTP username not configured")
263
- if not password:
264
- self.stdout.write(" โŒ SMTP password not configured")
265
-
266
- if host and user and password:
267
- self.stdout.write(" โœ… SMTP configuration appears complete")
268
-
269
- self.stdout.write("\n ๐Ÿ“š For more help:")
270
- self.stdout.write(" - Check your config.dev.yaml email settings")
271
- self.stdout.write(" - Verify SMTP credentials with your email provider")
272
- self.stdout.write(" - Test with: python manage.py test_email")
18
+ Simply inherits from CheckSettingsCommand without any changes.
19
+ """
20
+ pass