django-cfg 1.3.11__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/inlines.py +11 -5
- 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.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
- 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.11.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.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,504 @@
|
|
1
|
+
# Django CFG Logging Strategy Guide
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
Django CFG uses a sophisticated logging system that automatically adjusts based on the `debug` configuration setting. This guide explains the logging architecture, how to control logging output, and best practices.
|
6
|
+
|
7
|
+
## Core Principles
|
8
|
+
|
9
|
+
### 1. Debug-Aware Logging
|
10
|
+
|
11
|
+
Logging verbosity is controlled by the `config.debug` setting:
|
12
|
+
|
13
|
+
```python
|
14
|
+
# config.py
|
15
|
+
debug: bool = False # Production
|
16
|
+
debug: bool = True # Development
|
17
|
+
```
|
18
|
+
|
19
|
+
**Log Levels by Mode:**
|
20
|
+
|
21
|
+
| Mode | Level | What You See |
|
22
|
+
|------|-------|--------------|
|
23
|
+
| `debug=True` | DEBUG | Everything: DEBUG, INFO, WARNING, ERROR, CRITICAL |
|
24
|
+
| `debug=False` | WARNING | Only important: WARNING, ERROR, CRITICAL |
|
25
|
+
|
26
|
+
**Why This Matters:**
|
27
|
+
- **Production** (`debug=False`): Clean logs, only warnings and errors → easier monitoring
|
28
|
+
- **Development** (`debug=True`): Verbose logs → easier debugging
|
29
|
+
|
30
|
+
### 2. Modular File Structure
|
31
|
+
|
32
|
+
Logs are organized by module for easy troubleshooting:
|
33
|
+
|
34
|
+
```
|
35
|
+
logs/
|
36
|
+
├── django.log # All Django logs (root logger)
|
37
|
+
└── djangocfg/
|
38
|
+
├── core.log # Core django_cfg functionality
|
39
|
+
├── apps.log # Apps (payments, agents, etc.)
|
40
|
+
├── models.log # Data models
|
41
|
+
└── modules.log # Modules (logging, tasks, etc.)
|
42
|
+
```
|
43
|
+
|
44
|
+
**Automatic Module Detection:**
|
45
|
+
The logging system automatically routes logs based on the logger name:
|
46
|
+
- `django_cfg.core.*` → `core.log`
|
47
|
+
- `django_cfg.apps.payments.*` → `apps.log`
|
48
|
+
- `django_cfg.modules.*` → `modules.log`
|
49
|
+
|
50
|
+
### 3. Dual Handler System
|
51
|
+
|
52
|
+
Each django-cfg logger has TWO handlers:
|
53
|
+
|
54
|
+
1. **Console Handler** (stdout/stderr)
|
55
|
+
- Uses Rich formatting for pretty output
|
56
|
+
- Respects debug level
|
57
|
+
- Shows in terminal during development
|
58
|
+
|
59
|
+
2. **File Handler** (modular)
|
60
|
+
- Plain text format for parsing
|
61
|
+
- Module-specific files
|
62
|
+
- Persists for analysis
|
63
|
+
|
64
|
+
## Configuration
|
65
|
+
|
66
|
+
### YAML Configuration
|
67
|
+
|
68
|
+
```yaml
|
69
|
+
# config.dev.yaml
|
70
|
+
debug: true # Verbose logging
|
71
|
+
|
72
|
+
# config.prod.yaml
|
73
|
+
debug: false # Only warnings/errors
|
74
|
+
```
|
75
|
+
|
76
|
+
### Environment Variable Fallback
|
77
|
+
|
78
|
+
If config is not available, uses `DEBUG` environment variable:
|
79
|
+
|
80
|
+
```bash
|
81
|
+
DEBUG=true python manage.py runserver # Verbose
|
82
|
+
DEBUG=false python manage.py runserver # Quiet
|
83
|
+
```
|
84
|
+
|
85
|
+
## Usage Examples
|
86
|
+
|
87
|
+
### Basic Logging
|
88
|
+
|
89
|
+
```python
|
90
|
+
from django_cfg.modules.django_logging import get_logger
|
91
|
+
|
92
|
+
logger = get_logger(__name__)
|
93
|
+
|
94
|
+
# These only show when debug=True:
|
95
|
+
logger.debug("Detailed debugging information")
|
96
|
+
logger.info("General informational message")
|
97
|
+
|
98
|
+
# These ALWAYS show:
|
99
|
+
logger.warning("Something unexpected happened")
|
100
|
+
logger.error("An error occurred")
|
101
|
+
logger.critical("Critical system failure")
|
102
|
+
```
|
103
|
+
|
104
|
+
### Auto-Detected Module Names
|
105
|
+
|
106
|
+
The `get_logger()` function automatically detects the module:
|
107
|
+
|
108
|
+
```python
|
109
|
+
# In: /django_cfg/apps/payments/services/provider.py
|
110
|
+
logger = get_logger() # Auto-detects as 'django_cfg.apps.payments'
|
111
|
+
|
112
|
+
# Manual override:
|
113
|
+
logger = get_logger('django_cfg.custom_module')
|
114
|
+
```
|
115
|
+
|
116
|
+
### Rich Console Output
|
117
|
+
|
118
|
+
When `debug=True`, you get beautifully formatted console output:
|
119
|
+
|
120
|
+
```
|
121
|
+
[10/02/25 17:52:00] INFO 🚀 Generated DRF settings
|
122
|
+
INFO ✅ Dramatiq enabled with 7 queues
|
123
|
+
```
|
124
|
+
|
125
|
+
When `debug=False`, console is silent except for warnings/errors.
|
126
|
+
|
127
|
+
## Logger Types
|
128
|
+
|
129
|
+
### 1. Django Logger (`django_logger.py`)
|
130
|
+
|
131
|
+
**NEW Simple Auto-Configuring Logger**
|
132
|
+
|
133
|
+
```python
|
134
|
+
from django_cfg.modules.django_logging.django_logger import get_logger
|
135
|
+
|
136
|
+
logger = get_logger(__name__)
|
137
|
+
logger.info("This message respects debug mode")
|
138
|
+
```
|
139
|
+
|
140
|
+
**Features:**
|
141
|
+
- Automatically respects `config.debug`
|
142
|
+
- Modular file output
|
143
|
+
- Single source of truth for all django-cfg logging
|
144
|
+
|
145
|
+
**When to Use:** For all new django-cfg code (PREFERRED)
|
146
|
+
|
147
|
+
### 2. Legacy Rich Logger (`logger.py`)
|
148
|
+
|
149
|
+
**OLD Rich-Formatted Logger**
|
150
|
+
|
151
|
+
```python
|
152
|
+
from django_cfg.modules.django_logging.logger import DjangoCfgLogger
|
153
|
+
|
154
|
+
logger = DjangoCfgLogger()
|
155
|
+
logger.info("Rich formatted message")
|
156
|
+
```
|
157
|
+
|
158
|
+
**Features:**
|
159
|
+
- Fancy Rich console formatting
|
160
|
+
- NOW respects `config.debug` (recently fixed)
|
161
|
+
- Used in older code
|
162
|
+
|
163
|
+
**When to Use:** Existing code that hasn't been migrated yet
|
164
|
+
|
165
|
+
## How Debug Control Works
|
166
|
+
|
167
|
+
### Architecture Flow
|
168
|
+
|
169
|
+
```
|
170
|
+
┌─────────────────────────────────────────────────────┐
|
171
|
+
│ 1. config.debug = False │
|
172
|
+
│ (Set in config.dev.yaml / config.prod.yaml) │
|
173
|
+
└────────────────────┬────────────────────────────────┘
|
174
|
+
│
|
175
|
+
▼
|
176
|
+
┌─────────────────────────────────────────────────────┐
|
177
|
+
│ 2. Logger Setup Detects Debug Mode │
|
178
|
+
│ - Checks config.debug first │
|
179
|
+
│ - Falls back to DEBUG env var │
|
180
|
+
└────────────────────┬────────────────────────────────┘
|
181
|
+
│
|
182
|
+
▼
|
183
|
+
┌─────────────────────────────────────────────────────┐
|
184
|
+
│ 3. Sets Log Level Based on Debug │
|
185
|
+
│ - debug=True → logging.DEBUG (all messages) │
|
186
|
+
│ - debug=False → logging.WARNING (warn+ only) │
|
187
|
+
└────────────────────┬────────────────────────────────┘
|
188
|
+
│
|
189
|
+
▼
|
190
|
+
┌─────────────────────────────────────────────────────┐
|
191
|
+
│ 4. Configures Handlers │
|
192
|
+
│ - Console Handler: level = log_level │
|
193
|
+
│ - File Handler: level = log_level │
|
194
|
+
│ - Both respect the same level │
|
195
|
+
└────────────────────┬────────────────────────────────┘
|
196
|
+
│
|
197
|
+
▼
|
198
|
+
┌─────────────────────────────────────────────────────┐
|
199
|
+
│ 5. Runtime Filtering │
|
200
|
+
│ - logger.info() → Filtered out if debug=False │
|
201
|
+
│ - logger.warning() → Always passes through │
|
202
|
+
└─────────────────────────────────────────────────────┘
|
203
|
+
```
|
204
|
+
|
205
|
+
## Code Examples
|
206
|
+
|
207
|
+
### Example 1: Simple Usage
|
208
|
+
|
209
|
+
```python
|
210
|
+
from django_cfg.modules.django_logging import get_logger
|
211
|
+
|
212
|
+
logger = get_logger(__name__)
|
213
|
+
|
214
|
+
def process_payment(amount: float):
|
215
|
+
logger.debug(f"Processing payment: ${amount}") # Only in debug
|
216
|
+
|
217
|
+
try:
|
218
|
+
result = payment_gateway.charge(amount)
|
219
|
+
logger.info(f"Payment processed: {result.id}") # Only in debug
|
220
|
+
return result
|
221
|
+
except PaymentError as e:
|
222
|
+
logger.error(f"Payment failed: {e}") # Always shown
|
223
|
+
raise
|
224
|
+
```
|
225
|
+
|
226
|
+
### Example 2: Module-Specific Logging
|
227
|
+
|
228
|
+
```python
|
229
|
+
# File: django_cfg/apps/payments/services/nowpayments.py
|
230
|
+
from django_cfg.modules.django_logging import get_logger
|
231
|
+
|
232
|
+
# Auto-detects as 'django_cfg.apps.payments'
|
233
|
+
logger = get_logger()
|
234
|
+
|
235
|
+
class NowPaymentsProvider:
|
236
|
+
def __init__(self, api_key: str):
|
237
|
+
logger.debug(f"Initializing NowPayments: {api_key[:10]}...")
|
238
|
+
# Logs to: logs/djangocfg/apps.log
|
239
|
+
```
|
240
|
+
|
241
|
+
### Example 3: Conditional Debug Code
|
242
|
+
|
243
|
+
```python
|
244
|
+
from django_cfg.core.state import get_current_config
|
245
|
+
|
246
|
+
config = get_current_config()
|
247
|
+
|
248
|
+
if config and config.debug:
|
249
|
+
# Expensive operation only in debug mode
|
250
|
+
from django_cfg.dashboard.debug import save_section_render
|
251
|
+
save_section_render('overview', html_content)
|
252
|
+
else:
|
253
|
+
# Skip debug rendering in production
|
254
|
+
pass
|
255
|
+
```
|
256
|
+
|
257
|
+
## Troubleshooting
|
258
|
+
|
259
|
+
### Issue: Still Seeing INFO Logs When debug=False
|
260
|
+
|
261
|
+
**Possible Causes:**
|
262
|
+
|
263
|
+
1. **Server not restarted** after changing config
|
264
|
+
```bash
|
265
|
+
# Solution: Restart server
|
266
|
+
python manage.py runserver
|
267
|
+
```
|
268
|
+
|
269
|
+
2. **Wrong config file loaded**
|
270
|
+
```bash
|
271
|
+
# Check which config is loaded
|
272
|
+
Loading config file: config.dev.ignore.yaml
|
273
|
+
[django-cfg] Modular logging configured successfully! Debug: False
|
274
|
+
```
|
275
|
+
|
276
|
+
3. **Using wrong logger**
|
277
|
+
```python
|
278
|
+
# ❌ BAD: Standard logging (doesn't respect config)
|
279
|
+
import logging
|
280
|
+
logger = logging.getLogger(__name__)
|
281
|
+
|
282
|
+
# ✅ GOOD: Django CFG logger (respects config)
|
283
|
+
from django_cfg.modules.django_logging import get_logger
|
284
|
+
logger = get_logger(__name__)
|
285
|
+
```
|
286
|
+
|
287
|
+
### Issue: Logs Not Going to Files
|
288
|
+
|
289
|
+
**Check:**
|
290
|
+
|
291
|
+
1. **Directory permissions**
|
292
|
+
```bash
|
293
|
+
ls -la logs/
|
294
|
+
# Should be writable
|
295
|
+
```
|
296
|
+
|
297
|
+
2. **Logger name prefix**
|
298
|
+
```python
|
299
|
+
# Only 'django_cfg.*' loggers get modular files
|
300
|
+
logger = get_logger('django_cfg.my_module') # ✅ Gets file
|
301
|
+
logger = get_logger('my_module') # ❌ Console only
|
302
|
+
```
|
303
|
+
|
304
|
+
### Issue: No Console Output at All
|
305
|
+
|
306
|
+
**Check debug status:**
|
307
|
+
|
308
|
+
```python
|
309
|
+
from django_cfg.core.state import get_current_config
|
310
|
+
|
311
|
+
config = get_current_config()
|
312
|
+
print(f"Debug: {config.debug}")
|
313
|
+
|
314
|
+
# Expected output:
|
315
|
+
# debug=True → You'll see INFO, DEBUG, WARNING, ERROR
|
316
|
+
# debug=False → You'll ONLY see WARNING, ERROR, CRITICAL
|
317
|
+
```
|
318
|
+
|
319
|
+
## Best Practices
|
320
|
+
|
321
|
+
### 1. Use Appropriate Log Levels
|
322
|
+
|
323
|
+
```python
|
324
|
+
# DEBUG: Detailed diagnostic info
|
325
|
+
logger.debug(f"SQL query: {query}")
|
326
|
+
logger.debug(f"Function called with args: {args}")
|
327
|
+
|
328
|
+
# INFO: Confirmation of expected behavior
|
329
|
+
logger.info(f"User {user.id} logged in successfully")
|
330
|
+
logger.info(f"Payment processor initialized")
|
331
|
+
|
332
|
+
# WARNING: Something unexpected but handled
|
333
|
+
logger.warning(f"API rate limit approaching: {count}/1000")
|
334
|
+
logger.warning(f"Deprecated function called: {func.__name__}")
|
335
|
+
|
336
|
+
# ERROR: Actual errors that need attention
|
337
|
+
logger.error(f"Payment failed: {error}")
|
338
|
+
logger.error(f"Database connection lost")
|
339
|
+
|
340
|
+
# CRITICAL: System-level failures
|
341
|
+
logger.critical(f"Redis connection failed - cache disabled")
|
342
|
+
logger.critical(f"Unable to load configuration")
|
343
|
+
```
|
344
|
+
|
345
|
+
### 2. Structured Logging for Production
|
346
|
+
|
347
|
+
```python
|
348
|
+
# Include context for easier troubleshooting
|
349
|
+
logger.error(
|
350
|
+
f"Payment processing failed",
|
351
|
+
extra={
|
352
|
+
'user_id': user.id,
|
353
|
+
'amount': amount,
|
354
|
+
'provider': 'nowpayments',
|
355
|
+
'error_code': error.code
|
356
|
+
}
|
357
|
+
)
|
358
|
+
```
|
359
|
+
|
360
|
+
### 3. Performance Considerations
|
361
|
+
|
362
|
+
```python
|
363
|
+
# ❌ BAD: Expensive operation always runs
|
364
|
+
debug_data = expensive_debug_operation()
|
365
|
+
logger.debug(f"Debug data: {debug_data}")
|
366
|
+
|
367
|
+
# ✅ GOOD: Only run when needed
|
368
|
+
if logger.isEnabledFor(logging.DEBUG):
|
369
|
+
debug_data = expensive_debug_operation()
|
370
|
+
logger.debug(f"Debug data: {debug_data}")
|
371
|
+
|
372
|
+
# ✅ BETTER: Check config directly
|
373
|
+
config = get_current_config()
|
374
|
+
if config and config.debug:
|
375
|
+
debug_data = expensive_debug_operation()
|
376
|
+
logger.debug(f"Debug data: {debug_data}")
|
377
|
+
```
|
378
|
+
|
379
|
+
### 4. Migration from Old Logging
|
380
|
+
|
381
|
+
**Before (using standard logging):**
|
382
|
+
```python
|
383
|
+
import logging
|
384
|
+
logger = logging.getLogger(__name__)
|
385
|
+
|
386
|
+
logger.info("This always shows") # Problem!
|
387
|
+
```
|
388
|
+
|
389
|
+
**After (using django-cfg logging):**
|
390
|
+
```python
|
391
|
+
from django_cfg.modules.django_logging import get_logger
|
392
|
+
|
393
|
+
logger = get_logger(__name__)
|
394
|
+
logger.info("This respects debug mode") # Better!
|
395
|
+
```
|
396
|
+
|
397
|
+
## Quick Reference
|
398
|
+
|
399
|
+
### Log Levels Cheat Sheet
|
400
|
+
|
401
|
+
| Level | Numeric | When to Use | Shows in Production? |
|
402
|
+
|-------|---------|-------------|---------------------|
|
403
|
+
| DEBUG | 10 | Diagnostic details | ❌ No |
|
404
|
+
| INFO | 20 | Confirmation messages | ❌ No |
|
405
|
+
| WARNING | 30 | Unexpected but handled | ✅ Yes |
|
406
|
+
| ERROR | 40 | Errors requiring attention | ✅ Yes |
|
407
|
+
| CRITICAL | 50 | System-level failures | ✅ Yes |
|
408
|
+
|
409
|
+
### Configuration Quick Check
|
410
|
+
|
411
|
+
```python
|
412
|
+
# In Python shell
|
413
|
+
from django_cfg.core.state import get_current_config
|
414
|
+
|
415
|
+
config = get_current_config()
|
416
|
+
print(f"Debug mode: {config.debug}")
|
417
|
+
print(f"Environment: {config.env_mode}")
|
418
|
+
|
419
|
+
# Expected for production:
|
420
|
+
# Debug mode: False
|
421
|
+
# Environment: production
|
422
|
+
```
|
423
|
+
|
424
|
+
### File Location Quick Reference
|
425
|
+
|
426
|
+
```bash
|
427
|
+
# View recent logs
|
428
|
+
tail -f logs/django.log # All logs
|
429
|
+
tail -f logs/djangocfg/apps.log # App-specific
|
430
|
+
tail -f logs/djangocfg/core.log # Core functionality
|
431
|
+
|
432
|
+
# Search for errors
|
433
|
+
grep ERROR logs/django.log
|
434
|
+
grep CRITICAL logs/djangocfg/*.log
|
435
|
+
```
|
436
|
+
|
437
|
+
## Advanced Topics
|
438
|
+
|
439
|
+
### Custom Log Formatting
|
440
|
+
|
441
|
+
```python
|
442
|
+
from django_cfg.modules.django_logging import get_logger
|
443
|
+
import logging
|
444
|
+
|
445
|
+
logger = get_logger(__name__)
|
446
|
+
|
447
|
+
# Add custom formatter
|
448
|
+
handler = logging.FileHandler('custom.log')
|
449
|
+
formatter = logging.Formatter(
|
450
|
+
'%(asctime)s [%(levelname)s] %(name)s: %(message)s'
|
451
|
+
)
|
452
|
+
handler.setFormatter(formatter)
|
453
|
+
logger.addHandler(handler)
|
454
|
+
```
|
455
|
+
|
456
|
+
### Logging in Async Code
|
457
|
+
|
458
|
+
```python
|
459
|
+
import asyncio
|
460
|
+
from django_cfg.modules.django_logging import get_logger
|
461
|
+
|
462
|
+
logger = get_logger(__name__)
|
463
|
+
|
464
|
+
async def async_task():
|
465
|
+
logger.debug("Starting async task")
|
466
|
+
await asyncio.sleep(1)
|
467
|
+
logger.info("Async task completed")
|
468
|
+
```
|
469
|
+
|
470
|
+
### Integration with External Services
|
471
|
+
|
472
|
+
```python
|
473
|
+
from django_cfg.modules.django_logging import get_logger
|
474
|
+
import sentry_sdk
|
475
|
+
|
476
|
+
logger = get_logger(__name__)
|
477
|
+
|
478
|
+
def process_with_sentry():
|
479
|
+
try:
|
480
|
+
result = risky_operation()
|
481
|
+
logger.info(f"Operation succeeded: {result}")
|
482
|
+
except Exception as e:
|
483
|
+
logger.error(f"Operation failed: {e}")
|
484
|
+
sentry_sdk.capture_exception(e)
|
485
|
+
raise
|
486
|
+
```
|
487
|
+
|
488
|
+
## Summary
|
489
|
+
|
490
|
+
The Django CFG logging system provides:
|
491
|
+
|
492
|
+
✅ **Automatic debug-aware logging** - Respects `config.debug`
|
493
|
+
✅ **Modular file organization** - Easy to find relevant logs
|
494
|
+
✅ **Rich console formatting** - Beautiful development experience
|
495
|
+
✅ **Production-ready** - Clean, parseable logs in production
|
496
|
+
✅ **Easy migration** - Simple `get_logger()` function
|
497
|
+
|
498
|
+
**Remember:** When `debug=False`, only WARNING, ERROR, and CRITICAL messages appear. This keeps production logs clean and focused on what matters.
|
499
|
+
|
500
|
+
---
|
501
|
+
|
502
|
+
**Last Updated:** 2025-10-03
|
503
|
+
**Django CFG Version:** 1.3.13
|
504
|
+
**Python Version:** 3.10+
|
@@ -8,8 +8,8 @@ import logging
|
|
8
8
|
from pathlib import Path
|
9
9
|
from typing import Dict, Optional
|
10
10
|
|
11
|
-
from
|
12
|
-
from
|
11
|
+
from ..base import BaseCfgModule
|
12
|
+
from ...utils.smart_defaults import get_log_filename
|
13
13
|
|
14
14
|
|
15
15
|
class DjangoLogger(BaseCfgModule):
|
@@ -46,7 +46,7 @@ class DjangoLogger(BaseCfgModule):
|
|
46
46
|
|
47
47
|
# Get debug mode
|
48
48
|
try:
|
49
|
-
from django_cfg.core.
|
49
|
+
from django_cfg.core.state import get_current_config
|
50
50
|
config = get_current_config()
|
51
51
|
debug = config.debug if config else False
|
52
52
|
except Exception:
|
@@ -57,20 +57,20 @@ class DjangoLogger(BaseCfgModule):
|
|
57
57
|
# Handler for general Django logs
|
58
58
|
django_log_path = logs_dir / 'django.log'
|
59
59
|
django_handler = logging.FileHandler(django_log_path, encoding='utf-8')
|
60
|
-
django_handler.setLevel(logging.DEBUG if debug else logging.
|
61
|
-
|
60
|
+
django_handler.setLevel(logging.DEBUG if debug else logging.WARNING)
|
61
|
+
|
62
62
|
# Console handler
|
63
63
|
console_handler = logging.StreamHandler()
|
64
|
-
console_handler.setLevel(logging.DEBUG if debug else logging.
|
65
|
-
|
64
|
+
console_handler.setLevel(logging.DEBUG if debug else logging.WARNING)
|
65
|
+
|
66
66
|
# Set format for handlers
|
67
67
|
formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(name)s [%(filename)s:%(lineno)d]: %(message)s')
|
68
68
|
django_handler.setFormatter(formatter)
|
69
69
|
console_handler.setFormatter(formatter)
|
70
|
-
|
70
|
+
|
71
71
|
# Configure root logger
|
72
72
|
root_logger = logging.getLogger()
|
73
|
-
root_logger.setLevel(logging.DEBUG if debug else logging.
|
73
|
+
root_logger.setLevel(logging.DEBUG if debug else logging.WARNING)
|
74
74
|
|
75
75
|
# Clear existing handlers
|
76
76
|
root_logger.handlers.clear()
|
@@ -86,7 +86,7 @@ class DjangoLogger(BaseCfgModule):
|
|
86
86
|
print(f"[django-cfg] ERROR setting up modular logging: {e}")
|
87
87
|
# Fallback to console only
|
88
88
|
logging.basicConfig(
|
89
|
-
level=logging.DEBUG if debug else logging.
|
89
|
+
level=logging.DEBUG if debug else logging.WARNING,
|
90
90
|
format='[%(asctime)s] %(levelname)s in %(name)s [%(filename)s:%(lineno)d]: %(message)s',
|
91
91
|
handlers=[logging.StreamHandler()],
|
92
92
|
force=True
|
@@ -123,13 +123,13 @@ class DjangoLogger(BaseCfgModule):
|
|
123
123
|
|
124
124
|
# Get debug mode
|
125
125
|
try:
|
126
|
-
from django_cfg.core.
|
126
|
+
from django_cfg.core.state import get_current_config
|
127
127
|
config = get_current_config()
|
128
128
|
debug = config.debug if config else False
|
129
129
|
except Exception:
|
130
130
|
debug = os.getenv('DEBUG', 'false').lower() in ('true', '1', 'yes')
|
131
|
-
|
132
|
-
file_handler.setLevel(logging.DEBUG if debug else logging.
|
131
|
+
|
132
|
+
file_handler.setLevel(logging.DEBUG if debug else logging.WARNING)
|
133
133
|
|
134
134
|
# Set format
|
135
135
|
formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(name)s [%(filename)s:%(lineno)d]: %(message)s')
|
@@ -23,7 +23,7 @@ class LoggerConfig:
|
|
23
23
|
"""Configuration for django_cfg logger."""
|
24
24
|
|
25
25
|
# Default settings
|
26
|
-
DEFAULT_LEVEL = logging.
|
26
|
+
DEFAULT_LEVEL = logging.WARNING # Only show warnings and above when debug=False
|
27
27
|
DEFAULT_FORMAT = (
|
28
28
|
"%(levelname)s %(asctime)s %(name)s %(process)d %(processName)s %(message)s"
|
29
29
|
)
|
@@ -84,7 +84,14 @@ class DjangoCfgLogger:
|
|
84
84
|
def _setup_logger(self, debug: bool = None, use_rich: bool = True) -> None:
|
85
85
|
"""Setup logger with appropriate configuration."""
|
86
86
|
if debug is None:
|
87
|
-
|
87
|
+
# Try to get debug from django_cfg config first
|
88
|
+
try:
|
89
|
+
from django_cfg.core.state import get_current_config
|
90
|
+
config = get_current_config()
|
91
|
+
debug = config.debug if config and hasattr(config, 'debug') else False
|
92
|
+
except Exception:
|
93
|
+
# Fallback to environment variable
|
94
|
+
debug = os.environ.get("DEBUG", "false").lower() == "true"
|
88
95
|
|
89
96
|
# Determine log level
|
90
97
|
log_level = logging.DEBUG if debug else LoggerConfig.DEFAULT_LEVEL
|
@@ -104,6 +111,7 @@ class DjangoCfgLogger:
|
|
104
111
|
show_path=False,
|
105
112
|
markup=True,
|
106
113
|
rich_tracebacks=True,
|
114
|
+
level=log_level, # Respect debug mode
|
107
115
|
)
|
108
116
|
except Exception:
|
109
117
|
# Fallback to standard handler if rich fails
|
@@ -111,6 +119,8 @@ class DjangoCfgLogger:
|
|
111
119
|
else:
|
112
120
|
handler = self._create_standard_handler()
|
113
121
|
|
122
|
+
# Set handler level
|
123
|
+
handler.setLevel(log_level)
|
114
124
|
self.logger.addHandler(handler)
|
115
125
|
|
116
126
|
def _create_standard_handler(self, use_colors: bool = True) -> logging.Handler:
|
@@ -175,7 +185,7 @@ class DjangoCfgLogger:
|
|
175
185
|
|
176
186
|
def init_complete(self, init_time_ms: float, environment: str) -> None:
|
177
187
|
"""Log when initialization is complete."""
|
178
|
-
self.info(f"🚀
|
188
|
+
self.info(f"🚀 Django-CFG initialized in {init_time_ms:.2f}ms")
|
179
189
|
self.info(f"🌍 Environment: {environment}")
|
180
190
|
|
181
191
|
def success(self, message: str) -> None:
|
@@ -240,7 +250,7 @@ class DjangoCfgLogger:
|
|
240
250
|
logger = DjangoCfgLogger()
|
241
251
|
|
242
252
|
|
243
|
-
# Convenience functions
|
253
|
+
# Convenience functions
|
244
254
|
def get_logger(name: Optional[str] = None) -> DjangoCfgLogger:
|
245
255
|
"""Get logger instance."""
|
246
256
|
return DjangoCfgLogger(name)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"""
|
2
|
+
Django Ngrok Module for django_cfg.
|
3
|
+
|
4
|
+
Auto-configuring Ngrok integration for local development.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .service import (
|
8
|
+
DjangoNgrok,
|
9
|
+
NgrokManager,
|
10
|
+
NgrokError,
|
11
|
+
get_ngrok_service,
|
12
|
+
start_tunnel,
|
13
|
+
stop_tunnel,
|
14
|
+
get_tunnel_url,
|
15
|
+
get_webhook_url,
|
16
|
+
get_api_url,
|
17
|
+
get_tunnel_url_from_env,
|
18
|
+
get_ngrok_host_from_env,
|
19
|
+
is_ngrok_available_from_env,
|
20
|
+
is_tunnel_active,
|
21
|
+
get_effective_tunnel_url,
|
22
|
+
)
|
23
|
+
|
24
|
+
__all__ = [
|
25
|
+
"DjangoNgrok",
|
26
|
+
"NgrokManager",
|
27
|
+
"NgrokError",
|
28
|
+
"get_ngrok_service",
|
29
|
+
"start_tunnel",
|
30
|
+
"stop_tunnel",
|
31
|
+
"get_tunnel_url",
|
32
|
+
"get_webhook_url",
|
33
|
+
"get_api_url",
|
34
|
+
"get_tunnel_url_from_env",
|
35
|
+
"get_ngrok_host_from_env",
|
36
|
+
"is_ngrok_available_from_env",
|
37
|
+
"is_tunnel_active",
|
38
|
+
"get_effective_tunnel_url",
|
39
|
+
]
|