django-cfg 1.3.13__py3-none-any.whl → 1.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_currency/examples/__init__.py +3 -0
- django_cfg/modules/django_currency/examples/example_database_usage.py +144 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_ipc_client/README.md +346 -0
- django_cfg/modules/django_ipc_client/__init__.py +51 -0
- django_cfg/modules/django_ipc_client/client.py +540 -0
- django_cfg/modules/django_ipc_client/config.py +207 -0
- django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_ipc_client/exceptions.py +201 -0
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/examples/component_class_example.html +156 -0
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.3.dist-info/METADATA +533 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,251 @@
|
|
1
|
+
"""
|
2
|
+
Django views for RPC Dashboard.
|
3
|
+
|
4
|
+
Provides both template views and JSON API endpoints.
|
5
|
+
"""
|
6
|
+
|
7
|
+
import logging
|
8
|
+
from django.shortcuts import render
|
9
|
+
from django.http import JsonResponse
|
10
|
+
from django.contrib.admin.views.decorators import staff_member_required
|
11
|
+
from django.views.decorators.http import require_http_methods
|
12
|
+
|
13
|
+
from .monitor import RPCMonitor
|
14
|
+
|
15
|
+
logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
|
18
|
+
@staff_member_required
|
19
|
+
def dashboard_view(request):
|
20
|
+
"""
|
21
|
+
Main RPC dashboard view.
|
22
|
+
|
23
|
+
Renders dashboard template with initial data.
|
24
|
+
JavaScript will poll API endpoints for live updates.
|
25
|
+
"""
|
26
|
+
try:
|
27
|
+
monitor = RPCMonitor()
|
28
|
+
|
29
|
+
# Get initial data
|
30
|
+
overview_stats = monitor.get_overview_stats()
|
31
|
+
health = monitor.health_check()
|
32
|
+
|
33
|
+
# Build navigation items (can be extended later)
|
34
|
+
rpc_nav_items = []
|
35
|
+
|
36
|
+
context = {
|
37
|
+
'overview_stats': overview_stats,
|
38
|
+
'health': health,
|
39
|
+
'page_title': 'RPC Monitor Dashboard',
|
40
|
+
'rpc_nav_items': rpc_nav_items,
|
41
|
+
}
|
42
|
+
|
43
|
+
return render(request, 'django_ipc_dashboard/dashboard.html', context)
|
44
|
+
|
45
|
+
except Exception as e:
|
46
|
+
logger.error(f"Dashboard view error: {e}", exc_info=True)
|
47
|
+
|
48
|
+
# Build navigation items (can be extended later)
|
49
|
+
rpc_nav_items = []
|
50
|
+
|
51
|
+
# Fallback context
|
52
|
+
context = {
|
53
|
+
'overview_stats': {
|
54
|
+
'redis_connected': False,
|
55
|
+
'error': str(e),
|
56
|
+
},
|
57
|
+
'health': {
|
58
|
+
'redis_connected': False,
|
59
|
+
'error': str(e),
|
60
|
+
},
|
61
|
+
'page_title': 'RPC Monitor Dashboard - Error',
|
62
|
+
'rpc_nav_items': rpc_nav_items,
|
63
|
+
}
|
64
|
+
|
65
|
+
return render(request, 'django_ipc_dashboard/dashboard.html', context)
|
66
|
+
|
67
|
+
|
68
|
+
# === JSON API Endpoints ===
|
69
|
+
|
70
|
+
@staff_member_required
|
71
|
+
@require_http_methods(["GET"])
|
72
|
+
def api_overview_stats(request):
|
73
|
+
"""
|
74
|
+
API endpoint for overview statistics.
|
75
|
+
|
76
|
+
Returns JSON with current RPC metrics.
|
77
|
+
"""
|
78
|
+
try:
|
79
|
+
monitor = RPCMonitor()
|
80
|
+
stats = monitor.get_overview_stats()
|
81
|
+
|
82
|
+
return JsonResponse({
|
83
|
+
'success': True,
|
84
|
+
'data': stats,
|
85
|
+
})
|
86
|
+
|
87
|
+
except ValueError as e:
|
88
|
+
logger.warning(f"API overview stats validation error: {e}")
|
89
|
+
return JsonResponse({
|
90
|
+
'success': False,
|
91
|
+
'error': str(e),
|
92
|
+
}, status=400) # Bad Request
|
93
|
+
|
94
|
+
except ConnectionError as e:
|
95
|
+
logger.error(f"API overview stats connection error: {e}")
|
96
|
+
return JsonResponse({
|
97
|
+
'success': False,
|
98
|
+
'error': 'Redis connection unavailable',
|
99
|
+
}, status=503) # Service Unavailable
|
100
|
+
|
101
|
+
except Exception as e:
|
102
|
+
logger.error(f"API overview stats error: {e}", exc_info=True)
|
103
|
+
return JsonResponse({
|
104
|
+
'success': False,
|
105
|
+
'error': 'Internal server error',
|
106
|
+
}, status=500)
|
107
|
+
|
108
|
+
|
109
|
+
@staff_member_required
|
110
|
+
@require_http_methods(["GET"])
|
111
|
+
def api_recent_requests(request):
|
112
|
+
"""
|
113
|
+
API endpoint for recent RPC requests.
|
114
|
+
|
115
|
+
Query params:
|
116
|
+
- count: Number of requests to return (default: 50, max: 200)
|
117
|
+
"""
|
118
|
+
try:
|
119
|
+
count = int(request.GET.get('count', 50))
|
120
|
+
count = min(count, 200) # Max 200
|
121
|
+
|
122
|
+
monitor = RPCMonitor()
|
123
|
+
requests_list = monitor.get_recent_requests(count=count)
|
124
|
+
|
125
|
+
return JsonResponse({
|
126
|
+
'success': True,
|
127
|
+
'data': {
|
128
|
+
'requests': requests_list,
|
129
|
+
'count': len(requests_list),
|
130
|
+
},
|
131
|
+
})
|
132
|
+
|
133
|
+
except ValueError as e:
|
134
|
+
logger.warning(f"API recent requests validation error: {e}")
|
135
|
+
return JsonResponse({
|
136
|
+
'success': False,
|
137
|
+
'error': 'Invalid count parameter',
|
138
|
+
}, status=400)
|
139
|
+
|
140
|
+
except ConnectionError as e:
|
141
|
+
logger.error(f"API recent requests connection error: {e}")
|
142
|
+
return JsonResponse({
|
143
|
+
'success': False,
|
144
|
+
'error': 'Redis connection unavailable',
|
145
|
+
}, status=503)
|
146
|
+
|
147
|
+
except Exception as e:
|
148
|
+
logger.error(f"API recent requests error: {e}", exc_info=True)
|
149
|
+
return JsonResponse({
|
150
|
+
'success': False,
|
151
|
+
'error': 'Internal server error',
|
152
|
+
}, status=500)
|
153
|
+
|
154
|
+
|
155
|
+
@staff_member_required
|
156
|
+
@require_http_methods(["GET"])
|
157
|
+
def api_notification_stats(request):
|
158
|
+
"""
|
159
|
+
API endpoint for notification statistics.
|
160
|
+
|
161
|
+
Returns stats about sent notifications.
|
162
|
+
"""
|
163
|
+
try:
|
164
|
+
monitor = RPCMonitor()
|
165
|
+
stats = monitor.get_notification_stats()
|
166
|
+
|
167
|
+
return JsonResponse({
|
168
|
+
'success': True,
|
169
|
+
'data': stats,
|
170
|
+
})
|
171
|
+
|
172
|
+
except ConnectionError as e:
|
173
|
+
logger.error(f"API notification stats connection error: {e}")
|
174
|
+
return JsonResponse({
|
175
|
+
'success': False,
|
176
|
+
'error': 'Redis connection unavailable',
|
177
|
+
}, status=503)
|
178
|
+
|
179
|
+
except Exception as e:
|
180
|
+
logger.error(f"API notification stats error: {e}", exc_info=True)
|
181
|
+
return JsonResponse({
|
182
|
+
'success': False,
|
183
|
+
'error': 'Internal server error',
|
184
|
+
}, status=500)
|
185
|
+
|
186
|
+
|
187
|
+
@staff_member_required
|
188
|
+
@require_http_methods(["GET"])
|
189
|
+
def api_method_stats(request):
|
190
|
+
"""
|
191
|
+
API endpoint for method statistics.
|
192
|
+
|
193
|
+
Returns stats grouped by RPC method.
|
194
|
+
"""
|
195
|
+
try:
|
196
|
+
monitor = RPCMonitor()
|
197
|
+
stats = monitor.get_method_stats()
|
198
|
+
|
199
|
+
return JsonResponse({
|
200
|
+
'success': True,
|
201
|
+
'data': {
|
202
|
+
'methods': stats,
|
203
|
+
'count': len(stats),
|
204
|
+
},
|
205
|
+
})
|
206
|
+
|
207
|
+
except ConnectionError as e:
|
208
|
+
logger.error(f"API method stats connection error: {e}")
|
209
|
+
return JsonResponse({
|
210
|
+
'success': False,
|
211
|
+
'error': 'Redis connection unavailable',
|
212
|
+
}, status=503)
|
213
|
+
|
214
|
+
except Exception as e:
|
215
|
+
logger.error(f"API method stats error: {e}", exc_info=True)
|
216
|
+
return JsonResponse({
|
217
|
+
'success': False,
|
218
|
+
'error': 'Internal server error',
|
219
|
+
}, status=500)
|
220
|
+
|
221
|
+
|
222
|
+
@staff_member_required
|
223
|
+
@require_http_methods(["GET"])
|
224
|
+
def api_health_check(request):
|
225
|
+
"""
|
226
|
+
API endpoint for health check.
|
227
|
+
|
228
|
+
Returns current health status of RPC monitoring.
|
229
|
+
"""
|
230
|
+
try:
|
231
|
+
monitor = RPCMonitor()
|
232
|
+
health = monitor.health_check()
|
233
|
+
|
234
|
+
return JsonResponse({
|
235
|
+
'success': True,
|
236
|
+
'data': health,
|
237
|
+
})
|
238
|
+
|
239
|
+
except ConnectionError as e:
|
240
|
+
logger.error(f"API health check connection error: {e}")
|
241
|
+
return JsonResponse({
|
242
|
+
'success': False,
|
243
|
+
'error': 'Redis connection unavailable',
|
244
|
+
}, status=503)
|
245
|
+
|
246
|
+
except Exception as e:
|
247
|
+
logger.error(f"API health check error: {e}", exc_info=True)
|
248
|
+
return JsonResponse({
|
249
|
+
'success': False,
|
250
|
+
'error': 'Internal server error',
|
251
|
+
}, status=500)
|
@@ -0,0 +1,201 @@
|
|
1
|
+
"""
|
2
|
+
Custom Exceptions for Django-CFG RPC Client.
|
3
|
+
|
4
|
+
Provides specific exception types for better error handling and debugging.
|
5
|
+
Works independently or with django-cfg-rpc models.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Optional, Any
|
9
|
+
|
10
|
+
# Try to import RPCError from django-cfg-rpc if available
|
11
|
+
try:
|
12
|
+
from django_ipc.models.errors import RPCError
|
13
|
+
HAS_DJANGO_CFG_RPC = True
|
14
|
+
except ImportError:
|
15
|
+
# Fallback: simple RPCError for basic error handling
|
16
|
+
HAS_DJANGO_CFG_RPC = False
|
17
|
+
|
18
|
+
class RPCError: # type: ignore
|
19
|
+
"""Minimal RPCError fallback when django-cfg-rpc not installed."""
|
20
|
+
|
21
|
+
def __init__(self, code: str, message: str, retryable: bool = False, retry_after: Optional[int] = None):
|
22
|
+
self.code = code
|
23
|
+
self.message = message
|
24
|
+
self.retryable = retryable
|
25
|
+
self.retry_after = retry_after
|
26
|
+
|
27
|
+
|
28
|
+
class RPCBaseException(Exception):
|
29
|
+
"""
|
30
|
+
Base exception for all RPC-related errors.
|
31
|
+
|
32
|
+
All custom RPC exceptions inherit from this class.
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(self, message: str):
|
36
|
+
"""
|
37
|
+
Initialize base RPC exception.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
message: Error message
|
41
|
+
"""
|
42
|
+
self.message = message
|
43
|
+
super().__init__(message)
|
44
|
+
|
45
|
+
|
46
|
+
class RPCTimeoutError(RPCBaseException):
|
47
|
+
"""
|
48
|
+
RPC call timed out waiting for response.
|
49
|
+
|
50
|
+
Raised when BLPOP timeout is exceeded.
|
51
|
+
|
52
|
+
Example:
|
53
|
+
>>> try:
|
54
|
+
... result = rpc.call(method="slow", params=..., timeout=5)
|
55
|
+
... except RPCTimeoutError as e:
|
56
|
+
... print(f"RPC timeout: {e.message}")
|
57
|
+
... print(f"Timeout duration: {e.timeout_seconds}s")
|
58
|
+
"""
|
59
|
+
|
60
|
+
def __init__(self, message: str, method: str, timeout_seconds: int):
|
61
|
+
"""
|
62
|
+
Initialize timeout error.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
message: Error message
|
66
|
+
method: RPC method that timed out
|
67
|
+
timeout_seconds: Timeout duration that was exceeded
|
68
|
+
"""
|
69
|
+
super().__init__(message)
|
70
|
+
self.method = method
|
71
|
+
self.timeout_seconds = timeout_seconds
|
72
|
+
|
73
|
+
def __str__(self) -> str:
|
74
|
+
"""String representation."""
|
75
|
+
return f"RPC timeout on method '{self.method}' after {self.timeout_seconds}s: {self.message}"
|
76
|
+
|
77
|
+
|
78
|
+
class RPCRemoteError(RPCBaseException):
|
79
|
+
"""
|
80
|
+
Remote RPC execution failed.
|
81
|
+
|
82
|
+
Raised when server returns error response.
|
83
|
+
|
84
|
+
Example:
|
85
|
+
>>> try:
|
86
|
+
... result = rpc.call(method="...", params=...)
|
87
|
+
... except RPCRemoteError as e:
|
88
|
+
... print(f"Remote error: {e.error.code}")
|
89
|
+
... print(f"Message: {e.error.message}")
|
90
|
+
... if e.is_retryable:
|
91
|
+
... print(f"Can retry after {e.retry_after}s")
|
92
|
+
"""
|
93
|
+
|
94
|
+
def __init__(self, error: Any):
|
95
|
+
"""
|
96
|
+
Initialize remote error.
|
97
|
+
|
98
|
+
Args:
|
99
|
+
error: Structured RPC error from server (RPCError or dict)
|
100
|
+
"""
|
101
|
+
# Handle both RPCError objects and dicts
|
102
|
+
if isinstance(error, dict):
|
103
|
+
message = error.get("message", "Unknown error")
|
104
|
+
self.error = RPCError(
|
105
|
+
code=error.get("code", "internal_error"),
|
106
|
+
message=message,
|
107
|
+
retryable=error.get("retryable", False),
|
108
|
+
retry_after=error.get("retry_after"),
|
109
|
+
)
|
110
|
+
else:
|
111
|
+
message = error.message if hasattr(error, "message") else str(error)
|
112
|
+
self.error = error
|
113
|
+
|
114
|
+
super().__init__(message)
|
115
|
+
|
116
|
+
def __str__(self) -> str:
|
117
|
+
"""String representation."""
|
118
|
+
code = self.error.code if hasattr(self.error, "code") else "unknown"
|
119
|
+
return f"RPC remote error [{code}]: {self.message}"
|
120
|
+
|
121
|
+
@property
|
122
|
+
def is_retryable(self) -> bool:
|
123
|
+
"""Check if error is retryable."""
|
124
|
+
return getattr(self.error, "retryable", False)
|
125
|
+
|
126
|
+
@property
|
127
|
+
def retry_after(self) -> Optional[int]:
|
128
|
+
"""Get retry delay in seconds."""
|
129
|
+
return getattr(self.error, "retry_after", None)
|
130
|
+
|
131
|
+
|
132
|
+
class RPCConnectionError(RPCBaseException):
|
133
|
+
"""
|
134
|
+
Failed to connect to Redis.
|
135
|
+
|
136
|
+
Raised when Redis connection fails.
|
137
|
+
|
138
|
+
Example:
|
139
|
+
>>> try:
|
140
|
+
... rpc = DjangoCfgRPCClient(redis_url="redis://invalid:6379")
|
141
|
+
... except RPCConnectionError as e:
|
142
|
+
... print(f"Connection failed: {e.message}")
|
143
|
+
"""
|
144
|
+
|
145
|
+
def __init__(self, message: str, redis_url: Optional[str] = None):
|
146
|
+
"""
|
147
|
+
Initialize connection error.
|
148
|
+
|
149
|
+
Args:
|
150
|
+
message: Error message
|
151
|
+
redis_url: Redis URL that failed to connect
|
152
|
+
"""
|
153
|
+
super().__init__(message)
|
154
|
+
self.redis_url = redis_url
|
155
|
+
|
156
|
+
def __str__(self) -> str:
|
157
|
+
"""String representation."""
|
158
|
+
if self.redis_url:
|
159
|
+
return f"RPC connection error to {self.redis_url}: {self.message}"
|
160
|
+
return f"RPC connection error: {self.message}"
|
161
|
+
|
162
|
+
|
163
|
+
class RPCConfigurationError(RPCBaseException):
|
164
|
+
"""
|
165
|
+
RPC configuration error.
|
166
|
+
|
167
|
+
Raised when RPC client is misconfigured.
|
168
|
+
|
169
|
+
Example:
|
170
|
+
>>> try:
|
171
|
+
... rpc = get_rpc_client() # No config in settings
|
172
|
+
... except RPCConfigurationError as e:
|
173
|
+
... print(f"Configuration error: {e.message}")
|
174
|
+
"""
|
175
|
+
|
176
|
+
def __init__(self, message: str, config_key: Optional[str] = None):
|
177
|
+
"""
|
178
|
+
Initialize configuration error.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
message: Error message
|
182
|
+
config_key: Configuration key that is missing/invalid
|
183
|
+
"""
|
184
|
+
super().__init__(message)
|
185
|
+
self.config_key = config_key
|
186
|
+
|
187
|
+
def __str__(self) -> str:
|
188
|
+
"""String representation."""
|
189
|
+
if self.config_key:
|
190
|
+
return f"RPC configuration error (key: {self.config_key}): {self.message}"
|
191
|
+
return f"RPC configuration error: {self.message}"
|
192
|
+
|
193
|
+
|
194
|
+
__all__ = [
|
195
|
+
"RPCBaseException",
|
196
|
+
"RPCTimeoutError",
|
197
|
+
"RPCRemoteError",
|
198
|
+
"RPCConnectionError",
|
199
|
+
"RPCConfigurationError",
|
200
|
+
"HAS_DJANGO_CFG_RPC",
|
201
|
+
]
|