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,237 @@
|
|
1
|
+
"""
|
2
|
+
API frameworks generator.
|
3
|
+
|
4
|
+
Handles JWT, DRF, Spectacular, and Django Revolution configuration.
|
5
|
+
Size: ~250 lines (focused on API frameworks)
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Dict, Any, TYPE_CHECKING
|
9
|
+
import logging
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from ...base.config_model import DjangoConfig
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class APIFrameworksGenerator:
|
18
|
+
"""
|
19
|
+
Generates API framework settings.
|
20
|
+
|
21
|
+
Responsibilities:
|
22
|
+
- JWT authentication configuration
|
23
|
+
- Django Revolution framework
|
24
|
+
- Django REST Framework (DRF)
|
25
|
+
- DRF Spectacular (OpenAPI/Swagger)
|
26
|
+
- Auto-configuration and extensions
|
27
|
+
|
28
|
+
Example:
|
29
|
+
```python
|
30
|
+
generator = APIFrameworksGenerator(config)
|
31
|
+
settings = generator.generate()
|
32
|
+
```
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(self, config: "DjangoConfig"):
|
36
|
+
"""
|
37
|
+
Initialize generator with configuration.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
config: DjangoConfig instance
|
41
|
+
"""
|
42
|
+
self.config = config
|
43
|
+
|
44
|
+
def generate(self) -> Dict[str, Any]:
|
45
|
+
"""
|
46
|
+
Generate API framework settings.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
Dictionary with API configurations
|
50
|
+
|
51
|
+
Example:
|
52
|
+
>>> generator = APIFrameworksGenerator(config)
|
53
|
+
>>> settings = generator.generate()
|
54
|
+
"""
|
55
|
+
settings = {}
|
56
|
+
|
57
|
+
# Generate settings for each API framework
|
58
|
+
settings.update(self._generate_jwt_settings())
|
59
|
+
settings.update(self._generate_revolution_settings())
|
60
|
+
settings.update(self._apply_drf_spectacular_extensions())
|
61
|
+
|
62
|
+
return settings
|
63
|
+
|
64
|
+
def _generate_jwt_settings(self) -> Dict[str, Any]:
|
65
|
+
"""
|
66
|
+
Generate JWT authentication settings.
|
67
|
+
|
68
|
+
Returns:
|
69
|
+
Dictionary with JWT configuration
|
70
|
+
"""
|
71
|
+
if not hasattr(self.config, "jwt") or not self.config.jwt:
|
72
|
+
return {}
|
73
|
+
|
74
|
+
jwt_settings = self.config.jwt.to_django_settings(self.config.secret_key)
|
75
|
+
return jwt_settings
|
76
|
+
|
77
|
+
def _generate_revolution_settings(self) -> Dict[str, Any]:
|
78
|
+
"""
|
79
|
+
Generate Django Revolution framework settings.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
Dictionary with Revolution and auto-generated DRF configuration
|
83
|
+
"""
|
84
|
+
if not hasattr(self.config, "revolution") or not self.config.revolution:
|
85
|
+
return {}
|
86
|
+
|
87
|
+
settings = {}
|
88
|
+
|
89
|
+
# Revolution configuration
|
90
|
+
revolution_settings = {
|
91
|
+
"DJANGO_REVOLUTION": {
|
92
|
+
"api_prefix": self.config.revolution.api_prefix,
|
93
|
+
"debug": getattr(self.config.revolution, "debug", self.config.debug),
|
94
|
+
"auto_install_deps": getattr(self.config.revolution, "auto_install_deps", True),
|
95
|
+
"zones": {
|
96
|
+
zone_name: zone_config.model_dump()
|
97
|
+
for zone_name, zone_config in self.config.revolution.get_zones_with_defaults().items()
|
98
|
+
},
|
99
|
+
}
|
100
|
+
}
|
101
|
+
settings.update(revolution_settings)
|
102
|
+
|
103
|
+
# Auto-generate DRF configuration using Revolution's core_config
|
104
|
+
drf_settings = self._generate_drf_from_revolution()
|
105
|
+
if drf_settings:
|
106
|
+
settings.update(drf_settings)
|
107
|
+
|
108
|
+
return settings
|
109
|
+
|
110
|
+
def _generate_drf_from_revolution(self) -> Dict[str, Any]:
|
111
|
+
"""
|
112
|
+
Generate DRF + Spectacular settings from Revolution config.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
Dictionary with DRF and Spectacular configuration
|
116
|
+
"""
|
117
|
+
try:
|
118
|
+
from django_revolution import create_drf_spectacular_config
|
119
|
+
|
120
|
+
# Extract DRF parameters from RevolutionConfig
|
121
|
+
drf_kwargs = {
|
122
|
+
"title": getattr(self.config.revolution, "drf_title", "API"),
|
123
|
+
"description": getattr(self.config.revolution, "drf_description", "RESTful API"),
|
124
|
+
"version": getattr(self.config.revolution, "drf_version", "1.0.0"),
|
125
|
+
"schema_path_prefix": f"/{self.config.revolution.api_prefix}/",
|
126
|
+
"enable_browsable_api": getattr(self.config.revolution, "drf_enable_browsable_api", False),
|
127
|
+
"enable_throttling": getattr(self.config.revolution, "drf_enable_throttling", False),
|
128
|
+
}
|
129
|
+
|
130
|
+
# Create DRF + Spectacular config with Revolution's comprehensive settings
|
131
|
+
drf_settings = create_drf_spectacular_config(**drf_kwargs)
|
132
|
+
|
133
|
+
logger.info("🚀 Generated DRF + Spectacular settings using Revolution's create_drf_spectacular_config")
|
134
|
+
|
135
|
+
return drf_settings
|
136
|
+
|
137
|
+
except ImportError as e:
|
138
|
+
logger.warning(f"Could not import django_revolution.create_drf_spectacular_config: {e}")
|
139
|
+
return {}
|
140
|
+
except Exception as e:
|
141
|
+
logger.warning(f"Could not generate DRF config from Revolution: {e}")
|
142
|
+
return {}
|
143
|
+
|
144
|
+
def _apply_drf_spectacular_extensions(self) -> Dict[str, Any]:
|
145
|
+
"""
|
146
|
+
Apply django-cfg DRF and Spectacular extensions.
|
147
|
+
|
148
|
+
This method extends existing DRF/Spectacular settings or creates them if they don't exist.
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
Dictionary with extended DRF and Spectacular configuration
|
152
|
+
"""
|
153
|
+
settings = {}
|
154
|
+
|
155
|
+
try:
|
156
|
+
# Apply Spectacular extensions
|
157
|
+
spectacular_settings = self._apply_spectacular_extensions()
|
158
|
+
if spectacular_settings:
|
159
|
+
settings.update(spectacular_settings)
|
160
|
+
|
161
|
+
# Apply DRF extensions
|
162
|
+
drf_settings = self._apply_drf_extensions()
|
163
|
+
if drf_settings:
|
164
|
+
settings.update(drf_settings)
|
165
|
+
|
166
|
+
except Exception as e:
|
167
|
+
logger.warning(f"Could not apply DRF/Spectacular extensions from django-cfg: {e}")
|
168
|
+
|
169
|
+
return settings
|
170
|
+
|
171
|
+
def _apply_spectacular_extensions(self) -> Dict[str, Any]:
|
172
|
+
"""
|
173
|
+
Apply Spectacular settings extensions.
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
Dictionary with Spectacular settings
|
177
|
+
"""
|
178
|
+
# Check if Spectacular settings exist (from Revolution or elsewhere)
|
179
|
+
if not hasattr(self, '_has_spectacular_settings'):
|
180
|
+
return {}
|
181
|
+
|
182
|
+
settings = {"SPECTACULAR_SETTINGS": {}}
|
183
|
+
|
184
|
+
if self.config.spectacular:
|
185
|
+
# User provided explicit spectacular config
|
186
|
+
spectacular_extensions = self.config.spectacular.get_spectacular_settings(
|
187
|
+
project_name=self.config.project_name
|
188
|
+
)
|
189
|
+
settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
|
190
|
+
logger.info("🔧 Extended SPECTACULAR_SETTINGS with django-cfg Spectacular config")
|
191
|
+
else:
|
192
|
+
# Auto-create minimal spectacular config to set project name
|
193
|
+
from django_cfg.models.api.drf import SpectacularConfig
|
194
|
+
|
195
|
+
auto_spectacular = SpectacularConfig()
|
196
|
+
spectacular_extensions = auto_spectacular.get_spectacular_settings(
|
197
|
+
project_name=self.config.project_name
|
198
|
+
)
|
199
|
+
settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
|
200
|
+
logger.info(f"🚀 Auto-configured API title as '{self.config.project_name} API'")
|
201
|
+
|
202
|
+
return settings
|
203
|
+
|
204
|
+
def _apply_drf_extensions(self) -> Dict[str, Any]:
|
205
|
+
"""
|
206
|
+
Apply DRF settings extensions.
|
207
|
+
|
208
|
+
Returns:
|
209
|
+
Dictionary with DRF settings
|
210
|
+
"""
|
211
|
+
settings = {}
|
212
|
+
|
213
|
+
if self.config.drf:
|
214
|
+
# User provided explicit DRF config
|
215
|
+
drf_extensions = self.config.drf.get_rest_framework_settings()
|
216
|
+
settings["REST_FRAMEWORK"] = drf_extensions
|
217
|
+
logger.info("🔧 Extended REST_FRAMEWORK settings with django-cfg DRF config")
|
218
|
+
else:
|
219
|
+
# Auto-create minimal DRF config to set default pagination
|
220
|
+
from django_cfg.models.api.drf import DRFConfig
|
221
|
+
|
222
|
+
auto_drf = DRFConfig()
|
223
|
+
drf_extensions = auto_drf.get_rest_framework_settings()
|
224
|
+
|
225
|
+
# Only apply pagination settings
|
226
|
+
pagination_settings = {
|
227
|
+
'DEFAULT_PAGINATION_CLASS': drf_extensions['DEFAULT_PAGINATION_CLASS'],
|
228
|
+
'PAGE_SIZE': drf_extensions['PAGE_SIZE'],
|
229
|
+
}
|
230
|
+
settings["REST_FRAMEWORK"] = pagination_settings
|
231
|
+
|
232
|
+
logger.info(f"🚀 Auto-configured default pagination: {drf_extensions['DEFAULT_PAGINATION_CLASS']}")
|
233
|
+
|
234
|
+
return settings
|
235
|
+
|
236
|
+
|
237
|
+
__all__ = ["APIFrameworksGenerator"]
|
@@ -0,0 +1,65 @@
|
|
1
|
+
"""
|
2
|
+
Session settings generator.
|
3
|
+
|
4
|
+
Handles Django session configuration.
|
5
|
+
Size: ~60 lines (focused on session settings)
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Dict, Any, TYPE_CHECKING
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from ...base.config_model import DjangoConfig
|
12
|
+
|
13
|
+
|
14
|
+
class SessionSettingsGenerator:
|
15
|
+
"""
|
16
|
+
Generates Django session settings.
|
17
|
+
|
18
|
+
Responsibilities:
|
19
|
+
- Configure session backend (database/cache)
|
20
|
+
- Set session cookie parameters
|
21
|
+
- Session timeout and security
|
22
|
+
|
23
|
+
Example:
|
24
|
+
```python
|
25
|
+
generator = SessionSettingsGenerator(config)
|
26
|
+
settings = generator.generate()
|
27
|
+
```
|
28
|
+
"""
|
29
|
+
|
30
|
+
def __init__(self, config: "DjangoConfig"):
|
31
|
+
"""
|
32
|
+
Initialize generator with configuration.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
config: DjangoConfig instance
|
36
|
+
"""
|
37
|
+
self.config = config
|
38
|
+
|
39
|
+
def generate(self) -> Dict[str, Any]:
|
40
|
+
"""
|
41
|
+
Generate session settings.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
Dictionary with session configuration
|
45
|
+
|
46
|
+
Example:
|
47
|
+
>>> generator = SessionSettingsGenerator(config)
|
48
|
+
>>> settings = generator.generate()
|
49
|
+
>>> "SESSION_ENGINE" in settings
|
50
|
+
True
|
51
|
+
"""
|
52
|
+
# Default session configuration - use database for persistence
|
53
|
+
settings = {
|
54
|
+
"SESSION_ENGINE": "django.contrib.sessions.backends.db",
|
55
|
+
"SESSION_COOKIE_AGE": 86400 * 7, # 7 days
|
56
|
+
"SESSION_SAVE_EVERY_REQUEST": True,
|
57
|
+
}
|
58
|
+
|
59
|
+
# Note: If cache_sessions is configured, CacheSettingsGenerator will override
|
60
|
+
# SESSION_ENGINE to use cache backend
|
61
|
+
|
62
|
+
return settings
|
63
|
+
|
64
|
+
|
65
|
+
__all__ = ["SessionSettingsGenerator"]
|
@@ -0,0 +1,54 @@
|
|
1
|
+
"""
|
2
|
+
Tailwind CSS settings generator for django-cfg.
|
3
|
+
|
4
|
+
Generates Django settings for django-tailwind integration.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Dict, Any, TYPE_CHECKING
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from django_cfg.core.base.config_model import DjangoConfig
|
11
|
+
|
12
|
+
|
13
|
+
class TailwindSettingsGenerator:
|
14
|
+
"""
|
15
|
+
Generates Django settings for Tailwind CSS integration.
|
16
|
+
|
17
|
+
Responsibilities:
|
18
|
+
- Add Tailwind-specific Django settings
|
19
|
+
- Configure TAILWIND_APP_NAME
|
20
|
+
|
21
|
+
Example:
|
22
|
+
```python
|
23
|
+
generator = TailwindSettingsGenerator(config)
|
24
|
+
settings = generator.generate()
|
25
|
+
```
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self, config: "DjangoConfig"):
|
29
|
+
"""
|
30
|
+
Initialize generator with configuration.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
config: DjangoConfig instance
|
34
|
+
"""
|
35
|
+
self.config = config
|
36
|
+
|
37
|
+
def generate(self) -> Dict[str, Any]:
|
38
|
+
"""
|
39
|
+
Generate Tailwind CSS settings.
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
Dictionary with Tailwind-specific settings
|
43
|
+
"""
|
44
|
+
settings = {}
|
45
|
+
|
46
|
+
# Tailwind is always enabled - add app name setting
|
47
|
+
settings["TAILWIND_APP_NAME"] = self.config.tailwind_app_name
|
48
|
+
|
49
|
+
return settings
|
50
|
+
|
51
|
+
|
52
|
+
__all__ = [
|
53
|
+
"TailwindSettingsGenerator",
|
54
|
+
]
|
@@ -0,0 +1,92 @@
|
|
1
|
+
"""
|
2
|
+
Background tasks generator.
|
3
|
+
|
4
|
+
Handles Dramatiq task queue configuration.
|
5
|
+
Size: ~100 lines (focused on task processing)
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Dict, Any, TYPE_CHECKING
|
9
|
+
import logging
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from ...base.config_model import DjangoConfig
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class TasksSettingsGenerator:
|
18
|
+
"""
|
19
|
+
Generates background task processing settings.
|
20
|
+
|
21
|
+
Responsibilities:
|
22
|
+
- Configure Dramatiq task queue
|
23
|
+
- Auto-detect if tasks should be enabled
|
24
|
+
- Set up task configuration
|
25
|
+
|
26
|
+
Example:
|
27
|
+
```python
|
28
|
+
generator = TasksSettingsGenerator(config)
|
29
|
+
settings = generator.generate()
|
30
|
+
```
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __init__(self, config: "DjangoConfig"):
|
34
|
+
"""
|
35
|
+
Initialize generator with configuration.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
config: DjangoConfig instance
|
39
|
+
"""
|
40
|
+
self.config = config
|
41
|
+
|
42
|
+
def generate(self) -> Dict[str, Any]:
|
43
|
+
"""
|
44
|
+
Generate task processing settings.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
Dictionary with Dramatiq configuration
|
48
|
+
|
49
|
+
Example:
|
50
|
+
>>> generator = TasksSettingsGenerator(config)
|
51
|
+
>>> settings = generator.generate()
|
52
|
+
"""
|
53
|
+
# Check if tasks should be enabled
|
54
|
+
if not self.config.should_enable_tasks():
|
55
|
+
logger.debug("⏭️ Dramatiq disabled (no tasks/knowbase/agents)")
|
56
|
+
return {}
|
57
|
+
|
58
|
+
try:
|
59
|
+
return self._generate_dramatiq_settings()
|
60
|
+
except ImportError as e:
|
61
|
+
logger.warning(f"Failed to import django_tasks module: {e}")
|
62
|
+
return {}
|
63
|
+
except Exception as e:
|
64
|
+
logger.error(f"Failed to generate Dramatiq settings: {e}")
|
65
|
+
return {}
|
66
|
+
|
67
|
+
def _generate_dramatiq_settings(self) -> Dict[str, Any]:
|
68
|
+
"""
|
69
|
+
Generate Dramatiq-specific settings.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
Dictionary with Dramatiq configuration
|
73
|
+
"""
|
74
|
+
from django_cfg.models.tasks import TaskConfig
|
75
|
+
from django_cfg.modules.django_tasks import generate_dramatiq_settings_from_config
|
76
|
+
|
77
|
+
# Auto-initialize TaskConfig if needed
|
78
|
+
task_config = TaskConfig.auto_initialize_if_needed()
|
79
|
+
if task_config is None:
|
80
|
+
return {}
|
81
|
+
|
82
|
+
# Generate Dramatiq settings
|
83
|
+
dramatiq_settings = generate_dramatiq_settings_from_config()
|
84
|
+
if not dramatiq_settings:
|
85
|
+
return {}
|
86
|
+
|
87
|
+
logger.info("✅ Dramatiq enabled (tasks/knowbase/agents required)")
|
88
|
+
|
89
|
+
return dramatiq_settings
|
90
|
+
|
91
|
+
|
92
|
+
__all__ = ["TasksSettingsGenerator"]
|
@@ -0,0 +1,144 @@
|
|
1
|
+
"""
|
2
|
+
Third-party integrations generator.
|
3
|
+
|
4
|
+
Handles external service integrations like Telegram, Unfold, Constance.
|
5
|
+
Size: ~150 lines (focused on third-party services)
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Dict, Any, List, TYPE_CHECKING
|
9
|
+
import logging
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from ...base.config_model import DjangoConfig
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
class ThirdPartyIntegrationsGenerator:
|
18
|
+
"""
|
19
|
+
Generates third-party integration settings.
|
20
|
+
|
21
|
+
Responsibilities:
|
22
|
+
- Telegram bot configuration
|
23
|
+
- Unfold admin theme
|
24
|
+
- Constance dynamic settings
|
25
|
+
- Track enabled integrations
|
26
|
+
|
27
|
+
Example:
|
28
|
+
```python
|
29
|
+
generator = ThirdPartyIntegrationsGenerator(config)
|
30
|
+
settings = generator.generate()
|
31
|
+
```
|
32
|
+
"""
|
33
|
+
|
34
|
+
def __init__(self, config: "DjangoConfig"):
|
35
|
+
"""
|
36
|
+
Initialize generator with configuration.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
config: DjangoConfig instance
|
40
|
+
"""
|
41
|
+
self.config = config
|
42
|
+
self.integrations: List[str] = []
|
43
|
+
|
44
|
+
def generate(self) -> Dict[str, Any]:
|
45
|
+
"""
|
46
|
+
Generate third-party integration settings.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
Dictionary with integration configurations
|
50
|
+
|
51
|
+
Example:
|
52
|
+
>>> generator = ThirdPartyIntegrationsGenerator(config)
|
53
|
+
>>> settings = generator.generate()
|
54
|
+
>>> "DJANGO_CFG_INTEGRATIONS" in settings
|
55
|
+
True
|
56
|
+
"""
|
57
|
+
settings = {}
|
58
|
+
|
59
|
+
# Generate settings for each integration
|
60
|
+
settings.update(self._generate_telegram_settings())
|
61
|
+
settings.update(self._generate_unfold_settings())
|
62
|
+
settings.update(self._generate_constance_settings())
|
63
|
+
settings.update(self._generate_rpc_settings())
|
64
|
+
|
65
|
+
# Track enabled integrations
|
66
|
+
if self.integrations:
|
67
|
+
settings["DJANGO_CFG_INTEGRATIONS"] = self.integrations
|
68
|
+
|
69
|
+
return settings
|
70
|
+
|
71
|
+
def _generate_telegram_settings(self) -> Dict[str, Any]:
|
72
|
+
"""
|
73
|
+
Generate Telegram bot settings.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
Dictionary with Telegram configuration
|
77
|
+
"""
|
78
|
+
if not self.config.telegram:
|
79
|
+
return {}
|
80
|
+
|
81
|
+
telegram_settings = self.config.telegram.to_config_dict()
|
82
|
+
self.integrations.append("telegram")
|
83
|
+
|
84
|
+
return {"TELEGRAM_CONFIG": telegram_settings}
|
85
|
+
|
86
|
+
def _generate_unfold_settings(self) -> Dict[str, Any]:
|
87
|
+
"""
|
88
|
+
Generate Unfold admin theme settings.
|
89
|
+
|
90
|
+
Returns:
|
91
|
+
Dictionary with Unfold configuration
|
92
|
+
"""
|
93
|
+
if not self.config.unfold:
|
94
|
+
return {}
|
95
|
+
|
96
|
+
unfold_settings = self.config.unfold.to_django_settings()
|
97
|
+
self.integrations.append("unfold")
|
98
|
+
|
99
|
+
return unfold_settings
|
100
|
+
|
101
|
+
def _generate_constance_settings(self) -> Dict[str, Any]:
|
102
|
+
"""
|
103
|
+
Generate Constance dynamic settings configuration.
|
104
|
+
|
105
|
+
Returns:
|
106
|
+
Dictionary with Constance configuration
|
107
|
+
"""
|
108
|
+
if not hasattr(self.config, "constance") or not self.config.constance:
|
109
|
+
return {}
|
110
|
+
|
111
|
+
# Set config reference for app fields detection
|
112
|
+
self.config.constance.set_config(self.config)
|
113
|
+
|
114
|
+
constance_settings = self.config.constance.to_django_settings()
|
115
|
+
self.integrations.append("constance")
|
116
|
+
|
117
|
+
return constance_settings
|
118
|
+
|
119
|
+
def _generate_rpc_settings(self) -> Dict[str, Any]:
|
120
|
+
"""
|
121
|
+
Generate RPC Client settings.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
Dictionary with RPC configuration
|
125
|
+
"""
|
126
|
+
if not hasattr(self.config, "django_cfg_rpc") or not self.config.django_cfg_rpc:
|
127
|
+
return {}
|
128
|
+
|
129
|
+
rpc_settings = self.config.django_cfg_rpc.to_django_settings()
|
130
|
+
self.integrations.append("django_cfg_rpc")
|
131
|
+
|
132
|
+
return rpc_settings
|
133
|
+
|
134
|
+
def get_enabled_integrations(self) -> List[str]:
|
135
|
+
"""
|
136
|
+
Get list of enabled integrations.
|
137
|
+
|
138
|
+
Returns:
|
139
|
+
List of integration names
|
140
|
+
"""
|
141
|
+
return self.integrations
|
142
|
+
|
143
|
+
|
144
|
+
__all__ = ["ThirdPartyIntegrationsGenerator"]
|