django-cfg 1.3.13__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
- django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
- django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
- django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.0.dist-info/METADATA +920 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
"""
|
2
|
+
Helper utilities for settings generation.
|
3
|
+
|
4
|
+
Common functions used across multiple generators.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Dict, Any
|
8
|
+
|
9
|
+
|
10
|
+
def merge_settings(*settings_dicts: Dict[str, Any]) -> Dict[str, Any]:
|
11
|
+
"""
|
12
|
+
Merge multiple settings dictionaries.
|
13
|
+
|
14
|
+
Later dictionaries override earlier ones.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
*settings_dicts: Settings dictionaries to merge
|
18
|
+
|
19
|
+
Returns:
|
20
|
+
Merged settings dictionary
|
21
|
+
|
22
|
+
Example:
|
23
|
+
>>> merge_settings({"A": 1}, {"B": 2}, {"A": 3})
|
24
|
+
{"A": 3, "B": 2}
|
25
|
+
"""
|
26
|
+
result = {}
|
27
|
+
for settings in settings_dicts:
|
28
|
+
result.update(settings)
|
29
|
+
return result
|
30
|
+
|
31
|
+
|
32
|
+
__all__ = ["merge_settings"]
|
@@ -16,23 +16,22 @@ _startup_info_shown = False
|
|
16
16
|
|
17
17
|
def print_startup_info():
|
18
18
|
"""Print startup information based on config.startup_info_mode."""
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
traceback.print_exc()
|
19
|
+
global _startup_info_shown
|
20
|
+
|
21
|
+
# Skip if already shown (prevents spam on hot reload)
|
22
|
+
if _startup_info_shown:
|
23
|
+
return
|
24
|
+
|
25
|
+
# Only show in the actual worker process (not in autoreload parent process)
|
26
|
+
# RUN_MAIN is set by Django's autoreloader in the worker process
|
27
|
+
if os.environ.get('RUN_MAIN') != 'true':
|
28
|
+
return
|
29
|
+
|
30
|
+
# Mark as shown to prevent duplicate display on subsequent hot reloads
|
31
|
+
_startup_info_shown = True
|
32
|
+
|
33
|
+
manager = StartupDisplayManager()
|
34
|
+
manager.display_startup_info()
|
36
35
|
|
37
36
|
def reset_startup_info_flag():
|
38
37
|
"""Reset the startup info display flag. Useful for testing or manual reset."""
|
@@ -41,14 +40,8 @@ def reset_startup_info_flag():
|
|
41
40
|
|
42
41
|
def print_ngrok_tunnel_info(tunnel_url: str):
|
43
42
|
"""Print ngrok tunnel information after tunnel is established."""
|
44
|
-
|
45
|
-
|
46
|
-
manager.display_tunnel_info(tunnel_url)
|
47
|
-
except Exception as e:
|
48
|
-
import traceback
|
49
|
-
print(f"❌ ERROR in print_ngrok_tunnel_info: {e}")
|
50
|
-
print("🔍 TRACEBACK:")
|
51
|
-
traceback.print_exc()
|
43
|
+
manager = NgrokDisplayManager()
|
44
|
+
manager.display_tunnel_info(tunnel_url)
|
52
45
|
|
53
46
|
from .version_checker import get_version_info, get_latest_version, get_current_version
|
54
47
|
from .commands_collector import get_all_commands, get_command_count, get_commands_with_descriptions
|
@@ -20,145 +20,158 @@ class StartupDisplayManager(BaseDisplayManager):
|
|
20
20
|
|
21
21
|
def display_startup_info(self):
|
22
22
|
"""Display startup information based on config.startup_info_mode."""
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
self.display_complete_info()
|
39
|
-
|
40
|
-
except Exception:
|
41
|
-
# Silently fail - startup info is not critical
|
42
|
-
pass
|
23
|
+
if not self.config:
|
24
|
+
return
|
25
|
+
|
26
|
+
# Always check and display ngrok info first if active
|
27
|
+
self.ngrok_manager.display_if_active()
|
28
|
+
|
29
|
+
from django_cfg.core.config import StartupInfoMode
|
30
|
+
mode = self.config.startup_info_mode
|
31
|
+
|
32
|
+
if mode == StartupInfoMode.NONE:
|
33
|
+
self.display_minimal_info()
|
34
|
+
elif mode == StartupInfoMode.SHORT:
|
35
|
+
self.display_essential_info()
|
36
|
+
elif mode == StartupInfoMode.FULL:
|
37
|
+
self.display_complete_info()
|
43
38
|
|
44
39
|
def display_minimal_info(self):
|
45
40
|
"""Display minimal startup info (NONE mode)."""
|
46
|
-
version = self.get_version()
|
47
|
-
panel_style, env_emoji, env_color = self.get_environment_style()
|
48
|
-
|
49
|
-
# Simple one-liner
|
50
|
-
info_text = Text()
|
51
|
-
info_text.append(f"{env_emoji} Django CFG ", style="bold")
|
52
|
-
info_text.append(f"v{version}", style="cyan")
|
53
|
-
info_text.append(" • ", style="dim")
|
54
|
-
info_text.append(f"{self.config.env_mode}", style=env_color)
|
55
|
-
info_text.append(" • ", style="dim")
|
56
|
-
info_text.append(f"{self.config.project_name}", style="white")
|
57
|
-
|
58
|
-
# Check for critical updates
|
59
41
|
try:
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
42
|
+
version = self.get_version()
|
43
|
+
panel_style, env_emoji, env_color = self.get_environment_style()
|
44
|
+
|
45
|
+
# Simple one-liner
|
46
|
+
info_text = Text()
|
47
|
+
info_text.append(f"{env_emoji} Django CFG ", style="bold")
|
48
|
+
info_text.append(f"v{version}", style="cyan")
|
49
|
+
info_text.append(" • ", style="dim")
|
50
|
+
info_text.append(f"{self.config.env_mode}", style=env_color)
|
51
|
+
info_text.append(" • ", style="dim")
|
52
|
+
info_text.append(f"{self.config.project_name}", style="white")
|
53
|
+
|
54
|
+
# Check for critical updates
|
55
|
+
try:
|
56
|
+
from ..version_checker import get_version_info
|
57
|
+
version_info = get_version_info()
|
58
|
+
if version_info.get('update_available'):
|
59
|
+
info_text.append(" • ", style="dim")
|
60
|
+
info_text.append("🚨 UPDATE AVAILABLE", style="bold yellow")
|
61
|
+
info_text.append(" (", style="dim")
|
62
|
+
info_text.append("poetry add django-cfg@latest", style="bright_blue")
|
63
|
+
info_text.append(")", style="dim")
|
64
|
+
except Exception:
|
65
|
+
pass
|
66
|
+
|
67
|
+
self.console.print(info_text)
|
68
|
+
except Exception as e:
|
69
|
+
import traceback
|
70
|
+
print(f"❌ ERROR in display_minimal_info: {e}")
|
71
|
+
print("🔍 TRACEBACK:")
|
72
|
+
traceback.print_exc()
|
72
73
|
|
73
74
|
def display_essential_info(self):
|
74
75
|
"""Display essential startup info (SHORT mode)."""
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
76
|
+
try:
|
77
|
+
version = self.get_version()
|
78
|
+
panel_style, env_emoji, env_color = self.get_environment_style()
|
79
|
+
|
80
|
+
# Create compact header
|
81
|
+
header_text = Text()
|
82
|
+
header_text.append(f"{env_emoji} Django CFG ", style="bold")
|
83
|
+
header_text.append(f"v{version}", style="cyan")
|
84
|
+
header_text.append(" • ", style="dim")
|
85
|
+
header_text.append(f"{self.config.env_mode}", style=env_color)
|
86
|
+
header_text.append(" • ", style="dim")
|
87
|
+
header_text.append(f"{self.config.project_name}", style="white")
|
88
|
+
|
89
|
+
header_panel = self.create_panel(
|
90
|
+
header_text,
|
91
|
+
title="",
|
92
|
+
border_style=panel_style,
|
93
|
+
width=None
|
94
|
+
)
|
95
|
+
header_panel.padding = (0, 1) # Override padding for header
|
96
|
+
self.console.print(header_panel)
|
97
|
+
|
98
|
+
# Check for updates first
|
99
|
+
self._display_update_notification_short()
|
100
|
+
|
101
|
+
# Create columns for essential info
|
102
|
+
self._display_essential_columns()
|
103
|
+
except Exception as e:
|
104
|
+
import traceback
|
105
|
+
print(f"❌ ERROR in display_essential_info: {e}")
|
106
|
+
print("🔍 TRACEBACK:")
|
107
|
+
traceback.print_exc()
|
101
108
|
|
102
109
|
def display_complete_info(self):
|
103
110
|
"""Display complete startup info (FULL mode)."""
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
111
|
+
try:
|
112
|
+
version = self.get_version()
|
113
|
+
panel_style, env_emoji, env_color = self.get_environment_style()
|
114
|
+
|
115
|
+
# Get library info
|
116
|
+
from django_cfg.config import (
|
117
|
+
LIB_NAME, LIB_SITE_URL, LIB_DOCS_URL, LIB_GITHUB_URL,
|
118
|
+
LIB_SUPPORT_URL, LIB_HEALTH_URL
|
119
|
+
)
|
120
|
+
|
121
|
+
# Create main info table
|
122
|
+
info_table = self.create_table()
|
123
|
+
info_table.add_column("Setting", style="cyan", width=30)
|
124
|
+
info_table.add_column("Value", style="white")
|
125
|
+
|
126
|
+
info_table.add_row("📦 Version", version)
|
127
|
+
info_table.add_row("🔗 Prefix", "/cfg/")
|
128
|
+
info_table.add_row("🌍 Environment", self.config.env_mode)
|
129
|
+
info_table.add_row("🔧 Debug", str(self.config.debug))
|
130
|
+
info_table.add_row("🏗️ Project", self.config.project_name)
|
131
|
+
|
132
|
+
# Add environment source
|
133
|
+
env_source = getattr(self.config, 'env_mode', 'default_fallback')
|
134
|
+
info_table.add_row("🔍 Env Source", env_source)
|
135
|
+
|
136
|
+
info_table.add_row("🌐 Site", LIB_SITE_URL)
|
137
|
+
info_table.add_row("📚 Docs", LIB_DOCS_URL)
|
138
|
+
info_table.add_row("🐙 GitHub", LIB_GITHUB_URL)
|
139
|
+
info_table.add_row("🆘 Support", LIB_SUPPORT_URL)
|
140
|
+
|
141
|
+
# Use full URL for health endpoint
|
142
|
+
health_url = f"{self.get_base_url()}/cfg/health/"
|
143
|
+
info_table.add_row("❤️ Health", health_url)
|
144
|
+
|
145
|
+
# Create main panel with full width
|
146
|
+
main_panel = self.create_full_width_panel(
|
147
|
+
info_table,
|
148
|
+
title=f"{env_emoji} Django CFG Configuration",
|
149
|
+
border_style=panel_style
|
150
|
+
)
|
151
|
+
|
152
|
+
self.console.print(main_panel)
|
153
|
+
|
154
|
+
# Check for updates
|
155
|
+
self._display_update_notification_full()
|
156
|
+
|
157
|
+
# Create columns for apps and endpoints
|
158
|
+
self._display_main_columns()
|
159
|
+
|
160
|
+
# App-specific configuration panels
|
161
|
+
self._display_config_panels()
|
162
|
+
|
163
|
+
# Revolution info
|
164
|
+
self._display_revolution_info()
|
165
|
+
|
166
|
+
# Management commands
|
167
|
+
self._display_commands_info()
|
168
|
+
|
169
|
+
self.print_spacing()
|
170
|
+
except Exception as e:
|
171
|
+
import traceback
|
172
|
+
print(f"❌ ERROR in display_complete_info: {e}")
|
173
|
+
print("🔍 TRACEBACK:")
|
174
|
+
traceback.print_exc()
|
162
175
|
|
163
176
|
def _display_update_notification_short(self):
|
164
177
|
"""Display update notification for SHORT mode."""
|
@@ -223,10 +236,10 @@ class StartupDisplayManager(BaseDisplayManager):
|
|
223
236
|
def _display_essential_columns(self):
|
224
237
|
"""Display essential info in columns for SHORT mode."""
|
225
238
|
# Enabled apps
|
226
|
-
enabled_apps = self.config.
|
239
|
+
enabled_apps = self.config.get_installed_apps() if hasattr(self.config, 'get_installed_apps') else []
|
227
240
|
apps_table = self.create_table()
|
228
241
|
apps_table.add_column("App", style="bright_blue")
|
229
|
-
|
242
|
+
|
230
243
|
for app in enabled_apps[:5]: # Limit for SHORT mode
|
231
244
|
app_name = app.split('.')[-1]
|
232
245
|
apps_table.add_row(f"• {app_name}")
|
@@ -251,10 +264,10 @@ class StartupDisplayManager(BaseDisplayManager):
|
|
251
264
|
def _display_main_columns(self):
|
252
265
|
"""Display main columns (apps and endpoints) for FULL mode."""
|
253
266
|
# Enabled apps
|
254
|
-
enabled_apps = self.config.
|
267
|
+
enabled_apps = self.config.get_installed_apps() if hasattr(self.config, 'get_installed_apps') else []
|
255
268
|
apps_table = self.create_table()
|
256
269
|
apps_table.add_column("App", style="bright_blue")
|
257
|
-
|
270
|
+
|
258
271
|
for app in enabled_apps:
|
259
272
|
app_name = app.split('.')[-1]
|
260
273
|
apps_table.add_row(f"• {app_name}")
|
@@ -53,14 +53,25 @@ def add_django_cfg_urls(urlpatterns: List[URLPattern], cfg_prefix: str = "cfg/")
|
|
53
53
|
except ImportError:
|
54
54
|
# Django Revolution not available - skip
|
55
55
|
pass
|
56
|
-
|
56
|
+
|
57
|
+
# Add django-browser-reload URLs in development (if installed)
|
58
|
+
if settings.DEBUG:
|
59
|
+
try:
|
60
|
+
import django_browser_reload
|
61
|
+
new_patterns = new_patterns + [
|
62
|
+
path("__reload__/", include("django_browser_reload.urls")),
|
63
|
+
]
|
64
|
+
except ImportError:
|
65
|
+
# django-browser-reload not installed - skip
|
66
|
+
pass
|
67
|
+
|
57
68
|
# Show startup info based on config
|
58
69
|
try:
|
59
70
|
from . import print_startup_info
|
60
71
|
print_startup_info()
|
61
72
|
except ImportError:
|
62
73
|
pass
|
63
|
-
|
74
|
+
|
64
75
|
return new_patterns
|
65
76
|
|
66
77
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
"""
|
2
|
+
Configuration service coordinating all builders.
|
3
|
+
|
4
|
+
Facade pattern: Provides simple API to DjangoConfig while delegating
|
5
|
+
to specialized builders for actual work.
|
6
|
+
|
7
|
+
Size: ~100 lines (pure coordination, no business logic)
|
8
|
+
"""
|
9
|
+
|
10
|
+
from typing import List, Optional, TYPE_CHECKING
|
11
|
+
|
12
|
+
if TYPE_CHECKING:
|
13
|
+
from ..base.config_model import DjangoConfig
|
14
|
+
from ..builders.apps_builder import InstalledAppsBuilder
|
15
|
+
from ..builders.middleware_builder import MiddlewareBuilder
|
16
|
+
from ..builders.security_builder import SecurityBuilder
|
17
|
+
|
18
|
+
|
19
|
+
class ConfigService:
|
20
|
+
"""
|
21
|
+
Facade service coordinating all configuration builders.
|
22
|
+
|
23
|
+
This service:
|
24
|
+
- Lazy-loads builders on demand
|
25
|
+
- Provides simple API for DjangoConfig
|
26
|
+
- Coordinates multiple builders
|
27
|
+
|
28
|
+
Example:
|
29
|
+
```python
|
30
|
+
service = ConfigService(config)
|
31
|
+
apps = service.get_installed_apps()
|
32
|
+
middleware = service.get_middleware()
|
33
|
+
```
|
34
|
+
"""
|
35
|
+
|
36
|
+
def __init__(self, config: "DjangoConfig"):
|
37
|
+
"""
|
38
|
+
Initialize service with configuration.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
config: DjangoConfig instance
|
42
|
+
"""
|
43
|
+
self.config = config
|
44
|
+
|
45
|
+
# Lazy initialization of builders
|
46
|
+
self._apps_builder: Optional["InstalledAppsBuilder"] = None
|
47
|
+
self._middleware_builder: Optional["MiddlewareBuilder"] = None
|
48
|
+
self._security_builder: Optional["SecurityBuilder"] = None
|
49
|
+
|
50
|
+
@property
|
51
|
+
def apps_builder(self) -> "InstalledAppsBuilder":
|
52
|
+
"""Lazy-load apps builder."""
|
53
|
+
if self._apps_builder is None:
|
54
|
+
from ..builders.apps_builder import InstalledAppsBuilder
|
55
|
+
self._apps_builder = InstalledAppsBuilder(self.config)
|
56
|
+
return self._apps_builder
|
57
|
+
|
58
|
+
@property
|
59
|
+
def middleware_builder(self) -> "MiddlewareBuilder":
|
60
|
+
"""Lazy-load middleware builder."""
|
61
|
+
if self._middleware_builder is None:
|
62
|
+
from ..builders.middleware_builder import MiddlewareBuilder
|
63
|
+
self._middleware_builder = MiddlewareBuilder(self.config)
|
64
|
+
return self._middleware_builder
|
65
|
+
|
66
|
+
@property
|
67
|
+
def security_builder(self) -> "SecurityBuilder":
|
68
|
+
"""Lazy-load security builder."""
|
69
|
+
if self._security_builder is None:
|
70
|
+
from ..builders.security_builder import SecurityBuilder
|
71
|
+
self._security_builder = SecurityBuilder(self.config)
|
72
|
+
return self._security_builder
|
73
|
+
|
74
|
+
def get_installed_apps(self) -> List[str]:
|
75
|
+
"""
|
76
|
+
Get complete INSTALLED_APPS list.
|
77
|
+
|
78
|
+
Delegates to InstalledAppsBuilder.
|
79
|
+
|
80
|
+
Returns:
|
81
|
+
List of Django app labels
|
82
|
+
|
83
|
+
Example:
|
84
|
+
>>> service.get_installed_apps()
|
85
|
+
['django.contrib.admin', 'django.contrib.auth', ...]
|
86
|
+
"""
|
87
|
+
return self.apps_builder.build()
|
88
|
+
|
89
|
+
def get_middleware(self) -> List[str]:
|
90
|
+
"""
|
91
|
+
Get complete MIDDLEWARE list.
|
92
|
+
|
93
|
+
Delegates to MiddlewareBuilder.
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
List of middleware class paths
|
97
|
+
|
98
|
+
Example:
|
99
|
+
>>> service.get_middleware()
|
100
|
+
['django.middleware.security.SecurityMiddleware', ...]
|
101
|
+
"""
|
102
|
+
return self.middleware_builder.build()
|
103
|
+
|
104
|
+
def get_allowed_hosts(self) -> List[str]:
|
105
|
+
"""
|
106
|
+
Get ALLOWED_HOSTS from security configuration.
|
107
|
+
|
108
|
+
Delegates to SecurityBuilder.
|
109
|
+
|
110
|
+
Returns:
|
111
|
+
List of allowed host patterns
|
112
|
+
|
113
|
+
Example:
|
114
|
+
>>> service.get_allowed_hosts()
|
115
|
+
['localhost', '127.0.0.1', 'example.com']
|
116
|
+
"""
|
117
|
+
return self.security_builder.build_allowed_hosts()
|
118
|
+
|
119
|
+
|
120
|
+
# Export service
|
121
|
+
__all__ = ["ConfigService"]
|
@@ -0,0 +1,84 @@
|
|
1
|
+
"""
|
2
|
+
Global configuration registry.
|
3
|
+
|
4
|
+
Manages current DjangoConfig instance for thread-safe access.
|
5
|
+
Extracted from original config.py for better organization.
|
6
|
+
|
7
|
+
Size: ~60 lines (simple state management)
|
8
|
+
"""
|
9
|
+
|
10
|
+
from typing import Optional, TYPE_CHECKING
|
11
|
+
import threading
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from ..base.config_model import DjangoConfig
|
15
|
+
|
16
|
+
# Thread-local storage for current config
|
17
|
+
_thread_local = threading.local()
|
18
|
+
|
19
|
+
# Global config (fallback if thread-local not set)
|
20
|
+
_global_config: Optional["DjangoConfig"] = None
|
21
|
+
|
22
|
+
|
23
|
+
def get_current_config() -> Optional["DjangoConfig"]:
|
24
|
+
"""
|
25
|
+
Get currently active DjangoConfig instance.
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
Current config instance, or None if not set
|
29
|
+
|
30
|
+
Example:
|
31
|
+
>>> config = get_current_config()
|
32
|
+
>>> if config:
|
33
|
+
... print(config.project_name)
|
34
|
+
"""
|
35
|
+
# Try thread-local first
|
36
|
+
config = getattr(_thread_local, "config", None)
|
37
|
+
if config is not None:
|
38
|
+
return config
|
39
|
+
|
40
|
+
# Fall back to global
|
41
|
+
return _global_config
|
42
|
+
|
43
|
+
|
44
|
+
def set_current_config(config: "DjangoConfig") -> None:
|
45
|
+
"""
|
46
|
+
Set currently active DjangoConfig instance.
|
47
|
+
|
48
|
+
Args:
|
49
|
+
config: DjangoConfig instance to set as current
|
50
|
+
|
51
|
+
Example:
|
52
|
+
>>> config = DjangoConfig(project_name="My Project", ...)
|
53
|
+
>>> set_current_config(config)
|
54
|
+
"""
|
55
|
+
global _global_config
|
56
|
+
|
57
|
+
# Set both thread-local and global
|
58
|
+
_thread_local.config = config
|
59
|
+
_global_config = config
|
60
|
+
|
61
|
+
|
62
|
+
def clear_current_config() -> None:
|
63
|
+
"""
|
64
|
+
Clear currently active config (useful for testing).
|
65
|
+
|
66
|
+
Example:
|
67
|
+
>>> clear_current_config()
|
68
|
+
>>> assert get_current_config() is None
|
69
|
+
"""
|
70
|
+
global _global_config
|
71
|
+
|
72
|
+
# Clear both thread-local and global
|
73
|
+
if hasattr(_thread_local, "config"):
|
74
|
+
delattr(_thread_local, "config")
|
75
|
+
|
76
|
+
_global_config = None
|
77
|
+
|
78
|
+
|
79
|
+
# Export functions
|
80
|
+
__all__ = [
|
81
|
+
"get_current_config",
|
82
|
+
"set_current_config",
|
83
|
+
"clear_current_config",
|
84
|
+
]
|