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,314 @@
|
|
1
|
+
"""
|
2
|
+
Main task configuration models.
|
3
|
+
|
4
|
+
Contains TaskConfig class (main entry point) and related enums.
|
5
|
+
Size: ~250 lines (focused on main configuration)
|
6
|
+
"""
|
7
|
+
|
8
|
+
from pydantic import BaseModel, Field, field_validator
|
9
|
+
from typing import Optional, List, Dict, Any
|
10
|
+
from enum import Enum
|
11
|
+
import os
|
12
|
+
import logging
|
13
|
+
|
14
|
+
from django_cfg.models.base import BaseCfgAutoModule
|
15
|
+
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
class TaskBackend(str, Enum):
|
20
|
+
"""Supported task backends."""
|
21
|
+
DRAMATIQ = "dramatiq"
|
22
|
+
# Future: CELERY = "celery"
|
23
|
+
|
24
|
+
|
25
|
+
class QueuePriority(str, Enum):
|
26
|
+
"""Standard queue priorities."""
|
27
|
+
CRITICAL = "critical"
|
28
|
+
HIGH = "high"
|
29
|
+
DEFAULT = "default"
|
30
|
+
LOW = "low"
|
31
|
+
BACKGROUND = "background"
|
32
|
+
|
33
|
+
|
34
|
+
class TaskConfig(BaseModel, BaseCfgAutoModule):
|
35
|
+
"""
|
36
|
+
High-level task system configuration.
|
37
|
+
|
38
|
+
Main entry point for configuring background task processing in Django-CFG.
|
39
|
+
Provides environment-aware defaults and automatic Redis integration.
|
40
|
+
|
41
|
+
Example:
|
42
|
+
```python
|
43
|
+
from django_cfg.models.tasks import TaskConfig
|
44
|
+
|
45
|
+
tasks = TaskConfig(
|
46
|
+
enabled=True,
|
47
|
+
backend=TaskBackend.DRAMATIQ,
|
48
|
+
)
|
49
|
+
```
|
50
|
+
"""
|
51
|
+
|
52
|
+
# === Core Settings ===
|
53
|
+
enabled: bool = Field(
|
54
|
+
default=True,
|
55
|
+
description="Enable background task processing"
|
56
|
+
)
|
57
|
+
backend: TaskBackend = Field(
|
58
|
+
default=TaskBackend.DRAMATIQ,
|
59
|
+
description="Task processing backend"
|
60
|
+
)
|
61
|
+
|
62
|
+
def __init__(self, **data):
|
63
|
+
"""Initialize TaskConfig with BaseCfgAutoModule support."""
|
64
|
+
super().__init__(**data)
|
65
|
+
# Initialize _config attribute for BaseCfgAutoModule
|
66
|
+
self._config = None
|
67
|
+
|
68
|
+
# === Backend-Specific Configuration ===
|
69
|
+
dramatiq: 'DramatiqConfig' = Field(
|
70
|
+
default_factory=lambda: None,
|
71
|
+
description="Dramatiq-specific configuration"
|
72
|
+
)
|
73
|
+
worker: 'WorkerConfig' = Field(
|
74
|
+
default_factory=lambda: None,
|
75
|
+
description="Worker configuration"
|
76
|
+
)
|
77
|
+
|
78
|
+
def model_post_init(self, __context: Any) -> None:
|
79
|
+
"""Initialize backend configs with defaults after model creation."""
|
80
|
+
if self.dramatiq is None:
|
81
|
+
from .backends import DramatiqConfig
|
82
|
+
self.dramatiq = DramatiqConfig()
|
83
|
+
if self.worker is None:
|
84
|
+
from .backends import WorkerConfig
|
85
|
+
self.worker = WorkerConfig()
|
86
|
+
|
87
|
+
# === Environment-Specific Overrides ===
|
88
|
+
dev_processes: Optional[int] = Field(
|
89
|
+
default=2,
|
90
|
+
description="Number of processes in development environment"
|
91
|
+
)
|
92
|
+
prod_processes: Optional[int] = Field(
|
93
|
+
default=None,
|
94
|
+
description="Number of processes in production environment"
|
95
|
+
)
|
96
|
+
|
97
|
+
# === Auto-Configuration ===
|
98
|
+
auto_discover_tasks: bool = Field(
|
99
|
+
default=True,
|
100
|
+
description="Automatically discover tasks in Django apps"
|
101
|
+
)
|
102
|
+
task_modules: List[str] = Field(
|
103
|
+
default=["tasks"],
|
104
|
+
description="Module names to search for tasks"
|
105
|
+
)
|
106
|
+
|
107
|
+
@field_validator("enabled")
|
108
|
+
@classmethod
|
109
|
+
def validate_enabled_with_environment(cls, v: bool) -> bool:
|
110
|
+
"""Validate task system can be enabled in current environment."""
|
111
|
+
if v:
|
112
|
+
# Check if we're in a test environment
|
113
|
+
if os.getenv("DJANGO_SETTINGS_MODULE", "").endswith("test"):
|
114
|
+
logger.info("Task system disabled in test environment")
|
115
|
+
return False
|
116
|
+
|
117
|
+
# Additional environment checks can be added here
|
118
|
+
# For example, checking if Redis is available
|
119
|
+
|
120
|
+
return v
|
121
|
+
|
122
|
+
def get_effective_processes(self, debug: bool = False) -> int:
|
123
|
+
"""
|
124
|
+
Get effective number of processes based on environment.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
debug: Whether in debug mode
|
128
|
+
|
129
|
+
Returns:
|
130
|
+
Number of worker processes to use
|
131
|
+
|
132
|
+
Example:
|
133
|
+
>>> config = TaskConfig()
|
134
|
+
>>> config.get_effective_processes(debug=True)
|
135
|
+
2
|
136
|
+
"""
|
137
|
+
if debug and self.dev_processes is not None:
|
138
|
+
return self.dev_processes
|
139
|
+
elif not debug and self.prod_processes is not None:
|
140
|
+
return self.prod_processes
|
141
|
+
else:
|
142
|
+
return self.dramatiq.processes
|
143
|
+
|
144
|
+
def get_effective_queues(self) -> List[str]:
|
145
|
+
"""
|
146
|
+
Get effective queue configuration.
|
147
|
+
|
148
|
+
Returns:
|
149
|
+
List of queue names
|
150
|
+
|
151
|
+
Example:
|
152
|
+
>>> config = TaskConfig()
|
153
|
+
>>> config.get_effective_queues()
|
154
|
+
['default', 'high', 'low']
|
155
|
+
"""
|
156
|
+
return self.dramatiq.queues
|
157
|
+
|
158
|
+
def get_redis_config(self, redis_url: str) -> Dict[str, Any]:
|
159
|
+
"""
|
160
|
+
Generate Redis configuration for Dramatiq.
|
161
|
+
|
162
|
+
Args:
|
163
|
+
redis_url: Redis connection URL
|
164
|
+
|
165
|
+
Returns:
|
166
|
+
Dictionary with Redis connection parameters
|
167
|
+
|
168
|
+
Example:
|
169
|
+
>>> config = TaskConfig()
|
170
|
+
>>> config.get_redis_config("redis://localhost:6379/1")
|
171
|
+
{'host': 'localhost', 'port': 6379, 'db': 1, 'password': None}
|
172
|
+
"""
|
173
|
+
from urllib.parse import urlparse
|
174
|
+
|
175
|
+
# Parse Redis URL
|
176
|
+
parsed = urlparse(redis_url)
|
177
|
+
|
178
|
+
# Build Redis config
|
179
|
+
config = {
|
180
|
+
"host": parsed.hostname or "localhost",
|
181
|
+
"port": parsed.port or 6379,
|
182
|
+
"db": self.dramatiq.redis_db,
|
183
|
+
"password": parsed.password,
|
184
|
+
}
|
185
|
+
|
186
|
+
# Add SSL if specified
|
187
|
+
if parsed.scheme == "rediss":
|
188
|
+
config["ssl"] = True
|
189
|
+
|
190
|
+
return config
|
191
|
+
|
192
|
+
def get_dramatiq_settings(self, redis_url: str) -> Dict[str, Any]:
|
193
|
+
"""
|
194
|
+
Generate complete Dramatiq settings for Django.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
redis_url: Redis connection URL
|
198
|
+
|
199
|
+
Returns:
|
200
|
+
Dictionary with complete Dramatiq configuration
|
201
|
+
|
202
|
+
Example:
|
203
|
+
>>> config = TaskConfig()
|
204
|
+
>>> settings = config.get_dramatiq_settings("redis://localhost:6379/1")
|
205
|
+
>>> "DRAMATIQ_BROKER" in settings
|
206
|
+
True
|
207
|
+
"""
|
208
|
+
from urllib.parse import urlparse
|
209
|
+
|
210
|
+
redis_config = self.get_redis_config(redis_url)
|
211
|
+
parsed = urlparse(redis_url)
|
212
|
+
|
213
|
+
# Build Redis URL with correct database
|
214
|
+
redis_url_with_db = redis_url
|
215
|
+
if parsed.path and parsed.path != "/":
|
216
|
+
# Replace existing database in URL
|
217
|
+
redis_url_with_db = redis_url.replace(parsed.path, f"/{self.dramatiq.redis_db}")
|
218
|
+
else:
|
219
|
+
# Add database to URL
|
220
|
+
redis_url_with_db = f"{redis_url.rstrip('/')}/{self.dramatiq.redis_db}"
|
221
|
+
|
222
|
+
return {
|
223
|
+
"DRAMATIQ_BROKER": {
|
224
|
+
"BROKER": "dramatiq.brokers.redis.RedisBroker",
|
225
|
+
"OPTIONS": {
|
226
|
+
"url": redis_url_with_db,
|
227
|
+
**redis_config
|
228
|
+
},
|
229
|
+
},
|
230
|
+
"DRAMATIQ_RESULT_BACKEND": {
|
231
|
+
"BACKEND": "dramatiq.results.backends.redis.RedisBackend",
|
232
|
+
"BACKEND_OPTIONS": {
|
233
|
+
"url": redis_url_with_db,
|
234
|
+
**redis_config
|
235
|
+
},
|
236
|
+
},
|
237
|
+
"DRAMATIQ_MIDDLEWARE": self.dramatiq.middleware,
|
238
|
+
"DRAMATIQ_QUEUES": self.dramatiq.queues,
|
239
|
+
}
|
240
|
+
|
241
|
+
def get_smart_defaults(self):
|
242
|
+
"""
|
243
|
+
Get smart default configuration for this module.
|
244
|
+
|
245
|
+
Returns:
|
246
|
+
TaskConfig with smart defaults based on environment
|
247
|
+
"""
|
248
|
+
from .utils import get_default_task_config
|
249
|
+
|
250
|
+
config = self.get_config()
|
251
|
+
debug = getattr(config, 'debug', False) if config else False
|
252
|
+
return get_default_task_config(debug=debug)
|
253
|
+
|
254
|
+
def get_module_config(self):
|
255
|
+
"""
|
256
|
+
Get the final configuration for this module.
|
257
|
+
|
258
|
+
Returns:
|
259
|
+
Self (TaskConfig instance)
|
260
|
+
"""
|
261
|
+
return self
|
262
|
+
|
263
|
+
@classmethod
|
264
|
+
def auto_initialize_if_needed(cls) -> Optional['TaskConfig']:
|
265
|
+
"""
|
266
|
+
Auto-initialize TaskConfig if needed based on config flags.
|
267
|
+
|
268
|
+
Returns:
|
269
|
+
TaskConfig instance if should be initialized, None otherwise
|
270
|
+
|
271
|
+
Example:
|
272
|
+
>>> task_config = TaskConfig.auto_initialize_if_needed()
|
273
|
+
>>> if task_config:
|
274
|
+
... print("Tasks enabled")
|
275
|
+
"""
|
276
|
+
# Get config through BaseCfgModule
|
277
|
+
from django_cfg.modules import BaseCfgModule
|
278
|
+
base_module = BaseCfgModule()
|
279
|
+
config = base_module.get_config()
|
280
|
+
|
281
|
+
if not config:
|
282
|
+
return None
|
283
|
+
|
284
|
+
# Check if TaskConfig already exists
|
285
|
+
if hasattr(config, 'tasks') and config.tasks is not None:
|
286
|
+
# Set config reference and return existing
|
287
|
+
config.tasks.set_config(config)
|
288
|
+
return config.tasks
|
289
|
+
|
290
|
+
# Check if tasks should be enabled
|
291
|
+
if config.should_enable_tasks():
|
292
|
+
# Auto-initialize with smart defaults
|
293
|
+
task_config = cls().get_smart_defaults()
|
294
|
+
task_config.set_config(config)
|
295
|
+
config.tasks = task_config
|
296
|
+
|
297
|
+
logger.info("🚀 Auto-initialized TaskConfig (enabled by knowbase/agents/tasks flags)")
|
298
|
+
|
299
|
+
return task_config
|
300
|
+
|
301
|
+
return None
|
302
|
+
|
303
|
+
|
304
|
+
# Resolve forward references for Pydantic v2
|
305
|
+
from .backends import DramatiqConfig, WorkerConfig
|
306
|
+
TaskConfig.model_rebuild()
|
307
|
+
|
308
|
+
__all__ = [
|
309
|
+
"TaskConfig",
|
310
|
+
"TaskBackend",
|
311
|
+
"QueuePriority",
|
312
|
+
"DramatiqConfig",
|
313
|
+
"WorkerConfig",
|
314
|
+
]
|
@@ -0,0 +1,174 @@
|
|
1
|
+
"""
|
2
|
+
Task configuration utilities.
|
3
|
+
|
4
|
+
Contains utility functions for task configuration:
|
5
|
+
- Smart queue detection
|
6
|
+
- Environment-aware defaults
|
7
|
+
- Configuration validation
|
8
|
+
|
9
|
+
Size: ~120 lines (focused on utilities)
|
10
|
+
"""
|
11
|
+
|
12
|
+
from typing import List, Optional, TYPE_CHECKING
|
13
|
+
import logging
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from .config import TaskConfig
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
def get_smart_queues(debug: bool = False) -> List[str]:
|
22
|
+
"""
|
23
|
+
Get smart default queues based on enabled modules.
|
24
|
+
|
25
|
+
Automatically detects which django-cfg modules are enabled and adds
|
26
|
+
their corresponding queues to the default queue list.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
debug: Whether running in debug mode (affects base queues)
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
List of queue names appropriate for enabled modules
|
33
|
+
|
34
|
+
Example:
|
35
|
+
>>> queues = get_smart_queues(debug=True)
|
36
|
+
>>> "default" in queues
|
37
|
+
True
|
38
|
+
"""
|
39
|
+
# Base queues
|
40
|
+
if debug:
|
41
|
+
base_queues = ["default"]
|
42
|
+
else:
|
43
|
+
base_queues = ["critical", "high", "default", "low", "background"]
|
44
|
+
|
45
|
+
# Try to detect enabled modules and add their queues
|
46
|
+
try:
|
47
|
+
from django_cfg.modules.base import BaseCfgModule
|
48
|
+
base_module = BaseCfgModule()
|
49
|
+
|
50
|
+
# Check for knowbase module (requires "knowbase" queue)
|
51
|
+
if base_module.is_knowbase_enabled():
|
52
|
+
if "knowbase" not in base_queues:
|
53
|
+
base_queues.append("knowbase")
|
54
|
+
|
55
|
+
# Check for payments module (requires "payments" queue)
|
56
|
+
if base_module.is_payments_enabled():
|
57
|
+
if "payments" not in base_queues:
|
58
|
+
base_queues.append("payments")
|
59
|
+
|
60
|
+
# Check for agents module (may require "agents" queue in future)
|
61
|
+
if base_module.is_agents_enabled():
|
62
|
+
if "agents" not in base_queues:
|
63
|
+
base_queues.append("agents")
|
64
|
+
|
65
|
+
logger.info(f"🎯 Smart queue detection: {base_queues}")
|
66
|
+
|
67
|
+
except Exception as e:
|
68
|
+
logger.warning(f"Failed to auto-detect queues, using defaults: {e}")
|
69
|
+
|
70
|
+
return base_queues
|
71
|
+
|
72
|
+
|
73
|
+
def get_default_task_config(debug: bool = False) -> 'TaskConfig':
|
74
|
+
"""
|
75
|
+
Get default task configuration based on environment.
|
76
|
+
|
77
|
+
Creates a TaskConfig with sensible defaults for development or production.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
debug: Whether in debug/development mode
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
TaskConfig with environment-appropriate defaults
|
84
|
+
|
85
|
+
Example:
|
86
|
+
>>> config = get_default_task_config(debug=True)
|
87
|
+
>>> config.dramatiq.processes
|
88
|
+
2
|
89
|
+
"""
|
90
|
+
from .config import TaskConfig
|
91
|
+
from .backends import DramatiqConfig, WorkerConfig
|
92
|
+
|
93
|
+
smart_queues = get_smart_queues(debug)
|
94
|
+
|
95
|
+
if debug:
|
96
|
+
# Development defaults
|
97
|
+
return TaskConfig(
|
98
|
+
dramatiq=DramatiqConfig(
|
99
|
+
processes=2,
|
100
|
+
threads=4,
|
101
|
+
prometheus_enabled=False,
|
102
|
+
queues=smart_queues,
|
103
|
+
),
|
104
|
+
worker=WorkerConfig(
|
105
|
+
log_level="DEBUG",
|
106
|
+
health_check_enabled=False,
|
107
|
+
)
|
108
|
+
)
|
109
|
+
else:
|
110
|
+
# Production defaults
|
111
|
+
return TaskConfig(
|
112
|
+
dramatiq=DramatiqConfig(
|
113
|
+
processes=8,
|
114
|
+
threads=16,
|
115
|
+
prometheus_enabled=True,
|
116
|
+
queues=smart_queues,
|
117
|
+
),
|
118
|
+
worker=WorkerConfig(
|
119
|
+
log_level="INFO",
|
120
|
+
health_check_enabled=True,
|
121
|
+
restart_on_memory_limit=True,
|
122
|
+
)
|
123
|
+
)
|
124
|
+
|
125
|
+
|
126
|
+
def validate_task_config(config: 'TaskConfig', redis_url: Optional[str] = None) -> bool:
|
127
|
+
"""
|
128
|
+
Validate task configuration and dependencies.
|
129
|
+
|
130
|
+
Checks if the task configuration is valid and all required dependencies are available.
|
131
|
+
|
132
|
+
Args:
|
133
|
+
config: TaskConfig to validate
|
134
|
+
redis_url: Optional Redis URL to validate
|
135
|
+
|
136
|
+
Returns:
|
137
|
+
True if configuration is valid, False otherwise
|
138
|
+
|
139
|
+
Example:
|
140
|
+
>>> config = get_default_task_config()
|
141
|
+
>>> validate_task_config(config, "redis://localhost:6379/1")
|
142
|
+
True
|
143
|
+
"""
|
144
|
+
if not config.enabled:
|
145
|
+
return True
|
146
|
+
|
147
|
+
# Check Redis URL if provided
|
148
|
+
if redis_url:
|
149
|
+
try:
|
150
|
+
from urllib.parse import urlparse
|
151
|
+
parsed = urlparse(redis_url)
|
152
|
+
if not parsed.scheme.startswith("redis"):
|
153
|
+
logger.error(f"Invalid Redis URL scheme: {parsed.scheme}")
|
154
|
+
return False
|
155
|
+
except Exception as e:
|
156
|
+
logger.error(f"Invalid Redis URL: {e}")
|
157
|
+
return False
|
158
|
+
|
159
|
+
# Check if Dramatiq is available
|
160
|
+
try:
|
161
|
+
import dramatiq
|
162
|
+
import django_dramatiq
|
163
|
+
except ImportError as e:
|
164
|
+
logger.error(f"Dramatiq dependencies not available: {e}")
|
165
|
+
return False
|
166
|
+
|
167
|
+
return True
|
168
|
+
|
169
|
+
|
170
|
+
__all__ = [
|
171
|
+
"get_smart_queues",
|
172
|
+
"get_default_task_config",
|
173
|
+
"validate_task_config",
|
174
|
+
]
|
django_cfg/modules/base.py
CHANGED
@@ -178,16 +178,31 @@ class BaseCfgModule(ABC):
|
|
178
178
|
def is_payments_enabled(self) -> bool:
|
179
179
|
"""
|
180
180
|
Check if django-cfg Payments is enabled.
|
181
|
-
|
181
|
+
|
182
182
|
Returns:
|
183
183
|
True if Payments is enabled, False otherwise
|
184
184
|
"""
|
185
185
|
payments_config = self._get_config_key('payments', None)
|
186
|
-
|
186
|
+
|
187
187
|
# Only handle PaymentsConfig model
|
188
188
|
if payments_config and hasattr(payments_config, 'enabled'):
|
189
189
|
return payments_config.enabled
|
190
|
-
|
190
|
+
|
191
|
+
return False
|
192
|
+
|
193
|
+
def is_rpc_enabled(self) -> bool:
|
194
|
+
"""
|
195
|
+
Check if django-cfg RPC Client is enabled.
|
196
|
+
|
197
|
+
Returns:
|
198
|
+
True if RPC Client is enabled, False otherwise
|
199
|
+
"""
|
200
|
+
rpc_config = self._get_config_key('django_cfg_rpc', None)
|
201
|
+
|
202
|
+
# Only handle DjangoCfgRPCConfig model
|
203
|
+
if rpc_config and hasattr(rpc_config, 'enabled'):
|
204
|
+
return rpc_config.enabled
|
205
|
+
|
191
206
|
return False
|
192
207
|
|
193
208
|
|
@@ -9,7 +9,7 @@ from functools import wraps
|
|
9
9
|
from unfold.decorators import action as unfold_action
|
10
10
|
from unfold.enums import ActionVariant as UnfoldActionVariant
|
11
11
|
|
12
|
-
from django_cfg.modules.
|
12
|
+
from django_cfg.modules.django_logging import get_logger
|
13
13
|
from ..models.action_models import ActionVariant
|
14
14
|
|
15
15
|
|
@@ -8,7 +8,7 @@ from typing import Optional, Callable, Any, Union
|
|
8
8
|
from functools import wraps
|
9
9
|
from django.utils.safestring import SafeString, mark_safe
|
10
10
|
from unfold.decorators import display as unfold_display
|
11
|
-
from django_cfg.modules.
|
11
|
+
from django_cfg.modules.django_logging import get_logger
|
12
12
|
|
13
13
|
logger = get_logger('django_admin.decorators.display')
|
14
14
|
|
@@ -14,7 +14,7 @@ import threading
|
|
14
14
|
|
15
15
|
from unfold.decorators import action as unfold_action
|
16
16
|
from unfold.enums import ActionVariant as UnfoldActionVariant
|
17
|
-
from django_cfg.modules.
|
17
|
+
from django_cfg.modules.django_logging import get_logger
|
18
18
|
from ..models.action_models import ActionVariant
|
19
19
|
|
20
20
|
|