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
django_cfg/utils/toolkit.py
DELETED
@@ -1,703 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
ConfigToolkit - Amazing Django Configuration Experience
|
3
|
-
|
4
|
-
The main interface for type-safe, environment-aware Django configuration.
|
5
|
-
"""
|
6
|
-
|
7
|
-
import os
|
8
|
-
import time
|
9
|
-
import logging
|
10
|
-
from pathlib import Path
|
11
|
-
from typing import Dict, Any, Optional, Type, TypeVar
|
12
|
-
from threading import Lock
|
13
|
-
|
14
|
-
from ..models.environment import EnvironmentConfig
|
15
|
-
from ..models.database import DatabaseConfig
|
16
|
-
from ..models.security import SecurityConfig
|
17
|
-
from ..models.api import APIConfig
|
18
|
-
from ..models.cache import CacheConfig
|
19
|
-
from ..models.email import EmailConfig
|
20
|
-
from ..modules.django_unfold.models.config import UnfoldConfig
|
21
|
-
from ..models.constance import ConstanceConfig
|
22
|
-
from ..models.logging import LoggingConfig
|
23
|
-
|
24
|
-
logger = logging.getLogger(__name__)
|
25
|
-
|
26
|
-
T = TypeVar('T')
|
27
|
-
|
28
|
-
|
29
|
-
class ConfigToolkit:
|
30
|
-
"""
|
31
|
-
🚀 ConfigToolkit - Amazing Django Configuration Experience
|
32
|
-
|
33
|
-
Features:
|
34
|
-
- Type-safe configuration access with properties
|
35
|
-
- Automatic environment detection
|
36
|
-
- One-line Django settings integration
|
37
|
-
- Smart defaults and validation
|
38
|
-
- Amazing developer experience
|
39
|
-
|
40
|
-
Usage:
|
41
|
-
# Django settings.py
|
42
|
-
from django_cfg import ConfigToolkit
|
43
|
-
globals().update(ConfigToolkit.get_django_settings())
|
44
|
-
|
45
|
-
# Anywhere in your code
|
46
|
-
if ConfigToolkit.debug:
|
47
|
-
print("Debug mode active")
|
48
|
-
|
49
|
-
db_url = ConfigToolkit.database_url
|
50
|
-
page_size = ConfigToolkit.api_page_size
|
51
|
-
"""
|
52
|
-
|
53
|
-
_instance: Optional['ConfigToolkit'] = None
|
54
|
-
_lock = Lock()
|
55
|
-
_initialized = False
|
56
|
-
|
57
|
-
# Configuration instances
|
58
|
-
_env_config: Optional[EnvironmentConfig] = None
|
59
|
-
_db_config: Optional[DatabaseConfig] = None
|
60
|
-
_security_config: Optional[SecurityConfig] = None
|
61
|
-
_api_config: Optional[APIConfig] = None
|
62
|
-
_cache_config: Optional[CacheConfig] = None
|
63
|
-
_email_config: Optional[EmailConfig] = None
|
64
|
-
_unfold_config: Optional[UnfoldConfig] = None
|
65
|
-
# Revolution config removed - use django_revolution directly
|
66
|
-
_constance_config: Optional[ConstanceConfig] = None
|
67
|
-
_logging_config: Optional[LoggingConfig] = None
|
68
|
-
|
69
|
-
# Performance tracking
|
70
|
-
_init_time_ms = 0
|
71
|
-
_config_cache = {}
|
72
|
-
|
73
|
-
def __new__(cls, *args, **kwargs):
|
74
|
-
"""Singleton pattern for configuration."""
|
75
|
-
if cls._instance is None:
|
76
|
-
with cls._lock:
|
77
|
-
if cls._instance is None:
|
78
|
-
cls._instance = super().__new__(cls)
|
79
|
-
return cls._instance
|
80
|
-
|
81
|
-
def __init__(self,
|
82
|
-
database_config: Optional[DatabaseConfig] = None,
|
83
|
-
security_config: Optional[SecurityConfig] = None,
|
84
|
-
cache_config: Optional[CacheConfig] = None,
|
85
|
-
email_config: Optional[EmailConfig] = None,
|
86
|
-
unfold_config: Optional[UnfoldConfig] = None,
|
87
|
-
constance_config: Optional[ConstanceConfig] = None,
|
88
|
-
logging_config: Optional[LoggingConfig] = None):
|
89
|
-
"""
|
90
|
-
Initialize ConfigToolkit with configuration models.
|
91
|
-
|
92
|
-
Args:
|
93
|
-
database_config: Custom database configuration
|
94
|
-
security_config: Custom security configuration
|
95
|
-
cache_config: Custom cache configuration
|
96
|
-
email_config: Custom email configuration
|
97
|
-
unfold_config: Custom Unfold configuration
|
98
|
-
constance_config: Custom Constance configuration
|
99
|
-
logging_config: Custom logging configuration
|
100
|
-
"""
|
101
|
-
if self._initialized:
|
102
|
-
return
|
103
|
-
|
104
|
-
start_time = time.perf_counter()
|
105
|
-
|
106
|
-
try:
|
107
|
-
# Load configurations (use provided configs or create defaults)
|
108
|
-
self._load_configurations(
|
109
|
-
database_config=database_config,
|
110
|
-
security_config=security_config,
|
111
|
-
cache_config=cache_config,
|
112
|
-
email_config=email_config,
|
113
|
-
unfold_config=unfold_config,
|
114
|
-
constance_config=constance_config,
|
115
|
-
logging_config=logging_config,
|
116
|
-
)
|
117
|
-
|
118
|
-
# Configure security based on environment
|
119
|
-
self._configure_security()
|
120
|
-
|
121
|
-
# Cache performance info
|
122
|
-
self._init_time_ms = (time.perf_counter() - start_time) * 1000
|
123
|
-
self._initialized = True
|
124
|
-
|
125
|
-
# Show developer-friendly info
|
126
|
-
if self.debug:
|
127
|
-
print(f"🚀 ConfigToolkit initialized in {self._init_time_ms:.2f}ms")
|
128
|
-
print(f"🌍 Environment: {self.environment}")
|
129
|
-
|
130
|
-
except Exception as e:
|
131
|
-
logger.error(f"❌ ConfigToolkit initialization failed: {e}")
|
132
|
-
raise
|
133
|
-
|
134
|
-
def _load_configurations(self,
|
135
|
-
database_config: Optional[DatabaseConfig] = None,
|
136
|
-
security_config: Optional[SecurityConfig] = None,
|
137
|
-
cache_config: Optional[CacheConfig] = None,
|
138
|
-
email_config: Optional[EmailConfig] = None,
|
139
|
-
unfold_config: Optional[UnfoldConfig] = None,
|
140
|
-
constance_config: Optional[ConstanceConfig] = None,
|
141
|
-
logging_config: Optional[LoggingConfig] = None):
|
142
|
-
"""Load all Pydantic configuration models."""
|
143
|
-
# Core configurations (always loaded)
|
144
|
-
self._env_config = EnvironmentConfig()
|
145
|
-
self._db_config = database_config or DatabaseConfig()
|
146
|
-
self._security_config = security_config or SecurityConfig()
|
147
|
-
self._api_config = APIConfig() # Keep default for now
|
148
|
-
self._cache_config = cache_config or CacheConfig()
|
149
|
-
self._email_config = email_config or EmailConfig()
|
150
|
-
|
151
|
-
# Extended configurations (optional, loaded if dependencies available)
|
152
|
-
self._load_extended_configurations(
|
153
|
-
unfold_config=unfold_config,
|
154
|
-
constance_config=constance_config,
|
155
|
-
logging_config=logging_config,
|
156
|
-
)
|
157
|
-
|
158
|
-
logger.info("✅ All configuration models loaded")
|
159
|
-
|
160
|
-
def _load_extended_configurations(self,
|
161
|
-
unfold_config: Optional[UnfoldConfig] = None,
|
162
|
-
constance_config: Optional[ConstanceConfig] = None,
|
163
|
-
logging_config: Optional[LoggingConfig] = None):
|
164
|
-
"""Load extended configurations if dependencies are available."""
|
165
|
-
config_count = 6 # Core configs
|
166
|
-
|
167
|
-
# Unfold configuration
|
168
|
-
if unfold_config:
|
169
|
-
self._unfold_config = unfold_config
|
170
|
-
config_count += 1
|
171
|
-
logger.info("✅ Custom Unfold configuration loaded")
|
172
|
-
else:
|
173
|
-
self._unfold_config = UnfoldConfig()
|
174
|
-
config_count += 1
|
175
|
-
logger.info("✅ Default Unfold configuration loaded")
|
176
|
-
|
177
|
-
# Revolution config removed - configure directly in Django settings
|
178
|
-
|
179
|
-
# Constance configuration
|
180
|
-
if constance_config:
|
181
|
-
self._constance_config = constance_config
|
182
|
-
config_count += 1
|
183
|
-
logger.info("✅ Custom Constance configuration loaded")
|
184
|
-
else:
|
185
|
-
self._constance_config = ConstanceConfig()
|
186
|
-
config_count += 1
|
187
|
-
logger.info("✅ Default Constance configuration loaded")
|
188
|
-
|
189
|
-
# Logging configuration (always available)
|
190
|
-
self._logging_config = logging_config or LoggingConfig()
|
191
|
-
config_count += 1
|
192
|
-
|
193
|
-
self._config_count = config_count
|
194
|
-
|
195
|
-
def _configure_security(self):
|
196
|
-
"""Configure security settings based on environment."""
|
197
|
-
if self._env_config.is_production:
|
198
|
-
self._security_config.configure_for_production()
|
199
|
-
else:
|
200
|
-
self._security_config.configure_for_development()
|
201
|
-
|
202
|
-
# ===============================================
|
203
|
-
# 🔥 CLASS METHODS - Main API
|
204
|
-
# ===============================================
|
205
|
-
|
206
|
-
@classmethod
|
207
|
-
def get_django_settings(cls) -> Dict[str, Any]:
|
208
|
-
"""
|
209
|
-
🔥 Get complete Django settings dictionary
|
210
|
-
|
211
|
-
This is the main method for Django integration.
|
212
|
-
Use in settings.py like this:
|
213
|
-
|
214
|
-
from django_cfg import ConfigToolkit
|
215
|
-
globals().update(ConfigToolkit.get_django_settings())
|
216
|
-
"""
|
217
|
-
instance = cls()
|
218
|
-
settings = {}
|
219
|
-
|
220
|
-
# Merge all configuration settings
|
221
|
-
settings.update(instance._env_config.to_django_settings())
|
222
|
-
settings.update(instance._db_config.to_django_settings())
|
223
|
-
settings.update(instance._security_config.to_django_settings())
|
224
|
-
settings.update(instance._api_config.to_django_settings())
|
225
|
-
settings.update(instance._cache_config.to_django_settings())
|
226
|
-
settings.update(instance._email_config.to_django_settings())
|
227
|
-
|
228
|
-
# Extended configurations
|
229
|
-
if instance._unfold_config:
|
230
|
-
settings.update(instance._unfold_config.to_django_settings())
|
231
|
-
|
232
|
-
# Revolution settings applied directly in Django settings
|
233
|
-
|
234
|
-
if instance._constance_config:
|
235
|
-
settings.update(instance._constance_config.to_django_settings())
|
236
|
-
|
237
|
-
if instance._logging_config:
|
238
|
-
settings.update(instance._logging_config.to_django_settings())
|
239
|
-
|
240
|
-
# Add third-party apps to INSTALLED_APPS if needed
|
241
|
-
cls._extend_installed_apps(settings)
|
242
|
-
cls._extend_middleware(settings)
|
243
|
-
cls._extend_templates(settings)
|
244
|
-
|
245
|
-
return settings
|
246
|
-
|
247
|
-
@classmethod
|
248
|
-
def _extend_installed_apps(cls, settings: Dict[str, Any]):
|
249
|
-
"""Extend INSTALLED_APPS with required third-party packages."""
|
250
|
-
installed_apps = settings.get('INSTALLED_APPS', [])
|
251
|
-
|
252
|
-
# Add common third-party apps
|
253
|
-
third_party_apps = [
|
254
|
-
'rest_framework',
|
255
|
-
'rest_framework.authtoken',
|
256
|
-
'rest_framework_simplejwt',
|
257
|
-
'django_filters',
|
258
|
-
'corsheaders',
|
259
|
-
]
|
260
|
-
|
261
|
-
# Add API documentation if enabled
|
262
|
-
instance = cls()
|
263
|
-
if instance._api_config.docs_enabled:
|
264
|
-
third_party_apps.extend([
|
265
|
-
'drf_spectacular',
|
266
|
-
'drf_spectacular_sidecar',
|
267
|
-
])
|
268
|
-
|
269
|
-
# Handle special Unfold apps that need to be BEFORE django.contrib.admin
|
270
|
-
unfold_apps = []
|
271
|
-
if '_UNFOLD_APPS' in settings:
|
272
|
-
unfold_apps = settings['_UNFOLD_APPS']
|
273
|
-
del settings['_UNFOLD_APPS']
|
274
|
-
|
275
|
-
# Add other extended apps
|
276
|
-
for app_key in ['_REVOLUTION_APPS', '_CONSTANCE_APPS']:
|
277
|
-
if app_key in settings:
|
278
|
-
third_party_apps.extend(settings[app_key])
|
279
|
-
del settings[app_key] # Remove helper key
|
280
|
-
|
281
|
-
# Insert Unfold apps BEFORE django.contrib.admin
|
282
|
-
if unfold_apps:
|
283
|
-
admin_index = None
|
284
|
-
for i, app in enumerate(installed_apps):
|
285
|
-
if app == 'django.contrib.admin':
|
286
|
-
admin_index = i
|
287
|
-
break
|
288
|
-
|
289
|
-
if admin_index is not None:
|
290
|
-
# Insert unfold apps before admin
|
291
|
-
for app in reversed(unfold_apps):
|
292
|
-
if app not in installed_apps:
|
293
|
-
installed_apps.insert(admin_index, app)
|
294
|
-
else:
|
295
|
-
# If no admin app found, add at the beginning
|
296
|
-
for app in unfold_apps:
|
297
|
-
if app not in installed_apps:
|
298
|
-
installed_apps.insert(0, app)
|
299
|
-
|
300
|
-
# Add other apps that aren't already present
|
301
|
-
for app in third_party_apps:
|
302
|
-
if app not in installed_apps:
|
303
|
-
installed_apps.append(app)
|
304
|
-
|
305
|
-
settings['INSTALLED_APPS'] = installed_apps
|
306
|
-
|
307
|
-
@classmethod
|
308
|
-
def _extend_middleware(cls, settings: Dict[str, Any]):
|
309
|
-
"""Extend MIDDLEWARE with required middleware."""
|
310
|
-
middleware = settings.get('MIDDLEWARE', [])
|
311
|
-
|
312
|
-
# Add CORS middleware at the beginning if CORS is enabled
|
313
|
-
instance = cls()
|
314
|
-
if instance._security_config.cors_enabled:
|
315
|
-
cors_middleware = 'corsheaders.middleware.CorsMiddleware'
|
316
|
-
if cors_middleware not in middleware:
|
317
|
-
middleware.insert(0, cors_middleware)
|
318
|
-
|
319
|
-
settings['MIDDLEWARE'] = middleware
|
320
|
-
|
321
|
-
@classmethod
|
322
|
-
def _extend_templates(cls, settings: Dict[str, Any]):
|
323
|
-
"""Extend TEMPLATES with django-cfg template directories."""
|
324
|
-
from pathlib import Path
|
325
|
-
|
326
|
-
print("🔍 _extend_templates called!")
|
327
|
-
|
328
|
-
# Get django-cfg base directory
|
329
|
-
django_cfg_dir = Path(__file__).parent.parent
|
330
|
-
print(f"🔍 Django-CFG base dir: {django_cfg_dir}")
|
331
|
-
|
332
|
-
# Collect all template directories
|
333
|
-
template_dirs = []
|
334
|
-
|
335
|
-
# 1. Main toolkit templates (if exists)
|
336
|
-
toolkit_templates = django_cfg_dir / 'utils' / 'templates'
|
337
|
-
print(f"🔍 Checking toolkit templates: {toolkit_templates} (exists: {toolkit_templates.exists()})")
|
338
|
-
if toolkit_templates.exists():
|
339
|
-
template_dirs.append(str(toolkit_templates))
|
340
|
-
|
341
|
-
# 2. Auto-discover app template directories
|
342
|
-
apps_dir = django_cfg_dir / 'apps'
|
343
|
-
print(f"🔍 Checking apps dir: {apps_dir} (exists: {apps_dir.exists()})")
|
344
|
-
if apps_dir.exists():
|
345
|
-
for app_dir in apps_dir.iterdir():
|
346
|
-
if app_dir.is_dir() and not app_dir.name.startswith(('@', '_', '.')):
|
347
|
-
print(f"🔍 Checking app: {app_dir.name}")
|
348
|
-
# Look for common template directory patterns
|
349
|
-
possible_template_dirs = [
|
350
|
-
app_dir / 'templates',
|
351
|
-
app_dir / 'admin_interface' / 'templates',
|
352
|
-
app_dir / 'frontend' / 'templates',
|
353
|
-
]
|
354
|
-
|
355
|
-
for template_dir in possible_template_dirs:
|
356
|
-
print(f"🔍 Checking template dir: {template_dir} (exists: {template_dir.exists()})")
|
357
|
-
if template_dir.exists():
|
358
|
-
template_dirs.append(str(template_dir))
|
359
|
-
|
360
|
-
# Debug: Print found template directories
|
361
|
-
print(f"🔍 Django-CFG found template directories: {template_dirs}")
|
362
|
-
|
363
|
-
# Add template directories to Django settings
|
364
|
-
if template_dirs:
|
365
|
-
templates = settings.get('TEMPLATES', [])
|
366
|
-
print(f"🔍 Current TEMPLATES config: {templates}")
|
367
|
-
|
368
|
-
# Find the first Django template backend and add our template directories
|
369
|
-
for template_config in templates:
|
370
|
-
if template_config.get('BACKEND') == 'django.template.backends.django.DjangoTemplates':
|
371
|
-
dirs = template_config.get('DIRS', [])
|
372
|
-
print(f"🔍 Current DIRS: {dirs}")
|
373
|
-
|
374
|
-
# Add each template directory if not already present
|
375
|
-
for template_dir in template_dirs:
|
376
|
-
if template_dir not in [str(d) for d in dirs]:
|
377
|
-
dirs.append(template_dir)
|
378
|
-
|
379
|
-
template_config['DIRS'] = dirs
|
380
|
-
print(f"🔍 Final TEMPLATE_DIRS: {dirs}")
|
381
|
-
break
|
382
|
-
|
383
|
-
settings['TEMPLATES'] = templates
|
384
|
-
else:
|
385
|
-
print("🔍 No template directories found!")
|
386
|
-
|
387
|
-
# ===============================================
|
388
|
-
# 🌍 ENVIRONMENT PROPERTIES
|
389
|
-
# ===============================================
|
390
|
-
|
391
|
-
@classmethod
|
392
|
-
@property
|
393
|
-
def debug(cls) -> bool:
|
394
|
-
"""Django DEBUG setting."""
|
395
|
-
return cls()._env_config.debug
|
396
|
-
|
397
|
-
@classmethod
|
398
|
-
@property
|
399
|
-
def secret_key(cls) -> str:
|
400
|
-
"""Django SECRET_KEY."""
|
401
|
-
return cls()._env_config.secret_key
|
402
|
-
|
403
|
-
@classmethod
|
404
|
-
@property
|
405
|
-
def allowed_hosts(cls) -> list:
|
406
|
-
"""Django ALLOWED_HOSTS."""
|
407
|
-
return cls()._env_config.allowed_hosts
|
408
|
-
|
409
|
-
@classmethod
|
410
|
-
@property
|
411
|
-
def is_production(cls) -> bool:
|
412
|
-
"""True if running in production."""
|
413
|
-
return cls()._env_config.is_production
|
414
|
-
|
415
|
-
@classmethod
|
416
|
-
@property
|
417
|
-
def is_development(cls) -> bool:
|
418
|
-
"""True if running in development."""
|
419
|
-
return cls()._env_config.is_development
|
420
|
-
|
421
|
-
@classmethod
|
422
|
-
@property
|
423
|
-
def is_docker(cls) -> bool:
|
424
|
-
"""True if running in Docker."""
|
425
|
-
return cls()._env_config.is_docker
|
426
|
-
|
427
|
-
@classmethod
|
428
|
-
@property
|
429
|
-
def environment(cls) -> str:
|
430
|
-
"""Environment name."""
|
431
|
-
return cls()._env_config.environment
|
432
|
-
|
433
|
-
# ===============================================
|
434
|
-
# 🗄️ DATABASE PROPERTIES
|
435
|
-
# ===============================================
|
436
|
-
|
437
|
-
@classmethod
|
438
|
-
@property
|
439
|
-
def database_url(cls) -> str:
|
440
|
-
"""Primary database URL."""
|
441
|
-
return cls()._db_config.database_url
|
442
|
-
|
443
|
-
@classmethod
|
444
|
-
@property
|
445
|
-
def database_max_connections(cls) -> int:
|
446
|
-
"""Database max connections."""
|
447
|
-
return cls()._db_config.max_connections
|
448
|
-
|
449
|
-
@classmethod
|
450
|
-
@property
|
451
|
-
def database_engine(cls) -> str:
|
452
|
-
"""Database engine type."""
|
453
|
-
return cls()._db_config.database_engine
|
454
|
-
|
455
|
-
@classmethod
|
456
|
-
@property
|
457
|
-
def is_sqlite(cls) -> bool:
|
458
|
-
"""True if using SQLite."""
|
459
|
-
return cls()._db_config.is_sqlite
|
460
|
-
|
461
|
-
@classmethod
|
462
|
-
@property
|
463
|
-
def is_postgresql(cls) -> bool:
|
464
|
-
"""True if using PostgreSQL."""
|
465
|
-
return cls()._db_config.is_postgresql
|
466
|
-
|
467
|
-
# ===============================================
|
468
|
-
# 🔒 SECURITY PROPERTIES
|
469
|
-
# ===============================================
|
470
|
-
|
471
|
-
@classmethod
|
472
|
-
@property
|
473
|
-
def cors_enabled(cls) -> bool:
|
474
|
-
"""True if CORS is enabled."""
|
475
|
-
return cls()._security_config.cors_enabled
|
476
|
-
|
477
|
-
@classmethod
|
478
|
-
@property
|
479
|
-
def csrf_enabled(cls) -> bool:
|
480
|
-
"""True if CSRF is enabled."""
|
481
|
-
return cls()._security_config.csrf_enabled
|
482
|
-
|
483
|
-
@classmethod
|
484
|
-
@property
|
485
|
-
def ssl_enabled(cls) -> bool:
|
486
|
-
"""True if SSL redirect is enabled."""
|
487
|
-
return cls()._security_config.ssl_redirect
|
488
|
-
|
489
|
-
# ===============================================
|
490
|
-
# 🌐 API PROPERTIES
|
491
|
-
# ===============================================
|
492
|
-
|
493
|
-
@classmethod
|
494
|
-
@property
|
495
|
-
def api_page_size(cls) -> int:
|
496
|
-
"""API pagination page size."""
|
497
|
-
return cls()._api_config.page_size
|
498
|
-
|
499
|
-
@classmethod
|
500
|
-
@property
|
501
|
-
def api_max_page_size(cls) -> int:
|
502
|
-
"""API max page size."""
|
503
|
-
return cls()._api_config.max_page_size
|
504
|
-
|
505
|
-
@classmethod
|
506
|
-
@property
|
507
|
-
def api_rate_limit_enabled(cls) -> bool:
|
508
|
-
"""True if API rate limiting is enabled."""
|
509
|
-
return cls()._api_config.rate_limit_enabled
|
510
|
-
|
511
|
-
@classmethod
|
512
|
-
@property
|
513
|
-
def api_docs_enabled(cls) -> bool:
|
514
|
-
"""True if API docs are enabled."""
|
515
|
-
return cls()._api_config.docs_enabled
|
516
|
-
|
517
|
-
# ===============================================
|
518
|
-
# 💾 CACHE PROPERTIES
|
519
|
-
# ===============================================
|
520
|
-
|
521
|
-
@classmethod
|
522
|
-
@property
|
523
|
-
def cache_backend(cls) -> str:
|
524
|
-
"""Cache backend type."""
|
525
|
-
return cls()._cache_config.backend
|
526
|
-
|
527
|
-
@classmethod
|
528
|
-
@property
|
529
|
-
def cache_timeout(cls) -> int:
|
530
|
-
"""Default cache timeout."""
|
531
|
-
return cls()._cache_config.default_timeout
|
532
|
-
|
533
|
-
# ===============================================
|
534
|
-
# 🎨 UNFOLD PROPERTIES
|
535
|
-
# ===============================================
|
536
|
-
|
537
|
-
@classmethod
|
538
|
-
@property
|
539
|
-
def unfold_enabled(cls) -> bool:
|
540
|
-
"""True if Unfold admin is enabled."""
|
541
|
-
return cls()._unfold_config is not None
|
542
|
-
|
543
|
-
@classmethod
|
544
|
-
@property
|
545
|
-
def site_title(cls) -> str:
|
546
|
-
"""Site title from Unfold config."""
|
547
|
-
instance = cls()
|
548
|
-
return instance._unfold_config.site_title if instance._unfold_config else "Admin"
|
549
|
-
|
550
|
-
# ===============================================
|
551
|
-
# 🚀 REVOLUTION PROPERTIES
|
552
|
-
# ===============================================
|
553
|
-
|
554
|
-
@classmethod
|
555
|
-
@property
|
556
|
-
def revolution_enabled(cls) -> bool:
|
557
|
-
"""True if Django Revolution is enabled."""
|
558
|
-
instance = cls()
|
559
|
-
return False # Revolution configured directly in Django settings
|
560
|
-
|
561
|
-
@classmethod
|
562
|
-
@property
|
563
|
-
def api_prefix(cls) -> str:
|
564
|
-
"""API prefix from Revolution config."""
|
565
|
-
instance = cls()
|
566
|
-
return "api" # Revolution configured directly in Django settings
|
567
|
-
|
568
|
-
# ===============================================
|
569
|
-
# ⚙️ CONSTANCE PROPERTIES
|
570
|
-
# ===============================================
|
571
|
-
|
572
|
-
@classmethod
|
573
|
-
@property
|
574
|
-
def constance_enabled(cls) -> bool:
|
575
|
-
"""True if Constance is enabled."""
|
576
|
-
return cls()._constance_config is not None
|
577
|
-
|
578
|
-
@classmethod
|
579
|
-
@property
|
580
|
-
def constance_backend(cls) -> str:
|
581
|
-
"""Constance backend."""
|
582
|
-
instance = cls()
|
583
|
-
return instance._constance_config.backend if instance._constance_config else "database"
|
584
|
-
|
585
|
-
# ===============================================
|
586
|
-
# 📝 LOGGING PROPERTIES
|
587
|
-
# ===============================================
|
588
|
-
|
589
|
-
@classmethod
|
590
|
-
@property
|
591
|
-
def logging_enabled(cls) -> bool:
|
592
|
-
"""True if logging is configured."""
|
593
|
-
return cls()._logging_config is not None
|
594
|
-
|
595
|
-
@classmethod
|
596
|
-
@property
|
597
|
-
def log_level(cls) -> str:
|
598
|
-
"""Root log level."""
|
599
|
-
instance = cls()
|
600
|
-
return instance._logging_config.root_level if instance._logging_config else "INFO"
|
601
|
-
|
602
|
-
# ===============================================
|
603
|
-
# 📧 EMAIL PROPERTIES
|
604
|
-
# ===============================================
|
605
|
-
|
606
|
-
@classmethod
|
607
|
-
@property
|
608
|
-
def email_backend(cls) -> str:
|
609
|
-
"""Email backend."""
|
610
|
-
return cls()._email_config.backend
|
611
|
-
|
612
|
-
@classmethod
|
613
|
-
@property
|
614
|
-
def email_host(cls) -> str:
|
615
|
-
"""Email host."""
|
616
|
-
return cls()._email_config.host
|
617
|
-
|
618
|
-
@classmethod
|
619
|
-
@property
|
620
|
-
def email_from(cls) -> str:
|
621
|
-
"""Default from email."""
|
622
|
-
return cls()._email_config.default_from
|
623
|
-
|
624
|
-
# ===============================================
|
625
|
-
# 🛠️ DEVELOPER EXPERIENCE METHODS
|
626
|
-
# ===============================================
|
627
|
-
|
628
|
-
@classmethod
|
629
|
-
def print_config_summary(cls):
|
630
|
-
"""Print helpful configuration summary for developers."""
|
631
|
-
instance = cls()
|
632
|
-
|
633
|
-
print("🚀 Django Config Toolkit - Configuration Summary")
|
634
|
-
print("=" * 60)
|
635
|
-
print(f"🌍 Environment: {cls.environment.upper()}")
|
636
|
-
print(f"🔧 Debug: {cls.debug}")
|
637
|
-
print(f"🗄️ Database: {cls.database_engine}")
|
638
|
-
print(f"💾 Cache: {cls.cache_backend}")
|
639
|
-
print(f"📧 Email: {cls.email_backend}")
|
640
|
-
print(f"🔒 Security: CORS={cls.cors_enabled}, CSRF={cls.csrf_enabled}, SSL={cls.ssl_enabled}")
|
641
|
-
print(f"🌐 API: Docs={cls.api_docs_enabled}, Rate Limit={cls.api_rate_limit_enabled}")
|
642
|
-
print(f"⚡ Init Time: {instance._init_time_ms:.2f}ms")
|
643
|
-
print("=" * 60)
|
644
|
-
print("💡 Access anywhere: ConfigToolkit.debug, ConfigToolkit.database_url, etc.")
|
645
|
-
print("📚 Docs: https://django-config-toolkit.readthedocs.io/")
|
646
|
-
print("=" * 60)
|
647
|
-
|
648
|
-
@classmethod
|
649
|
-
def validate_configuration(cls) -> bool:
|
650
|
-
"""Validate all configurations for current environment."""
|
651
|
-
try:
|
652
|
-
instance = cls()
|
653
|
-
|
654
|
-
# Validate each configuration
|
655
|
-
env_valid = instance._env_config.validate_for_environment(cls.environment)
|
656
|
-
db_valid = instance._db_config.validate_for_environment(cls.environment)
|
657
|
-
|
658
|
-
return env_valid and db_valid
|
659
|
-
|
660
|
-
except Exception as e:
|
661
|
-
print(f"❌ Configuration validation failed: {e}")
|
662
|
-
return False
|
663
|
-
|
664
|
-
@classmethod
|
665
|
-
def create_env_examples(cls):
|
666
|
-
"""Create .env.example files for all configurations."""
|
667
|
-
configs = [
|
668
|
-
('environment', EnvironmentConfig),
|
669
|
-
('database', DatabaseConfig),
|
670
|
-
('security', SecurityConfig),
|
671
|
-
('api', APIConfig),
|
672
|
-
('cache', CacheConfig),
|
673
|
-
('email', EmailConfig),
|
674
|
-
]
|
675
|
-
|
676
|
-
print("🚀 Creating environment configuration examples...")
|
677
|
-
|
678
|
-
for name, config_class in configs:
|
679
|
-
filename = f".env.{name}.example"
|
680
|
-
config_class.create_env_example(filename)
|
681
|
-
|
682
|
-
# Create combined example
|
683
|
-
print("📋 Creating combined .env.example...")
|
684
|
-
EnvironmentConfig.create_env_example(".env.example")
|
685
|
-
|
686
|
-
print("✅ All environment examples created!")
|
687
|
-
print("💡 Copy .env.example to .env and customize your settings")
|
688
|
-
|
689
|
-
|
690
|
-
# Convenience functions for developers
|
691
|
-
def show_config():
|
692
|
-
"""Show configuration summary - helpful for debugging."""
|
693
|
-
ConfigToolkit.print_config_summary()
|
694
|
-
|
695
|
-
|
696
|
-
def validate_config() -> bool:
|
697
|
-
"""Validate current configuration."""
|
698
|
-
return ConfigToolkit.validate_configuration()
|
699
|
-
|
700
|
-
|
701
|
-
def create_env_examples():
|
702
|
-
"""Create .env example files."""
|
703
|
-
ConfigToolkit.create_env_examples()
|