django-cfg 1.3.13__py3-none-any.whl → 1.4.3__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/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- 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/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- 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/examples/vehicle_model_example.py +199 -0
- 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_currency/examples/__init__.py +3 -0
- django_cfg/modules/django_currency/examples/example_database_usage.py +144 -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_ipc_client/README.md +346 -0
- django_cfg/modules/django_ipc_client/__init__.py +51 -0
- django_cfg/modules/django_ipc_client/client.py +540 -0
- django_cfg/modules/django_ipc_client/config.py +207 -0
- django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_ipc_client/exceptions.py +201 -0
- 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/examples/component_class_example.html +156 -0
- 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.3.dist-info/METADATA +533 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -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.3.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,258 @@
|
|
1
|
+
"""
|
2
|
+
INSTALLED_APPS builder for Django-CFG.
|
3
|
+
|
4
|
+
Single Responsibility: Build Django INSTALLED_APPS list from configuration.
|
5
|
+
Extracted from original config.py (903 lines) for better maintainability.
|
6
|
+
|
7
|
+
Size: ~220 lines (focused on one task)
|
8
|
+
"""
|
9
|
+
|
10
|
+
from typing import List, TYPE_CHECKING
|
11
|
+
|
12
|
+
from ..constants import DEFAULT_APPS
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from ..base.config_model import DjangoConfig
|
16
|
+
|
17
|
+
|
18
|
+
class InstalledAppsBuilder:
|
19
|
+
"""
|
20
|
+
Builds INSTALLED_APPS list from DjangoConfig.
|
21
|
+
|
22
|
+
Responsibilities:
|
23
|
+
- Combine default Django/third-party apps
|
24
|
+
- Add django-cfg apps based on enabled features
|
25
|
+
- Handle special ordering (accounts before admin)
|
26
|
+
- Auto-enable tasks if needed
|
27
|
+
- Auto-detect dashboard apps from Unfold
|
28
|
+
- Add project-specific apps
|
29
|
+
- Remove duplicates while preserving order
|
30
|
+
|
31
|
+
Example:
|
32
|
+
```python
|
33
|
+
builder = InstalledAppsBuilder(config)
|
34
|
+
apps = builder.build()
|
35
|
+
```
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self, config: "DjangoConfig"):
|
39
|
+
"""
|
40
|
+
Initialize builder with configuration.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
config: DjangoConfig instance
|
44
|
+
"""
|
45
|
+
self.config = config
|
46
|
+
|
47
|
+
def build(self) -> List[str]:
|
48
|
+
"""
|
49
|
+
Build complete INSTALLED_APPS list.
|
50
|
+
|
51
|
+
Returns:
|
52
|
+
List of Django app labels in correct order
|
53
|
+
|
54
|
+
Example:
|
55
|
+
>>> config = DjangoConfig(enable_support=True)
|
56
|
+
>>> builder = InstalledAppsBuilder(config)
|
57
|
+
>>> apps = builder.build()
|
58
|
+
>>> "django_cfg.apps.support" in apps
|
59
|
+
True
|
60
|
+
"""
|
61
|
+
apps = []
|
62
|
+
|
63
|
+
# Step 1: Add default apps (with special handling for accounts)
|
64
|
+
apps.extend(self._get_default_apps())
|
65
|
+
|
66
|
+
# Step 2: Add django-cfg built-in apps
|
67
|
+
apps.extend(self._get_django_cfg_apps())
|
68
|
+
|
69
|
+
# Step 3: Add optional apps (tasks, dashboard)
|
70
|
+
apps.extend(self._get_optional_apps())
|
71
|
+
|
72
|
+
# Step 4: Add project-specific apps
|
73
|
+
apps.extend(self.config.project_apps)
|
74
|
+
|
75
|
+
# Step 5: Remove duplicates while preserving order
|
76
|
+
return self._deduplicate(apps)
|
77
|
+
|
78
|
+
def _get_default_apps(self) -> List[str]:
|
79
|
+
"""
|
80
|
+
Get base Django and third-party apps.
|
81
|
+
|
82
|
+
Handles special case: accounts app must be inserted before admin
|
83
|
+
for proper migration order.
|
84
|
+
|
85
|
+
Returns:
|
86
|
+
List of default app labels
|
87
|
+
"""
|
88
|
+
apps = []
|
89
|
+
|
90
|
+
# Add apps one by one, inserting accounts before admin if enabled
|
91
|
+
for app in DEFAULT_APPS:
|
92
|
+
if app == "django.contrib.admin":
|
93
|
+
# Insert accounts before admin if enabled (for proper migration order)
|
94
|
+
if self.config.enable_accounts:
|
95
|
+
apps.append("django_cfg.apps.accounts")
|
96
|
+
apps.append(app)
|
97
|
+
|
98
|
+
return apps
|
99
|
+
|
100
|
+
def _get_django_cfg_apps(self) -> List[str]:
|
101
|
+
"""
|
102
|
+
Get django-cfg built-in apps based on enabled features.
|
103
|
+
|
104
|
+
Returns:
|
105
|
+
List of django-cfg app labels
|
106
|
+
"""
|
107
|
+
apps = [
|
108
|
+
# Core apps (always enabled)
|
109
|
+
"django_cfg.modules.django_tailwind", # Universal Tailwind layouts
|
110
|
+
"django_cfg.apps.api.health",
|
111
|
+
"django_cfg.apps.api.commands",
|
112
|
+
]
|
113
|
+
|
114
|
+
# Add optional apps based on configuration
|
115
|
+
if self.config.enable_support:
|
116
|
+
apps.append("django_cfg.apps.support")
|
117
|
+
|
118
|
+
if self.config.enable_newsletter:
|
119
|
+
apps.append("django_cfg.apps.newsletter")
|
120
|
+
|
121
|
+
if self.config.enable_leads:
|
122
|
+
apps.append("django_cfg.apps.leads")
|
123
|
+
|
124
|
+
if self.config.enable_knowbase:
|
125
|
+
apps.append("django_cfg.apps.knowbase")
|
126
|
+
|
127
|
+
if self.config.enable_agents:
|
128
|
+
apps.append("django_cfg.apps.agents")
|
129
|
+
|
130
|
+
if self.config.enable_maintenance:
|
131
|
+
apps.append("django_cfg.apps.maintenance")
|
132
|
+
|
133
|
+
if self.config.payments and self.config.payments.enabled:
|
134
|
+
apps.append("django_cfg.apps.payments")
|
135
|
+
|
136
|
+
if self.config.django_ipc and self.config.django_ipc.enabled:
|
137
|
+
apps.append("django_cfg.modules.django_ipc_client.dashboard")
|
138
|
+
|
139
|
+
return apps
|
140
|
+
|
141
|
+
def _get_optional_apps(self) -> List[str]:
|
142
|
+
"""
|
143
|
+
Get optional apps like background tasks, dashboard apps, and frontend integrations.
|
144
|
+
|
145
|
+
Returns:
|
146
|
+
List of optional app labels
|
147
|
+
"""
|
148
|
+
apps = []
|
149
|
+
|
150
|
+
# Auto-enable tasks if needed by other features
|
151
|
+
if self.config.should_enable_tasks():
|
152
|
+
apps.append("django_dramatiq") # Add django_dramatiq first
|
153
|
+
apps.append("django_cfg.apps.tasks")
|
154
|
+
|
155
|
+
# Add DRF Tailwind theme module (uses Tailwind via CDN)
|
156
|
+
if self.config.enable_drf_tailwind:
|
157
|
+
apps.append("django_cfg.modules.django_drf_theme.apps.DjangoDRFThemeConfig")
|
158
|
+
|
159
|
+
# Add Tailwind CSS apps (optional, only if theme app exists)
|
160
|
+
# Note: DRF Tailwind theme doesn't require these
|
161
|
+
try:
|
162
|
+
import importlib
|
163
|
+
importlib.import_module(self.config.tailwind_app_name)
|
164
|
+
apps.append("tailwind")
|
165
|
+
apps.append(self.config.tailwind_app_name)
|
166
|
+
except (ImportError, ModuleNotFoundError):
|
167
|
+
# Tailwind app not installed, skip it
|
168
|
+
pass
|
169
|
+
|
170
|
+
# Add browser reload in development (if installed)
|
171
|
+
if self.config.debug:
|
172
|
+
try:
|
173
|
+
import django_browser_reload
|
174
|
+
apps.append("django_browser_reload")
|
175
|
+
except ImportError:
|
176
|
+
# django-browser-reload not installed, skip it
|
177
|
+
pass
|
178
|
+
|
179
|
+
# Auto-detect dashboard apps from Unfold callback
|
180
|
+
dashboard_apps = self._get_dashboard_apps_from_callback()
|
181
|
+
apps.extend(dashboard_apps)
|
182
|
+
|
183
|
+
return apps
|
184
|
+
|
185
|
+
def _get_dashboard_apps_from_callback(self) -> List[str]:
|
186
|
+
"""
|
187
|
+
Auto-detect dashboard apps from Unfold dashboard_callback setting.
|
188
|
+
|
189
|
+
Extracts app names from callback paths like:
|
190
|
+
- "api.dashboard.callbacks.main_dashboard_callback" → ["api.dashboard"]
|
191
|
+
- "myproject.admin.callbacks.dashboard" → ["myproject.admin"]
|
192
|
+
|
193
|
+
This allows django-cfg to automatically add dashboard apps to INSTALLED_APPS
|
194
|
+
without requiring manual configuration.
|
195
|
+
|
196
|
+
Returns:
|
197
|
+
List of dashboard app names to add to INSTALLED_APPS
|
198
|
+
"""
|
199
|
+
dashboard_apps = []
|
200
|
+
|
201
|
+
# Check if Unfold is configured with a theme
|
202
|
+
if not self.config.unfold or not self.config.unfold.theme:
|
203
|
+
return dashboard_apps
|
204
|
+
|
205
|
+
# Get dashboard callback path from theme
|
206
|
+
callback_path = getattr(self.config.unfold.theme, "dashboard_callback", None)
|
207
|
+
if not callback_path:
|
208
|
+
return dashboard_apps
|
209
|
+
|
210
|
+
try:
|
211
|
+
# Parse callback path: "api.dashboard.callbacks.main_dashboard_callback"
|
212
|
+
# Extract app part: "api.dashboard"
|
213
|
+
parts = callback_path.split(".")
|
214
|
+
|
215
|
+
# Look for common callback patterns
|
216
|
+
callback_indicators = ["callbacks", "views", "handlers"]
|
217
|
+
|
218
|
+
# Find the callback indicator and extract app path before it
|
219
|
+
app_parts = []
|
220
|
+
for i, part in enumerate(parts):
|
221
|
+
if part in callback_indicators:
|
222
|
+
app_parts = parts[:i] # Everything before the callback indicator
|
223
|
+
break
|
224
|
+
|
225
|
+
# If no callback indicator found, assume last part is function name
|
226
|
+
if not app_parts and len(parts) > 1:
|
227
|
+
app_parts = parts[:-1] # Everything except the last part
|
228
|
+
|
229
|
+
if app_parts:
|
230
|
+
app_name = ".".join(app_parts)
|
231
|
+
dashboard_apps.append(app_name)
|
232
|
+
|
233
|
+
except Exception:
|
234
|
+
# If parsing fails, silently continue - dashboard callback is optional
|
235
|
+
pass
|
236
|
+
|
237
|
+
return dashboard_apps
|
238
|
+
|
239
|
+
def _deduplicate(self, apps: List[str]) -> List[str]:
|
240
|
+
"""
|
241
|
+
Remove duplicate apps while preserving order.
|
242
|
+
|
243
|
+
Args:
|
244
|
+
apps: List of app labels (may contain duplicates)
|
245
|
+
|
246
|
+
Returns:
|
247
|
+
Deduplicated list of app labels
|
248
|
+
|
249
|
+
Example:
|
250
|
+
>>> builder._deduplicate(["app1", "app2", "app1", "app3"])
|
251
|
+
["app1", "app2", "app3"]
|
252
|
+
"""
|
253
|
+
seen = set()
|
254
|
+
return [app for app in apps if not (app in seen or seen.add(app))]
|
255
|
+
|
256
|
+
|
257
|
+
# Export builder
|
258
|
+
__all__ = ["InstalledAppsBuilder"]
|
@@ -0,0 +1,115 @@
|
|
1
|
+
"""
|
2
|
+
MIDDLEWARE builder for Django-CFG.
|
3
|
+
|
4
|
+
Single Responsibility: Build Django MIDDLEWARE list from configuration.
|
5
|
+
Extracted from original config.py for better maintainability.
|
6
|
+
|
7
|
+
Size: ~120 lines (focused on middleware logic)
|
8
|
+
"""
|
9
|
+
|
10
|
+
from typing import List, TYPE_CHECKING
|
11
|
+
|
12
|
+
from ..constants import DEFAULT_MIDDLEWARE
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from ..base.config_model import DjangoConfig
|
16
|
+
|
17
|
+
|
18
|
+
class MiddlewareBuilder:
|
19
|
+
"""
|
20
|
+
Builds MIDDLEWARE list from DjangoConfig.
|
21
|
+
|
22
|
+
Responsibilities:
|
23
|
+
- Add default Django middleware
|
24
|
+
- Insert CORS middleware if security domains configured
|
25
|
+
- Add feature-specific middleware (accounts, payments)
|
26
|
+
- Add custom user middleware
|
27
|
+
- Maintain correct middleware ordering
|
28
|
+
|
29
|
+
Example:
|
30
|
+
```python
|
31
|
+
builder = MiddlewareBuilder(config)
|
32
|
+
middleware = builder.build()
|
33
|
+
```
|
34
|
+
"""
|
35
|
+
|
36
|
+
def __init__(self, config: "DjangoConfig"):
|
37
|
+
"""
|
38
|
+
Initialize builder with configuration.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
config: DjangoConfig instance
|
42
|
+
"""
|
43
|
+
self.config = config
|
44
|
+
|
45
|
+
def build(self) -> List[str]:
|
46
|
+
"""
|
47
|
+
Build complete MIDDLEWARE list.
|
48
|
+
|
49
|
+
Returns:
|
50
|
+
List of middleware class paths in correct order
|
51
|
+
|
52
|
+
Example:
|
53
|
+
>>> config = DjangoConfig(security_domains=["example.com"])
|
54
|
+
>>> builder = MiddlewareBuilder(config)
|
55
|
+
>>> middleware = builder.build()
|
56
|
+
>>> "corsheaders.middleware.CorsMiddleware" in middleware
|
57
|
+
True
|
58
|
+
"""
|
59
|
+
# Start with default middleware
|
60
|
+
middleware = list(DEFAULT_MIDDLEWARE)
|
61
|
+
|
62
|
+
# Add CORS middleware if security domains configured
|
63
|
+
# Insert after WhiteNoise but before Session middleware
|
64
|
+
if self.config.security_domains:
|
65
|
+
# Find WhiteNoise position
|
66
|
+
try:
|
67
|
+
whitenoise_index = middleware.index("whitenoise.middleware.WhiteNoiseMiddleware")
|
68
|
+
# Insert CORS after WhiteNoise
|
69
|
+
middleware.insert(whitenoise_index + 1, "corsheaders.middleware.CorsMiddleware")
|
70
|
+
except ValueError:
|
71
|
+
# If WhiteNoise not found, insert at beginning
|
72
|
+
middleware.insert(0, "corsheaders.middleware.CorsMiddleware")
|
73
|
+
|
74
|
+
# Add django-cfg feature-specific middleware
|
75
|
+
feature_middleware = self._get_feature_middleware()
|
76
|
+
middleware.extend(feature_middleware)
|
77
|
+
|
78
|
+
# Add custom user middleware
|
79
|
+
middleware.extend(self.config.custom_middleware)
|
80
|
+
|
81
|
+
return middleware
|
82
|
+
|
83
|
+
def _get_feature_middleware(self) -> List[str]:
|
84
|
+
"""
|
85
|
+
Get middleware for enabled django-cfg features.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
List of feature-specific middleware class paths
|
89
|
+
"""
|
90
|
+
middleware = []
|
91
|
+
|
92
|
+
# Accounts middleware (user activity tracking)
|
93
|
+
if self.config.enable_accounts:
|
94
|
+
middleware.append("django_cfg.middleware.UserActivityMiddleware")
|
95
|
+
|
96
|
+
# Payments middleware (if enabled and configured)
|
97
|
+
if self.config.payments and self.config.payments.enabled:
|
98
|
+
payment_middleware = self.config.payments.get_middleware_classes()
|
99
|
+
middleware.extend(payment_middleware)
|
100
|
+
|
101
|
+
# Tailwind CSS middleware (browser reload in development)
|
102
|
+
# Note: Must be after middleware that encodes responses (like GZipMiddleware)
|
103
|
+
if self.config.debug:
|
104
|
+
try:
|
105
|
+
import django_browser_reload
|
106
|
+
middleware.append("django_browser_reload.middleware.BrowserReloadMiddleware")
|
107
|
+
except ImportError:
|
108
|
+
# django-browser-reload not installed, skip it
|
109
|
+
pass
|
110
|
+
|
111
|
+
return middleware
|
112
|
+
|
113
|
+
|
114
|
+
# Export builder
|
115
|
+
__all__ = ["MiddlewareBuilder"]
|
@@ -0,0 +1,96 @@
|
|
1
|
+
"""
|
2
|
+
Security settings builder for Django-CFG.
|
3
|
+
|
4
|
+
Single Responsibility: Build security-related Django settings (ALLOWED_HOSTS, CORS, etc.).
|
5
|
+
Extracted from original config.py for better maintainability.
|
6
|
+
|
7
|
+
Size: ~100 lines (focused on security)
|
8
|
+
"""
|
9
|
+
|
10
|
+
from typing import List, TYPE_CHECKING
|
11
|
+
|
12
|
+
if TYPE_CHECKING:
|
13
|
+
from ..base.config_model import DjangoConfig
|
14
|
+
|
15
|
+
|
16
|
+
class SecurityBuilder:
|
17
|
+
"""
|
18
|
+
Builds security-related settings from DjangoConfig.
|
19
|
+
|
20
|
+
Responsibilities:
|
21
|
+
- Generate ALLOWED_HOSTS from security_domains
|
22
|
+
- Add localhost/127.0.0.1 in development
|
23
|
+
- Prepare CORS settings
|
24
|
+
- Handle SSL redirect configuration
|
25
|
+
|
26
|
+
Example:
|
27
|
+
```python
|
28
|
+
builder = SecurityBuilder(config)
|
29
|
+
allowed_hosts = builder.build_allowed_hosts()
|
30
|
+
```
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __init__(self, config: "DjangoConfig"):
|
34
|
+
"""
|
35
|
+
Initialize builder with configuration.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
config: DjangoConfig instance
|
39
|
+
"""
|
40
|
+
self.config = config
|
41
|
+
|
42
|
+
def build_allowed_hosts(self) -> List[str]:
|
43
|
+
"""
|
44
|
+
Build ALLOWED_HOSTS from security_domains.
|
45
|
+
|
46
|
+
In development:
|
47
|
+
- Adds localhost, 127.0.0.1, [::1]
|
48
|
+
- Adds security_domains if provided
|
49
|
+
|
50
|
+
In production:
|
51
|
+
- Uses only security_domains
|
52
|
+
- Warning if security_domains is empty
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
List of allowed host patterns
|
56
|
+
|
57
|
+
Example:
|
58
|
+
>>> config = DjangoConfig(
|
59
|
+
... env_mode=EnvironmentMode.PRODUCTION,
|
60
|
+
... security_domains=["example.com", "api.example.com"]
|
61
|
+
... )
|
62
|
+
>>> builder = SecurityBuilder(config)
|
63
|
+
>>> hosts = builder.build_allowed_hosts()
|
64
|
+
>>> "example.com" in hosts
|
65
|
+
True
|
66
|
+
"""
|
67
|
+
allowed_hosts = []
|
68
|
+
|
69
|
+
# Development mode: add localhost by default
|
70
|
+
if self.config.is_development:
|
71
|
+
allowed_hosts.extend([
|
72
|
+
"localhost",
|
73
|
+
"127.0.0.1",
|
74
|
+
"[::1]", # IPv6 localhost
|
75
|
+
])
|
76
|
+
|
77
|
+
# Add security domains (both dev and prod)
|
78
|
+
allowed_hosts.extend(self.config.security_domains)
|
79
|
+
|
80
|
+
# Production warning if no domains configured
|
81
|
+
if self.config.is_production and not self.config.security_domains:
|
82
|
+
import warnings
|
83
|
+
warnings.warn(
|
84
|
+
"No security_domains configured in production mode. "
|
85
|
+
"Add domains to security_domains field for proper security.",
|
86
|
+
UserWarning,
|
87
|
+
stacklevel=2,
|
88
|
+
)
|
89
|
+
# In production without domains, allow all (not recommended)
|
90
|
+
allowed_hosts = ["*"]
|
91
|
+
|
92
|
+
return allowed_hosts
|
93
|
+
|
94
|
+
|
95
|
+
# Export builder
|
96
|
+
__all__ = ["SecurityBuilder"]
|