django-cfg 1.4.10__py3-none-any.whl ā 1.4.13__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/apps/agents/management/commands/create_agent.py +1 -1
- django_cfg/apps/agents/management/commands/orchestrator_status.py +3 -3
- django_cfg/apps/newsletter/serializers.py +40 -3
- django_cfg/apps/newsletter/views/campaigns.py +12 -3
- django_cfg/apps/newsletter/views/emails.py +14 -3
- django_cfg/apps/newsletter/views/subscriptions.py +12 -2
- django_cfg/apps/payments/views/api/currencies.py +49 -6
- django_cfg/apps/payments/views/api/webhooks.py +72 -7
- django_cfg/apps/payments/views/overview/serializers.py +34 -1
- django_cfg/apps/payments/views/overview/views.py +2 -1
- django_cfg/apps/payments/views/serializers/payments.py +6 -6
- django_cfg/apps/urls.py +106 -45
- django_cfg/core/base/config_model.py +2 -2
- django_cfg/core/constants.py +1 -1
- django_cfg/core/generation/integration_generators/__init__.py +1 -1
- django_cfg/core/generation/integration_generators/api.py +73 -49
- django_cfg/core/integration/display/startup.py +30 -22
- django_cfg/core/integration/url_integration.py +15 -16
- django_cfg/management/commands/check_endpoints.py +11 -160
- django_cfg/management/commands/check_settings.py +13 -348
- django_cfg/management/commands/clear_constance.py +13 -201
- django_cfg/management/commands/create_token.py +13 -321
- django_cfg/management/commands/generate_clients.py +23 -0
- django_cfg/management/commands/list_urls.py +13 -306
- django_cfg/management/commands/migrate_all.py +13 -126
- django_cfg/management/commands/migrator.py +13 -396
- django_cfg/management/commands/rundramatiq.py +15 -247
- django_cfg/management/commands/rundramatiq_simulator.py +12 -429
- django_cfg/management/commands/runserver_ngrok.py +15 -160
- django_cfg/management/commands/script.py +12 -488
- django_cfg/management/commands/show_config.py +12 -215
- django_cfg/management/commands/show_urls.py +12 -342
- django_cfg/management/commands/superuser.py +15 -295
- django_cfg/management/commands/task_clear.py +14 -217
- django_cfg/management/commands/task_status.py +13 -248
- django_cfg/management/commands/test_email.py +15 -86
- django_cfg/management/commands/test_telegram.py +14 -61
- django_cfg/management/commands/test_twilio.py +15 -105
- django_cfg/management/commands/tree.py +13 -383
- django_cfg/management/commands/validate_openapi.py +10 -0
- django_cfg/middleware/README.md +1 -1
- django_cfg/middleware/user_activity.py +3 -3
- django_cfg/models/__init__.py +2 -2
- django_cfg/models/api/drf/spectacular.py +6 -6
- django_cfg/models/django/__init__.py +2 -2
- django_cfg/models/django/openapi.py +162 -0
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +169 -0
- django_cfg/modules/django_admin/management/commands/check_settings.py +355 -0
- django_cfg/modules/django_admin/management/commands/clear_constance.py +208 -0
- django_cfg/modules/django_admin/management/commands/create_token.py +328 -0
- django_cfg/modules/django_admin/management/commands/list_urls.py +313 -0
- django_cfg/modules/django_admin/management/commands/migrate_all.py +133 -0
- django_cfg/modules/django_admin/management/commands/migrator.py +403 -0
- django_cfg/modules/django_admin/management/commands/script.py +496 -0
- django_cfg/modules/django_admin/management/commands/show_config.py +225 -0
- django_cfg/modules/django_admin/management/commands/show_urls.py +361 -0
- django_cfg/modules/django_admin/management/commands/superuser.py +302 -0
- django_cfg/modules/django_admin/management/commands/tree.py +390 -0
- django_cfg/modules/django_client/__init__.py +20 -0
- django_cfg/modules/django_client/apps.py +35 -0
- django_cfg/modules/django_client/core/__init__.py +56 -0
- django_cfg/modules/django_client/core/archive/__init__.py +11 -0
- django_cfg/modules/django_client/core/archive/manager.py +134 -0
- django_cfg/modules/django_client/core/cli/__init__.py +12 -0
- django_cfg/modules/django_client/core/cli/main.py +235 -0
- django_cfg/modules/django_client/core/config/__init__.py +18 -0
- django_cfg/modules/django_client/core/config/config.py +208 -0
- django_cfg/modules/django_client/core/config/group.py +101 -0
- django_cfg/modules/django_client/core/config/service.py +209 -0
- django_cfg/modules/django_client/core/generator/__init__.py +115 -0
- django_cfg/modules/django_client/core/generator/base.py +838 -0
- django_cfg/modules/django_client/core/generator/python/__init__.py +16 -0
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +174 -0
- django_cfg/modules/django_client/core/generator/python/files_generator.py +180 -0
- django_cfg/modules/django_client/core/generator/python/generator.py +182 -0
- django_cfg/modules/django_client/core/generator/python/models_generator.py +318 -0
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +278 -0
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +102 -0
- django_cfg/modules/django_client/core/generator/python/templates/__init__.py.jinja +9 -0
- django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +153 -0
- django_cfg/modules/django_client/core/generator/python/templates/app_init.py.jinja +6 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/app_client.py.jinja +18 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/flat_client.py.jinja +38 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/main_client.py.jinja +68 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/main_client_file.py.jinja +14 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/operation_method.py.jinja +9 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/sub_client.py.jinja +18 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/sync_main_client.py.jinja +50 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/sync_operation_method.py.jinja +9 -0
- django_cfg/modules/django_client/core/generator/python/templates/client/sync_sub_client.py.jinja +18 -0
- django_cfg/modules/django_client/core/generator/python/templates/client_file.py.jinja +13 -0
- django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +52 -0
- django_cfg/modules/django_client/core/generator/python/templates/models/app_models.py.jinja +17 -0
- django_cfg/modules/django_client/core/generator/python/templates/models/enum_class.py.jinja +17 -0
- django_cfg/modules/django_client/core/generator/python/templates/models/enums.py.jinja +8 -0
- django_cfg/modules/django_client/core/generator/python/templates/models/models.py.jinja +17 -0
- django_cfg/modules/django_client/core/generator/python/templates/models/schema_class.py.jinja +21 -0
- django_cfg/modules/django_client/core/generator/python/templates/pyproject.toml.jinja +55 -0
- django_cfg/modules/django_client/core/generator/python/templates/utils/logger.py.jinja +255 -0
- django_cfg/modules/django_client/core/generator/python/templates/utils/retry.py.jinja +271 -0
- django_cfg/modules/django_client/core/generator/python/templates/utils/schema.py.jinja +12 -0
- django_cfg/modules/django_client/core/generator/typescript/__init__.py +14 -0
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +165 -0
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +428 -0
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +207 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +432 -0
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +536 -0
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +245 -0
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +298 -0
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +329 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/api_instance.ts.jinja +131 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/app_index.ts.jinja +2 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/app_client.ts.jinja +18 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +403 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/flat_client.ts.jinja +109 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/main_client_file.ts.jinja +10 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/operation.ts.jinja +61 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client/sub_client.ts.jinja +15 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/client_file.ts.jinja +9 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/fetchers.ts.jinja +45 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/fetchers/index.ts.jinja +30 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/index.ts.jinja +5 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +268 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/models/app_models.ts.jinja +8 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/models/enums.ts.jinja +4 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/models/models.ts.jinja +8 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/package.json.jinja +52 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/schemas/index.ts.jinja +21 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/schemas/schema.ts.jinja +24 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/tsconfig.json.jinja +20 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/errors.ts.jinja +116 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/http.ts.jinja +98 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/logger.ts.jinja +259 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/retry.ts.jinja +175 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/schema.ts.jinja +7 -0
- django_cfg/modules/django_client/core/generator/typescript/templates/utils/storage.ts.jinja +158 -0
- django_cfg/modules/django_client/core/groups/__init__.py +13 -0
- django_cfg/modules/django_client/core/groups/detector.py +178 -0
- django_cfg/modules/django_client/core/groups/manager.py +314 -0
- django_cfg/modules/django_client/core/ir/__init__.py +57 -0
- django_cfg/modules/django_client/core/ir/context.py +387 -0
- django_cfg/modules/django_client/core/ir/operation.py +518 -0
- django_cfg/modules/django_client/core/ir/schema.py +353 -0
- django_cfg/modules/django_client/core/parser/__init__.py +74 -0
- django_cfg/modules/django_client/core/parser/base.py +648 -0
- django_cfg/modules/django_client/core/parser/models/__init__.py +74 -0
- django_cfg/modules/django_client/core/parser/models/base.py +212 -0
- django_cfg/modules/django_client/core/parser/models/components.py +160 -0
- django_cfg/modules/django_client/core/parser/models/openapi.py +203 -0
- django_cfg/modules/django_client/core/parser/models/operation.py +207 -0
- django_cfg/modules/django_client/core/parser/models/schema.py +266 -0
- django_cfg/modules/django_client/core/parser/openapi30.py +56 -0
- django_cfg/modules/django_client/core/parser/openapi31.py +64 -0
- django_cfg/modules/django_client/core/validation/__init__.py +22 -0
- django_cfg/modules/django_client/core/validation/checker.py +134 -0
- django_cfg/modules/django_client/core/validation/fixer.py +216 -0
- django_cfg/modules/django_client/core/validation/reporter.py +480 -0
- django_cfg/modules/django_client/core/validation/rules/__init__.py +11 -0
- django_cfg/modules/django_client/core/validation/rules/base.py +96 -0
- django_cfg/modules/django_client/core/validation/rules/type_hints.py +288 -0
- django_cfg/modules/django_client/core/validation/safety.py +266 -0
- django_cfg/modules/django_client/management/__init__.py +3 -0
- django_cfg/modules/django_client/management/commands/__init__.py +3 -0
- django_cfg/modules/django_client/management/commands/generate_client.py +427 -0
- django_cfg/modules/django_client/management/commands/validate_openapi.py +343 -0
- django_cfg/modules/django_client/pytest.ini +30 -0
- django_cfg/modules/django_client/spectacular/__init__.py +10 -0
- django_cfg/modules/django_client/spectacular/async_detection.py +187 -0
- django_cfg/modules/django_client/spectacular/enum_naming.py +192 -0
- django_cfg/modules/django_client/urls.py +72 -0
- django_cfg/{dashboard ā modules/django_dashboard}/DEBUG_README.md +2 -2
- django_cfg/{dashboard ā modules/django_dashboard}/REFACTORING_SUMMARY.md +1 -1
- django_cfg/modules/django_dashboard/management/__init__.py +0 -0
- django_cfg/modules/django_dashboard/management/commands/__init__.py +0 -0
- django_cfg/{dashboard ā modules/django_dashboard}/management/commands/debug_dashboard.py +5 -5
- django_cfg/modules/django_dashboard/sections/documentation.py +391 -0
- django_cfg/modules/django_email/management/__init__.py +0 -0
- django_cfg/modules/django_email/management/commands/__init__.py +0 -0
- django_cfg/modules/django_email/management/commands/test_email.py +93 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +1 -1
- django_cfg/modules/django_logging/django_logger.py +6 -6
- django_cfg/modules/django_ngrok/management/__init__.py +0 -0
- django_cfg/modules/django_ngrok/management/commands/__init__.py +0 -0
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +167 -0
- django_cfg/modules/django_tasks/management/__init__.py +0 -0
- django_cfg/modules/django_tasks/management/commands/__init__.py +0 -0
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +254 -0
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +437 -0
- django_cfg/modules/django_tasks/management/commands/task_clear.py +226 -0
- django_cfg/modules/django_tasks/management/commands/task_status.py +257 -0
- django_cfg/modules/django_telegram/management/__init__.py +0 -0
- django_cfg/modules/django_telegram/management/commands/__init__.py +0 -0
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +68 -0
- django_cfg/modules/django_twilio/management/__init__.py +0 -0
- django_cfg/modules/django_twilio/management/commands/__init__.py +0 -0
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +112 -0
- django_cfg/modules/django_unfold/callbacks/main.py +21 -10
- django_cfg/modules/django_unfold/callbacks/revolution.py +41 -36
- django_cfg/pyproject.toml +2 -6
- django_cfg/registry/third_party.py +5 -7
- django_cfg/routing/callbacks.py +1 -1
- django_cfg/static/admin/css/prose-unfold.css +666 -0
- django_cfg/templates/admin/index.html +8 -0
- django_cfg/templates/admin/index_new.html +13 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +15 -3
- django_cfg/templates/admin/sections/documentation_section.html +172 -0
- django_cfg/templates/admin/snippets/tabs/documentation_tab.html +231 -0
- {django_cfg-1.4.10.dist-info ā django_cfg-1.4.13.dist-info}/METADATA +2 -2
- {django_cfg-1.4.10.dist-info ā django_cfg-1.4.13.dist-info}/RECORD +224 -74
- django_cfg/management/commands/generate.py +0 -107
- /django_cfg/models/django/{revolution.py ā revolution_legacy.py} +0 -0
- /django_cfg/{dashboard ā modules/django_admin}/management/__init__.py +0 -0
- /django_cfg/{dashboard ā modules/django_admin}/management/commands/__init__.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/__init__.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/components.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/debug.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/__init__.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/base.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/commands.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/overview.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/stats.py +0 -0
- /django_cfg/{dashboard ā modules/django_dashboard}/sections/system.py +0 -0
- {django_cfg-1.4.10.dist-info ā django_cfg-1.4.13.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.10.dist-info ā django_cfg-1.4.13.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.10.dist-info ā django_cfg-1.4.13.dist-info}/licenses/LICENSE +0 -0
@@ -1,225 +1,22 @@
|
|
1
1
|
"""
|
2
|
-
Django
|
2
|
+
Django-CFG wrapper for show_config command.
|
3
|
+
|
4
|
+
This is a simple alias for django_admin.management.commands.show_config.
|
5
|
+
All logic is in django_admin module.
|
3
6
|
|
4
7
|
Usage:
|
5
8
|
python manage.py show_config
|
6
9
|
python manage.py show_config --format json
|
10
|
+
python manage.py show_config --include-secrets
|
7
11
|
"""
|
8
12
|
|
9
|
-
import
|
10
|
-
import os
|
11
|
-
from django.core.management.base import BaseCommand
|
12
|
-
from django.conf import settings
|
13
|
-
from django_cfg.modules.django_logging import get_logger
|
14
|
-
|
15
|
-
logger = get_logger('show_config')
|
16
|
-
|
17
|
-
|
18
|
-
class Command(BaseCommand):
|
19
|
-
# Web execution metadata
|
20
|
-
web_executable = True
|
21
|
-
requires_input = False
|
22
|
-
is_destructive = False
|
23
|
-
|
24
|
-
help = 'Show Django Config configuration'
|
25
|
-
|
26
|
-
def add_arguments(self, parser):
|
27
|
-
parser.add_argument(
|
28
|
-
'--format',
|
29
|
-
choices=['table', 'json'],
|
30
|
-
default='table',
|
31
|
-
help='Output format (default: table)',
|
32
|
-
)
|
33
|
-
parser.add_argument(
|
34
|
-
'--include-secrets',
|
35
|
-
action='store_true',
|
36
|
-
help='Include sensitive information (use carefully)',
|
37
|
-
)
|
38
|
-
|
39
|
-
def handle(self, *args, **options):
|
40
|
-
"""Show configuration in requested format."""
|
41
|
-
logger.info("Starting show_config command")
|
42
|
-
try:
|
43
|
-
# Get the config instance from Django settings
|
44
|
-
config = self._get_config_instance()
|
45
|
-
logger.info("Successfully retrieved configuration instance")
|
46
|
-
|
47
|
-
if options['format'] == 'json':
|
48
|
-
logger.info("Displaying configuration in JSON format")
|
49
|
-
self._show_json_format(config, options['include_secrets'])
|
50
|
-
else:
|
51
|
-
logger.info("Displaying configuration in table format")
|
52
|
-
self._show_table_format(config, options['include_secrets'])
|
53
|
-
|
54
|
-
logger.info("show_config command completed successfully")
|
55
|
-
except Exception as e:
|
56
|
-
error_msg = f'Failed to show configuration: {e}'
|
57
|
-
logger.error(error_msg, exc_info=True)
|
58
|
-
self.stdout.write(
|
59
|
-
self.style.ERROR(f'ā {error_msg}')
|
60
|
-
)
|
13
|
+
from django_cfg.modules.django_admin.management.commands.show_config import Command as ShowConfigCommand
|
61
14
|
|
62
|
-
def _get_config_instance(self):
|
63
|
-
"""Get the DjangoConfig instance from Django settings."""
|
64
|
-
# Try to get config from settings module
|
65
|
-
settings_module = os.environ.get('DJANGO_SETTINGS_MODULE')
|
66
|
-
if not settings_module:
|
67
|
-
raise ValueError("DJANGO_SETTINGS_MODULE environment variable not set")
|
68
|
-
|
69
|
-
# Import the settings module and get the config
|
70
|
-
import importlib
|
71
|
-
settings_mod = importlib.import_module(settings_module)
|
72
|
-
|
73
|
-
if hasattr(settings_mod, 'config'):
|
74
|
-
return settings_mod.config
|
75
|
-
else:
|
76
|
-
# Fallback: create a minimal config from Django settings
|
77
|
-
from django_cfg import DjangoConfig
|
78
|
-
return DjangoConfig(
|
79
|
-
project_name=getattr(settings, 'PROJECT_NAME', 'Django Project'),
|
80
|
-
secret_key=settings.SECRET_KEY,
|
81
|
-
debug=settings.DEBUG,
|
82
|
-
allowed_hosts=settings.ALLOWED_HOSTS,
|
83
|
-
)
|
84
15
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
self.style.HTTP_INFO('š Django Config - Current Configuration')
|
89
|
-
)
|
90
|
-
self.stdout.write('=' * 80)
|
91
|
-
|
92
|
-
# Project section
|
93
|
-
self.stdout.write(self.style.SUCCESS('\nš Project'))
|
94
|
-
self.stdout.write('-' * 40)
|
95
|
-
project_data = [
|
96
|
-
('Name', config.project_name),
|
97
|
-
('Version', getattr(config, 'project_version', 'N/A')),
|
98
|
-
('Description', getattr(config, 'project_description', 'N/A')),
|
99
|
-
]
|
100
|
-
|
101
|
-
for key, value in project_data:
|
102
|
-
self.stdout.write(f' {key:<20}: {value}')
|
103
|
-
|
104
|
-
# Environment section
|
105
|
-
self.stdout.write(self.style.SUCCESS('\nš Environment'))
|
106
|
-
self.stdout.write('-' * 40)
|
107
|
-
env_data = [
|
108
|
-
('Environment', getattr(config, 'env_mode', 'auto-detected')),
|
109
|
-
('Debug Mode', config.debug),
|
110
|
-
('Security Domains', ', '.join(config.security_domains) if config.security_domains else 'None'),
|
111
|
-
]
|
112
|
-
|
113
|
-
if include_secrets:
|
114
|
-
env_data.append(('Secret Key', config.secret_key[:20] + '...'))
|
115
|
-
else:
|
116
|
-
env_data.append(('Secret Key', '[HIDDEN]'))
|
117
|
-
|
118
|
-
for key, value in env_data:
|
119
|
-
self.stdout.write(f' {key:<20}: {value}')
|
120
|
-
|
121
|
-
# Database section
|
122
|
-
self.stdout.write(self.style.SUCCESS('\nšļø Databases'))
|
123
|
-
self.stdout.write('-' * 40)
|
124
|
-
|
125
|
-
for db_name, db_config in config.databases.items():
|
126
|
-
self.stdout.write(f' {db_name}:')
|
127
|
-
self.stdout.write(f' Engine: {db_config.engine}')
|
128
|
-
if include_secrets:
|
129
|
-
self.stdout.write(f' Name: {db_config.name}')
|
130
|
-
self.stdout.write(f' Host: {db_config.host}')
|
131
|
-
self.stdout.write(f' Port: {db_config.port}')
|
132
|
-
else:
|
133
|
-
self.stdout.write(f' Name: [HIDDEN]')
|
134
|
-
self.stdout.write(f' Host: [HIDDEN]')
|
135
|
-
self.stdout.write(f' Port: [HIDDEN]')
|
136
|
-
|
137
|
-
# Cache section
|
138
|
-
cache_configured = False
|
139
|
-
if hasattr(config, 'cache_default') and config.cache_default:
|
140
|
-
cache_configured = True
|
141
|
-
|
142
|
-
if cache_configured:
|
143
|
-
self.stdout.write(self.style.SUCCESS('\nā” Cache'))
|
144
|
-
self.stdout.write('-' * 40)
|
145
|
-
cache_data = [
|
146
|
-
('Default Cache', 'Configured'),
|
147
|
-
('Sessions Cache', 'Configured' if hasattr(config, 'cache_sessions') and config.cache_sessions else 'Not configured'),
|
148
|
-
]
|
149
|
-
|
150
|
-
for key, value in cache_data:
|
151
|
-
self.stdout.write(f' {key:<20}: {value}')
|
152
|
-
|
153
|
-
# Services section
|
154
|
-
services_configured = []
|
155
|
-
if hasattr(config, 'email') and config.email:
|
156
|
-
services_configured.append(('Email', 'Configured'))
|
157
|
-
if hasattr(config, 'telegram') and config.telegram:
|
158
|
-
services_configured.append(('Telegram', 'Configured'))
|
159
|
-
|
160
|
-
if services_configured:
|
161
|
-
self.stdout.write(self.style.SUCCESS('\nš§ Services'))
|
162
|
-
self.stdout.write('-' * 40)
|
163
|
-
|
164
|
-
for key, value in services_configured:
|
165
|
-
self.stdout.write(f' {key:<20}: {value}')
|
166
|
-
|
167
|
-
# Apps section
|
168
|
-
if hasattr(config, 'project_apps') and config.project_apps:
|
169
|
-
self.stdout.write(self.style.SUCCESS('\nš¦ Project Apps'))
|
170
|
-
self.stdout.write('-' * 40)
|
171
|
-
|
172
|
-
for app in config.project_apps:
|
173
|
-
self.stdout.write(f' ⢠{app}')
|
174
|
-
|
175
|
-
# Custom Middleware section
|
176
|
-
if hasattr(config, 'custom_middleware') and config.custom_middleware:
|
177
|
-
self.stdout.write(self.style.SUCCESS('\nš”ļø Custom Middleware'))
|
178
|
-
self.stdout.write('-' * 40)
|
179
|
-
|
180
|
-
for middleware in config.custom_middleware:
|
181
|
-
self.stdout.write(f' ⢠{middleware}')
|
182
|
-
|
183
|
-
self.stdout.write('\n' + '=' * 80)
|
16
|
+
class Command(ShowConfigCommand):
|
17
|
+
"""
|
18
|
+
Alias for show_config command.
|
184
19
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
'project': {
|
189
|
-
'name': config.project_name,
|
190
|
-
'version': getattr(config, 'project_version', None),
|
191
|
-
'description': getattr(config, 'project_description', None),
|
192
|
-
},
|
193
|
-
'environment': {
|
194
|
-
'environment': getattr(config, 'env_mode', 'auto-detected'),
|
195
|
-
'debug': config.debug,
|
196
|
-
'allowed_hosts': config.allowed_hosts,
|
197
|
-
},
|
198
|
-
'databases': {},
|
199
|
-
'cache': {
|
200
|
-
'default_configured': hasattr(config, 'cache_default') and config.cache_default is not None,
|
201
|
-
'sessions_configured': hasattr(config, 'cache_sessions') and config.cache_sessions is not None,
|
202
|
-
},
|
203
|
-
'services': {
|
204
|
-
'email_configured': hasattr(config, 'email') and config.email is not None,
|
205
|
-
'telegram_configured': hasattr(config, 'telegram') and config.telegram is not None,
|
206
|
-
},
|
207
|
-
'apps': {
|
208
|
-
'project_apps': getattr(config, 'project_apps', []),
|
209
|
-
'custom_middleware': getattr(config, 'custom_middleware', []),
|
210
|
-
}
|
211
|
-
}
|
212
|
-
|
213
|
-
# Add database info
|
214
|
-
for db_name, db_config in config.databases.items():
|
215
|
-
config_data['databases'][db_name] = {
|
216
|
-
'engine': db_config.engine,
|
217
|
-
'name': db_config.name if include_secrets else '[HIDDEN]',
|
218
|
-
'host': db_config.host if include_secrets else '[HIDDEN]',
|
219
|
-
'port': db_config.port if include_secrets else '[HIDDEN]',
|
220
|
-
}
|
221
|
-
|
222
|
-
if include_secrets:
|
223
|
-
config_data['environment']['secret_key'] = config.secret_key
|
224
|
-
|
225
|
-
self.stdout.write(json.dumps(config_data, indent=2, default=str))
|
20
|
+
Simply inherits from ShowConfigCommand without any changes.
|
21
|
+
"""
|
22
|
+
pass
|
@@ -1,350 +1,20 @@
|
|
1
1
|
"""
|
2
|
-
Django
|
3
|
-
"""
|
2
|
+
Django-CFG wrapper for show_urls command.
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
from django.core.management.base import BaseCommand, CommandParser
|
8
|
-
from django.urls import get_resolver
|
9
|
-
from django.conf import settings
|
10
|
-
from django.utils.termcolors import make_style
|
11
|
-
from django_cfg.modules.django_logging import get_logger
|
4
|
+
This is a simple alias for django_admin.management.commands.show_urls.
|
5
|
+
All logic is in django_admin module.
|
12
6
|
|
13
|
-
|
7
|
+
Usage:
|
8
|
+
python manage.py show_urls
|
9
|
+
"""
|
14
10
|
|
11
|
+
from django_cfg.modules.django_admin.management.commands.show_urls import Command as ShowUrlsCommand
|
15
12
|
|
16
|
-
class Command(BaseCommand):
|
17
|
-
"""
|
18
|
-
Display all URL patterns in the Django project.
|
19
13
|
|
20
|
-
|
21
|
-
in a hierarchical format with colors and filtering options.
|
14
|
+
class Command(ShowUrlsCommand):
|
22
15
|
"""
|
16
|
+
Alias for show_urls command.
|
23
17
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
is_destructive = False
|
28
|
-
|
29
|
-
help = 'Display all URL patterns in the project'
|
30
|
-
|
31
|
-
def __init__(self, *args, **kwargs):
|
32
|
-
super().__init__(*args, **kwargs)
|
33
|
-
|
34
|
-
# Define color styles
|
35
|
-
self.styles = {
|
36
|
-
'SUCCESS': make_style(opts=('bold',), fg='green'),
|
37
|
-
'WARNING': make_style(opts=('bold',), fg='yellow'),
|
38
|
-
'ERROR': make_style(opts=('bold',), fg='red'),
|
39
|
-
'HTTP_200': make_style(fg='green'),
|
40
|
-
'HTTP_400': make_style(fg='yellow'),
|
41
|
-
'HTTP_500': make_style(fg='red'),
|
42
|
-
'URL': make_style(fg='cyan'),
|
43
|
-
'NAME': make_style(fg='blue'),
|
44
|
-
'INCLUDE': make_style(opts=('bold',), fg='magenta'),
|
45
|
-
'NAMESPACE': make_style(opts=('bold',), fg='yellow'),
|
46
|
-
}
|
47
|
-
|
48
|
-
def add_arguments(self, parser: CommandParser) -> None:
|
49
|
-
"""Add command arguments."""
|
50
|
-
parser.add_argument(
|
51
|
-
'--format',
|
52
|
-
choices=['list', 'tree', 'table'],
|
53
|
-
default='tree',
|
54
|
-
help='Output format (default: tree)'
|
55
|
-
)
|
56
|
-
parser.add_argument(
|
57
|
-
'--filter',
|
58
|
-
type=str,
|
59
|
-
help='Filter URLs by pattern (regex supported)'
|
60
|
-
)
|
61
|
-
parser.add_argument(
|
62
|
-
'--namespace',
|
63
|
-
type=str,
|
64
|
-
help='Show URLs only from specific namespace'
|
65
|
-
)
|
66
|
-
parser.add_argument(
|
67
|
-
'--plain',
|
68
|
-
action='store_true',
|
69
|
-
help='Plain output without colors'
|
70
|
-
)
|
71
|
-
parser.add_argument(
|
72
|
-
'--include-unnamed',
|
73
|
-
action='store_true',
|
74
|
-
help='Include URLs without names'
|
75
|
-
)
|
76
|
-
parser.add_argument(
|
77
|
-
'--show-methods',
|
78
|
-
action='store_true',
|
79
|
-
help='Show HTTP methods for each URL'
|
80
|
-
)
|
81
|
-
parser.add_argument(
|
82
|
-
'--show-views',
|
83
|
-
action='store_true',
|
84
|
-
help='Show view functions/classes'
|
85
|
-
)
|
86
|
-
|
87
|
-
def handle(self, *args, **options) -> None:
|
88
|
-
"""Main command handler."""
|
89
|
-
logger.info("Starting show_urls command")
|
90
|
-
self.options = options
|
91
|
-
|
92
|
-
# Disable colors if requested
|
93
|
-
if options['plain'] or options.get('no_color', False):
|
94
|
-
for key in self.styles:
|
95
|
-
self.styles[key] = lambda x: x
|
96
|
-
|
97
|
-
self.stdout.write(
|
98
|
-
self.styles['SUCCESS']('š Django URL Patterns')
|
99
|
-
)
|
100
|
-
self.stdout.write('=' * 50)
|
101
|
-
|
102
|
-
# Show Django Revolution info if available
|
103
|
-
if hasattr(settings, 'DJANGO_REVOLUTION'):
|
104
|
-
self._show_revolution_info()
|
105
|
-
|
106
|
-
# Get and display URL patterns
|
107
|
-
resolver = get_resolver()
|
108
|
-
patterns = self._collect_patterns(resolver.url_patterns)
|
109
|
-
|
110
|
-
# Filter patterns if requested
|
111
|
-
if options['filter']:
|
112
|
-
patterns = self._filter_patterns(patterns, options['filter'])
|
113
|
-
|
114
|
-
if options['namespace']:
|
115
|
-
patterns = self._filter_by_namespace(patterns, options['namespace'])
|
116
|
-
|
117
|
-
# Display patterns in requested format
|
118
|
-
if options['format'] == 'list':
|
119
|
-
self._display_list(patterns)
|
120
|
-
elif options['format'] == 'table':
|
121
|
-
self._display_table(patterns)
|
122
|
-
else:
|
123
|
-
self._display_tree(patterns)
|
124
|
-
|
125
|
-
self.stdout.write(f"\nš Total URLs: {len(patterns)}")
|
126
|
-
|
127
|
-
def _show_revolution_info(self) -> None:
|
128
|
-
"""Display Django Revolution configuration info."""
|
129
|
-
revolution = settings.DJANGO_REVOLUTION
|
130
|
-
|
131
|
-
self.stdout.write(
|
132
|
-
self.styles['NAMESPACE']('\nš Django Revolution Configuration:')
|
133
|
-
)
|
134
|
-
self.stdout.write(f" API Prefix: {revolution.get('api_prefix', 'N/A')}")
|
135
|
-
self.stdout.write(f" Debug: {revolution.get('debug', 'N/A')}")
|
136
|
-
|
137
|
-
zones = revolution.get('zones', {})
|
138
|
-
if zones:
|
139
|
-
self.stdout.write(f" Zones: {', '.join(zones.keys())}")
|
140
|
-
self.stdout.write('')
|
141
|
-
|
142
|
-
def _collect_patterns(
|
143
|
-
self,
|
144
|
-
urlpatterns,
|
145
|
-
prefix: str = '',
|
146
|
-
namespace: str = ''
|
147
|
-
) -> List[Tuple[str, str, str, str, Optional[str]]]:
|
148
|
-
"""
|
149
|
-
Recursively collect all URL patterns.
|
150
|
-
|
151
|
-
Returns list of tuples: (pattern, name, namespace, view, methods)
|
152
|
-
"""
|
153
|
-
patterns = []
|
154
|
-
|
155
|
-
for pattern in urlpatterns:
|
156
|
-
if hasattr(pattern, 'url_patterns'):
|
157
|
-
# This is an include() pattern
|
158
|
-
new_prefix = prefix + str(pattern.pattern)
|
159
|
-
new_namespace = namespace
|
160
|
-
|
161
|
-
if hasattr(pattern, 'namespace') and pattern.namespace:
|
162
|
-
new_namespace = (
|
163
|
-
f"{namespace}:{pattern.namespace}"
|
164
|
-
if namespace
|
165
|
-
else pattern.namespace
|
166
|
-
)
|
167
|
-
|
168
|
-
# Add the include pattern itself
|
169
|
-
patterns.append((
|
170
|
-
new_prefix,
|
171
|
-
f"[INCLUDE: {getattr(pattern, 'app_name', 'unknown')}]",
|
172
|
-
new_namespace,
|
173
|
-
'include',
|
174
|
-
None
|
175
|
-
))
|
176
|
-
|
177
|
-
# Recursively collect nested patterns
|
178
|
-
patterns.extend(
|
179
|
-
self._collect_patterns(
|
180
|
-
pattern.url_patterns,
|
181
|
-
new_prefix,
|
182
|
-
new_namespace
|
183
|
-
)
|
184
|
-
)
|
185
|
-
else:
|
186
|
-
# Regular URL pattern
|
187
|
-
full_pattern = prefix + str(pattern.pattern)
|
188
|
-
name = getattr(pattern, 'name', None)
|
189
|
-
view_name = self._get_view_name(pattern)
|
190
|
-
methods = self._get_http_methods(pattern)
|
191
|
-
|
192
|
-
patterns.append((
|
193
|
-
full_pattern,
|
194
|
-
name or '[unnamed]',
|
195
|
-
namespace,
|
196
|
-
view_name,
|
197
|
-
methods
|
198
|
-
))
|
199
|
-
|
200
|
-
return patterns
|
201
|
-
|
202
|
-
def _get_view_name(self, pattern) -> str:
|
203
|
-
"""Get the view function/class name from a URL pattern."""
|
204
|
-
try:
|
205
|
-
if hasattr(pattern, 'callback'):
|
206
|
-
callback = pattern.callback
|
207
|
-
if hasattr(callback, '__name__'):
|
208
|
-
return callback.__name__
|
209
|
-
elif hasattr(callback, '__class__'):
|
210
|
-
return callback.__class__.__name__
|
211
|
-
else:
|
212
|
-
return str(callback)
|
213
|
-
return 'unknown'
|
214
|
-
except Exception:
|
215
|
-
return 'unknown'
|
216
|
-
|
217
|
-
def _get_http_methods(self, pattern) -> Optional[str]:
|
218
|
-
"""Get HTTP methods supported by a URL pattern."""
|
219
|
-
if not self.options['show_methods']:
|
220
|
-
return None
|
221
|
-
|
222
|
-
try:
|
223
|
-
# Try to get methods from the view
|
224
|
-
if hasattr(pattern, 'callback'):
|
225
|
-
callback = pattern.callback
|
226
|
-
if hasattr(callback, 'cls'):
|
227
|
-
# DRF ViewSet or APIView
|
228
|
-
view_class = callback.cls
|
229
|
-
if hasattr(view_class, 'http_method_names'):
|
230
|
-
return ', '.join(view_class.http_method_names).upper()
|
231
|
-
elif hasattr(callback, 'view_class'):
|
232
|
-
# Class-based view
|
233
|
-
view_class = callback.view_class
|
234
|
-
if hasattr(view_class, 'http_method_names'):
|
235
|
-
return ', '.join(view_class.http_method_names).upper()
|
236
|
-
return 'GET, POST, PUT, PATCH, DELETE' # Default assumption
|
237
|
-
except Exception:
|
238
|
-
return None
|
239
|
-
|
240
|
-
def _filter_patterns(
|
241
|
-
self,
|
242
|
-
patterns: List[Tuple],
|
243
|
-
filter_pattern: str
|
244
|
-
) -> List[Tuple]:
|
245
|
-
"""Filter patterns by regex."""
|
246
|
-
try:
|
247
|
-
regex = re.compile(filter_pattern, re.IGNORECASE)
|
248
|
-
return [
|
249
|
-
pattern for pattern in patterns
|
250
|
-
if regex.search(pattern[0]) or regex.search(pattern[1])
|
251
|
-
]
|
252
|
-
except re.error:
|
253
|
-
self.stdout.write(
|
254
|
-
self.styles['ERROR'](f"Invalid regex pattern: {filter_pattern}")
|
255
|
-
)
|
256
|
-
return patterns
|
257
|
-
|
258
|
-
def _filter_by_namespace(
|
259
|
-
self,
|
260
|
-
patterns: List[Tuple],
|
261
|
-
namespace: str
|
262
|
-
) -> List[Tuple]:
|
263
|
-
"""Filter patterns by namespace."""
|
264
|
-
return [
|
265
|
-
pattern for pattern in patterns
|
266
|
-
if pattern[2] and namespace in pattern[2]
|
267
|
-
]
|
268
|
-
|
269
|
-
def _display_tree(self, patterns: List[Tuple]) -> None:
|
270
|
-
"""Display patterns in tree format."""
|
271
|
-
self.stdout.write(self.styles['SUCCESS']('\nš³ URL Tree:'))
|
272
|
-
self.stdout.write('-' * 30)
|
273
|
-
|
274
|
-
for pattern, name, namespace, view, methods in patterns:
|
275
|
-
# Format the output
|
276
|
-
if '[INCLUDE:' in name:
|
277
|
-
# Include pattern
|
278
|
-
icon = 'š'
|
279
|
-
pattern_display = self.styles['INCLUDE'](pattern)
|
280
|
-
name_display = self.styles['NAMESPACE'](name)
|
281
|
-
elif name == '[unnamed]' and not self.options['include_unnamed']:
|
282
|
-
continue
|
283
|
-
else:
|
284
|
-
# Regular pattern
|
285
|
-
icon = 'š'
|
286
|
-
pattern_display = self.styles['URL'](pattern)
|
287
|
-
name_display = self.styles['NAME'](name)
|
288
|
-
|
289
|
-
# Build the line
|
290
|
-
line = f"{icon} {pattern_display}"
|
291
|
-
if name and name != '[unnamed]':
|
292
|
-
line += f" -> {name_display}"
|
293
|
-
|
294
|
-
if namespace:
|
295
|
-
line += f" [{self.styles['NAMESPACE'](namespace)}]"
|
296
|
-
|
297
|
-
if self.options['show_views'] and view and view != 'include':
|
298
|
-
line += f" ({view})"
|
299
|
-
|
300
|
-
if methods:
|
301
|
-
line += f" [{methods}]"
|
302
|
-
|
303
|
-
self.stdout.write(line)
|
304
|
-
|
305
|
-
def _display_list(self, patterns: List[Tuple]) -> None:
|
306
|
-
"""Display patterns in simple list format."""
|
307
|
-
self.stdout.write(self.styles['SUCCESS']('\nš URL List:'))
|
308
|
-
self.stdout.write('-' * 20)
|
309
|
-
|
310
|
-
for i, (pattern, name, namespace, view, methods) in enumerate(patterns, 1):
|
311
|
-
if name == '[unnamed]' and not self.options['include_unnamed']:
|
312
|
-
continue
|
313
|
-
|
314
|
-
line = f"{i:3d}. {self.styles['URL'](pattern)}"
|
315
|
-
if name and name != '[unnamed]':
|
316
|
-
line += f" ({self.styles['NAME'](name)})"
|
317
|
-
|
318
|
-
self.stdout.write(line)
|
319
|
-
|
320
|
-
def _display_table(self, patterns: List[Tuple]) -> None:
|
321
|
-
"""Display patterns in table format."""
|
322
|
-
self.stdout.write(self.styles['SUCCESS']('\nš URL Table:'))
|
323
|
-
self.stdout.write('-' * 80)
|
324
|
-
|
325
|
-
# Header
|
326
|
-
headers = ['Pattern', 'Name', 'Namespace', 'View']
|
327
|
-
if self.options['show_methods']:
|
328
|
-
headers.append('Methods')
|
329
|
-
|
330
|
-
header_line = ' | '.join(f"{h:<20}" for h in headers)
|
331
|
-
self.stdout.write(self.styles['SUCCESS'](header_line))
|
332
|
-
self.stdout.write('-' * len(header_line))
|
333
|
-
|
334
|
-
# Rows
|
335
|
-
for pattern, name, namespace, view, methods in patterns:
|
336
|
-
if name == '[unnamed]' and not self.options['include_unnamed']:
|
337
|
-
continue
|
338
|
-
|
339
|
-
row = [
|
340
|
-
pattern[:20],
|
341
|
-
(name or '')[:20],
|
342
|
-
(namespace or '')[:20],
|
343
|
-
(view or '')[:20]
|
344
|
-
]
|
345
|
-
|
346
|
-
if self.options['show_methods']:
|
347
|
-
row.append((methods or '')[:20])
|
348
|
-
|
349
|
-
row_line = ' | '.join(f"{cell:<20}" for cell in row)
|
350
|
-
self.stdout.write(row_line)
|
18
|
+
Simply inherits from ShowUrlsCommand without any changes.
|
19
|
+
"""
|
20
|
+
pass
|