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
django_cfg/core/generation.py
DELETED
@@ -1,621 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Django settings generation for django_cfg.
|
3
|
-
|
4
|
-
Following CRITICAL_REQUIREMENTS.md:
|
5
|
-
- No raw Dict/Any usage
|
6
|
-
- Proper type annotations
|
7
|
-
- Comprehensive error handling
|
8
|
-
- Performance-aware generation
|
9
|
-
"""
|
10
|
-
|
11
|
-
from typing import Dict, List, Any, TYPE_CHECKING
|
12
|
-
from pathlib import Path
|
13
|
-
import logging
|
14
|
-
|
15
|
-
from django_cfg.core.exceptions import ConfigurationError
|
16
|
-
from django_cfg.utils.smart_defaults import SmartDefaults
|
17
|
-
|
18
|
-
if TYPE_CHECKING:
|
19
|
-
from django_cfg.core.config import DjangoConfig
|
20
|
-
|
21
|
-
logger = logging.getLogger(__name__)
|
22
|
-
|
23
|
-
|
24
|
-
class SettingsGenerator:
|
25
|
-
"""
|
26
|
-
Generates complete Django settings from DjangoConfig instances.
|
27
|
-
|
28
|
-
Converts type-safe Pydantic configuration models into Django-compatible
|
29
|
-
settings dictionaries with intelligent defaults and validation.
|
30
|
-
"""
|
31
|
-
|
32
|
-
@classmethod
|
33
|
-
def generate(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
34
|
-
"""
|
35
|
-
Generate complete Django settings dictionary.
|
36
|
-
|
37
|
-
Args:
|
38
|
-
config: DjangoConfig instance
|
39
|
-
|
40
|
-
Returns:
|
41
|
-
Complete Django settings dictionary
|
42
|
-
|
43
|
-
Raises:
|
44
|
-
ConfigurationError: If settings generation fails
|
45
|
-
"""
|
46
|
-
try:
|
47
|
-
settings = {}
|
48
|
-
|
49
|
-
# Generate core Django settings
|
50
|
-
settings.update(cls._generate_core_settings(config))
|
51
|
-
|
52
|
-
# Generate database settings
|
53
|
-
settings.update(cls._generate_database_settings(config))
|
54
|
-
|
55
|
-
# Generate cache settings
|
56
|
-
settings.update(cls._generate_cache_settings(config))
|
57
|
-
|
58
|
-
# Generate security settings
|
59
|
-
settings.update(cls._generate_security_settings(config))
|
60
|
-
|
61
|
-
# Generate email settings
|
62
|
-
settings.update(cls._generate_email_settings(config))
|
63
|
-
|
64
|
-
# Generate logging settings
|
65
|
-
settings.update(cls._generate_logging_settings(config))
|
66
|
-
|
67
|
-
# Generate static files settings
|
68
|
-
settings.update(cls._generate_static_settings(config))
|
69
|
-
|
70
|
-
# Generate internationalization settings
|
71
|
-
settings.update(cls._generate_i18n_settings(config))
|
72
|
-
|
73
|
-
# Generate limits settings
|
74
|
-
settings.update(cls._generate_limits_settings(config))
|
75
|
-
|
76
|
-
# Generate third-party integration settings
|
77
|
-
settings.update(cls._generate_integration_settings(config))
|
78
|
-
|
79
|
-
return settings
|
80
|
-
|
81
|
-
except Exception as e:
|
82
|
-
raise ConfigurationError(f"Failed to generate Django settings: {e}", context={"config_type": type(config).__name__, "project_name": getattr(config, "project_name", "unknown")}) from e
|
83
|
-
|
84
|
-
@classmethod
|
85
|
-
def _generate_core_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
86
|
-
"""Generate core Django settings."""
|
87
|
-
try:
|
88
|
-
settings = {
|
89
|
-
"SECRET_KEY": config.secret_key,
|
90
|
-
"DEBUG": config.debug,
|
91
|
-
"ALLOWED_HOSTS": config.get_allowed_hosts(),
|
92
|
-
"INSTALLED_APPS": config.get_installed_apps(),
|
93
|
-
"MIDDLEWARE": config.get_middleware(),
|
94
|
-
}
|
95
|
-
|
96
|
-
# Add URL configuration
|
97
|
-
if config.root_urlconf:
|
98
|
-
settings["ROOT_URLCONF"] = config.root_urlconf
|
99
|
-
|
100
|
-
# Add WSGI application
|
101
|
-
if config.wsgi_application:
|
102
|
-
settings["WSGI_APPLICATION"] = config.wsgi_application
|
103
|
-
|
104
|
-
# Add custom user model
|
105
|
-
if config.auth_user_model:
|
106
|
-
settings["AUTH_USER_MODEL"] = config.auth_user_model
|
107
|
-
elif config.enable_accounts:
|
108
|
-
# Auto-use django-cfg accounts CustomUser if accounts is enabled
|
109
|
-
settings["AUTH_USER_MODEL"] = "django_cfg_accounts.CustomUser"
|
110
|
-
|
111
|
-
# Add base directory
|
112
|
-
if config._base_dir:
|
113
|
-
settings["BASE_DIR"] = config._base_dir
|
114
|
-
|
115
|
-
# Add templates configuration
|
116
|
-
django_cfg_templates = Path(__file__).parent.parent / "templates"
|
117
|
-
|
118
|
-
# Collect all django-cfg template directories
|
119
|
-
template_dirs = [
|
120
|
-
config.base_dir / "templates",
|
121
|
-
django_cfg_templates, # Add django_cfg templates
|
122
|
-
]
|
123
|
-
|
124
|
-
# Auto-discover app template directories
|
125
|
-
django_cfg_dir = Path(__file__).parent.parent
|
126
|
-
apps_dir = django_cfg_dir / 'apps'
|
127
|
-
if apps_dir.exists():
|
128
|
-
for app_dir in apps_dir.iterdir():
|
129
|
-
if app_dir.is_dir() and not app_dir.name.startswith(('@', '_', '.')):
|
130
|
-
# Look for common template directory patterns
|
131
|
-
possible_template_dirs = [
|
132
|
-
app_dir / 'templates',
|
133
|
-
app_dir / 'admin_interface' / 'templates',
|
134
|
-
app_dir / 'frontend' / 'templates',
|
135
|
-
]
|
136
|
-
|
137
|
-
for template_dir in possible_template_dirs:
|
138
|
-
if template_dir.exists():
|
139
|
-
template_dirs.append(template_dir)
|
140
|
-
|
141
|
-
settings["TEMPLATES"] = [
|
142
|
-
{
|
143
|
-
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
144
|
-
"DIRS": template_dirs,
|
145
|
-
"APP_DIRS": True,
|
146
|
-
"OPTIONS": {
|
147
|
-
"context_processors": [
|
148
|
-
"django.template.context_processors.debug",
|
149
|
-
"django.template.context_processors.request",
|
150
|
-
"django.contrib.auth.context_processors.auth",
|
151
|
-
"django.contrib.messages.context_processors.messages",
|
152
|
-
],
|
153
|
-
},
|
154
|
-
},
|
155
|
-
]
|
156
|
-
|
157
|
-
# Add default auto field
|
158
|
-
settings["DEFAULT_AUTO_FIELD"] = "django.db.models.BigAutoField"
|
159
|
-
|
160
|
-
return settings
|
161
|
-
|
162
|
-
except Exception as e:
|
163
|
-
raise ConfigurationError(f"Failed to generate core settings: {e}") from e
|
164
|
-
|
165
|
-
@classmethod
|
166
|
-
def _generate_database_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
167
|
-
"""Generate database settings."""
|
168
|
-
try:
|
169
|
-
settings = {}
|
170
|
-
|
171
|
-
if config.databases:
|
172
|
-
# Convert database configurations
|
173
|
-
django_databases = {}
|
174
|
-
for alias, db_config in config.databases.items():
|
175
|
-
django_databases[alias] = db_config.to_django_config()
|
176
|
-
|
177
|
-
settings["DATABASES"] = django_databases
|
178
|
-
|
179
|
-
# Apply database defaults for each database based on its engine
|
180
|
-
for alias, db_config in config.databases.items():
|
181
|
-
db_defaults = SmartDefaults.get_database_defaults(
|
182
|
-
config.env_mode,
|
183
|
-
config.debug,
|
184
|
-
db_config.engine
|
185
|
-
)
|
186
|
-
if db_defaults:
|
187
|
-
# Merge defaults with existing configuration
|
188
|
-
for key, value in db_defaults.items():
|
189
|
-
if key == "OPTIONS":
|
190
|
-
# Merge OPTIONS dictionaries
|
191
|
-
existing_options = django_databases[alias].get("OPTIONS", {})
|
192
|
-
merged_options = {**value, **existing_options}
|
193
|
-
django_databases[alias]["OPTIONS"] = merged_options
|
194
|
-
elif key not in django_databases[alias]:
|
195
|
-
django_databases[alias][key] = value
|
196
|
-
|
197
|
-
# Database routing - check if any database has routing rules
|
198
|
-
routing_rules = {}
|
199
|
-
for alias, db_config in config.databases.items():
|
200
|
-
if db_config.has_routing_rules():
|
201
|
-
for app in db_config.apps:
|
202
|
-
routing_rules[app] = alias
|
203
|
-
|
204
|
-
if routing_rules:
|
205
|
-
settings["DATABASE_ROUTERS"] = ["django_cfg.routing.routers.DatabaseRouter"]
|
206
|
-
settings["DATABASE_ROUTING_RULES"] = routing_rules
|
207
|
-
|
208
|
-
return settings
|
209
|
-
|
210
|
-
except Exception as e:
|
211
|
-
raise ConfigurationError(f"Failed to generate database settings: {e}") from e
|
212
|
-
|
213
|
-
@classmethod
|
214
|
-
def _generate_cache_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
215
|
-
"""Generate cache settings."""
|
216
|
-
try:
|
217
|
-
settings = {}
|
218
|
-
caches = {}
|
219
|
-
|
220
|
-
# Default cache - always provide one
|
221
|
-
if config.cache_default:
|
222
|
-
caches["default"] = config.cache_default.to_django_config(config.env_mode, config.debug, "default")
|
223
|
-
else:
|
224
|
-
# Create default cache backend
|
225
|
-
from django_cfg.models.cache import CacheConfig
|
226
|
-
|
227
|
-
default_cache = CacheConfig()
|
228
|
-
caches["default"] = default_cache.to_django_config(config.env_mode, config.debug, "default")
|
229
|
-
|
230
|
-
# Sessions cache
|
231
|
-
if config.cache_sessions:
|
232
|
-
caches["sessions"] = config.cache_sessions.to_django_config(config.env_mode, config.debug, "sessions")
|
233
|
-
|
234
|
-
# Configure Django to use cache for sessions (can be overridden)
|
235
|
-
settings["SESSION_ENGINE"] = "django.contrib.sessions.backends.cache"
|
236
|
-
settings["SESSION_CACHE_ALIAS"] = "sessions"
|
237
|
-
|
238
|
-
# Add any additional cache backends found as attributes
|
239
|
-
for attr_name in dir(config):
|
240
|
-
if attr_name.startswith("cache_") and attr_name not in ["cache_default", "cache_sessions"]:
|
241
|
-
cache_obj = getattr(config, attr_name)
|
242
|
-
if hasattr(cache_obj, "to_django_config"):
|
243
|
-
cache_alias = attr_name.replace("cache_", "")
|
244
|
-
caches[cache_alias] = cache_obj.to_django_config(config.env_mode, config.debug, cache_alias)
|
245
|
-
|
246
|
-
if caches:
|
247
|
-
settings["CACHES"] = caches
|
248
|
-
|
249
|
-
return settings
|
250
|
-
|
251
|
-
except Exception as e:
|
252
|
-
raise ConfigurationError(f"Failed to generate cache settings: {e}") from e
|
253
|
-
|
254
|
-
@classmethod
|
255
|
-
def _generate_security_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
256
|
-
"""Generate security settings."""
|
257
|
-
try:
|
258
|
-
settings = {}
|
259
|
-
|
260
|
-
# Generate security defaults based on domains and ssl_redirect
|
261
|
-
if config.security_domains or config.ssl_redirect is not None:
|
262
|
-
security_defaults = SmartDefaults.get_security_defaults(
|
263
|
-
config.security_domains,
|
264
|
-
config.env_mode,
|
265
|
-
config.debug,
|
266
|
-
config.ssl_redirect,
|
267
|
-
config.cors_allow_headers
|
268
|
-
)
|
269
|
-
settings.update(security_defaults)
|
270
|
-
|
271
|
-
# Add CORS to installed apps if domains are configured
|
272
|
-
installed_apps = settings.get("INSTALLED_APPS", config.get_installed_apps())
|
273
|
-
if "corsheaders" not in installed_apps:
|
274
|
-
# This will be handled by the core settings generation
|
275
|
-
pass
|
276
|
-
|
277
|
-
# Additional security settings for production
|
278
|
-
if config.env_mode == "production":
|
279
|
-
settings.update(
|
280
|
-
{
|
281
|
-
"SESSION_COOKIE_AGE": 2592000, # 30 days (30 * 24 * 60 * 60)
|
282
|
-
"SESSION_SAVE_EVERY_REQUEST": True,
|
283
|
-
"SESSION_EXPIRE_AT_BROWSER_CLOSE": False, # Allow persistent sessions
|
284
|
-
}
|
285
|
-
)
|
286
|
-
|
287
|
-
return settings
|
288
|
-
|
289
|
-
except Exception as e:
|
290
|
-
raise ConfigurationError(f"Failed to generate security settings: {e}") from e
|
291
|
-
|
292
|
-
@classmethod
|
293
|
-
def _generate_email_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
294
|
-
"""Generate email settings."""
|
295
|
-
try:
|
296
|
-
settings = {}
|
297
|
-
|
298
|
-
if config.email:
|
299
|
-
email_settings = config.email.to_django_config(config.env_mode, config.debug)
|
300
|
-
settings.update(email_settings)
|
301
|
-
|
302
|
-
return settings
|
303
|
-
|
304
|
-
except Exception as e:
|
305
|
-
raise ConfigurationError(f"Failed to generate email settings: {e}") from e
|
306
|
-
|
307
|
-
@classmethod
|
308
|
-
def _generate_logging_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
309
|
-
"""Generate logging settings."""
|
310
|
-
try:
|
311
|
-
settings = {}
|
312
|
-
|
313
|
-
# Generate logging defaults
|
314
|
-
logging_defaults = SmartDefaults.get_logging_defaults(config.env_mode, config.debug)
|
315
|
-
|
316
|
-
if logging_defaults:
|
317
|
-
settings["LOGGING"] = logging_defaults
|
318
|
-
|
319
|
-
return settings
|
320
|
-
|
321
|
-
except Exception as e:
|
322
|
-
raise ConfigurationError(f"Failed to generate logging settings: {e}") from e
|
323
|
-
|
324
|
-
@classmethod
|
325
|
-
def _generate_static_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
326
|
-
"""Generate static files settings."""
|
327
|
-
try:
|
328
|
-
settings = {
|
329
|
-
"STATIC_URL": "/static/",
|
330
|
-
"MEDIA_URL": "/media/",
|
331
|
-
# WhiteNoise configuration
|
332
|
-
"STATICFILES_STORAGE": "whitenoise.storage.CompressedManifestStaticFilesStorage",
|
333
|
-
"WHITENOISE_USE_FINDERS": True,
|
334
|
-
"WHITENOISE_AUTOREFRESH": config.debug,
|
335
|
-
"WHITENOISE_MAX_AGE": 0 if config.debug else 3600, # No cache in debug, 1 hour
|
336
|
-
}
|
337
|
-
|
338
|
-
# Set paths relative to base directory
|
339
|
-
if config._base_dir:
|
340
|
-
settings.update(
|
341
|
-
{
|
342
|
-
"STATIC_ROOT": config._base_dir / "staticfiles",
|
343
|
-
"MEDIA_ROOT": config._base_dir / "media",
|
344
|
-
"STATICFILES_DIRS": [
|
345
|
-
config._base_dir / "static",
|
346
|
-
],
|
347
|
-
}
|
348
|
-
)
|
349
|
-
|
350
|
-
# Static files finders
|
351
|
-
settings["STATICFILES_FINDERS"] = [
|
352
|
-
"django.contrib.staticfiles.finders.FileSystemFinder",
|
353
|
-
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
|
354
|
-
]
|
355
|
-
|
356
|
-
return settings
|
357
|
-
|
358
|
-
except Exception as e:
|
359
|
-
raise ConfigurationError(f"Failed to generate static settings: {e}") from e
|
360
|
-
|
361
|
-
@classmethod
|
362
|
-
def _generate_i18n_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
363
|
-
"""Generate internationalization settings."""
|
364
|
-
try:
|
365
|
-
settings = {
|
366
|
-
"LANGUAGE_CODE": "en-us",
|
367
|
-
"TIME_ZONE": "UTC",
|
368
|
-
"USE_I18N": True,
|
369
|
-
"USE_TZ": True,
|
370
|
-
}
|
371
|
-
|
372
|
-
# Adjust for different environments
|
373
|
-
if config.env_mode == "development":
|
374
|
-
settings["USE_L10N"] = True # Deprecated but sometimes needed
|
375
|
-
|
376
|
-
return settings
|
377
|
-
|
378
|
-
except Exception as e:
|
379
|
-
raise ConfigurationError(f"Failed to generate i18n settings: {e}") from e
|
380
|
-
|
381
|
-
@classmethod
|
382
|
-
def _generate_limits_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
383
|
-
"""Generate application limits settings."""
|
384
|
-
try:
|
385
|
-
settings = {}
|
386
|
-
|
387
|
-
if config.limits:
|
388
|
-
# Get Django settings from limits configuration
|
389
|
-
limits_settings = config.limits.to_django_settings()
|
390
|
-
settings.update(limits_settings)
|
391
|
-
|
392
|
-
return settings
|
393
|
-
|
394
|
-
except Exception as e:
|
395
|
-
raise ConfigurationError(f"Failed to generate limits settings: {e}") from e
|
396
|
-
|
397
|
-
@classmethod
|
398
|
-
def _generate_integration_settings(cls, config: "DjangoConfig") -> Dict[str, Any]:
|
399
|
-
"""Generate third-party integration settings."""
|
400
|
-
try:
|
401
|
-
settings = {}
|
402
|
-
|
403
|
-
# Session configuration - use database for persistence by default
|
404
|
-
settings.update(
|
405
|
-
{
|
406
|
-
"SESSION_ENGINE": "django.contrib.sessions.backends.db",
|
407
|
-
"SESSION_COOKIE_AGE": 86400 * 7, # 7 days
|
408
|
-
"SESSION_SAVE_EVERY_REQUEST": True,
|
409
|
-
}
|
410
|
-
)
|
411
|
-
|
412
|
-
# Placeholder for future integrations
|
413
|
-
integrations = []
|
414
|
-
|
415
|
-
# Check for telegram configuration
|
416
|
-
if config.telegram:
|
417
|
-
telegram_settings = config.telegram.to_config_dict()
|
418
|
-
settings["TELEGRAM_CONFIG"] = telegram_settings
|
419
|
-
integrations.append("telegram")
|
420
|
-
|
421
|
-
# Check for unfold configuration
|
422
|
-
if config.unfold:
|
423
|
-
unfold_settings = config.unfold.to_django_settings()
|
424
|
-
settings.update(unfold_settings)
|
425
|
-
integrations.append("unfold")
|
426
|
-
|
427
|
-
# Check for Constance configuration
|
428
|
-
if hasattr(config, "constance") and config.constance:
|
429
|
-
# Set config reference for app fields detection
|
430
|
-
config.constance.set_config(config)
|
431
|
-
constance_settings = config.constance.to_django_settings()
|
432
|
-
settings.update(constance_settings)
|
433
|
-
integrations.append("constance")
|
434
|
-
|
435
|
-
# Check for JWT configuration
|
436
|
-
if hasattr(config, "jwt") and config.jwt:
|
437
|
-
jwt_settings = config.jwt.to_django_settings(config.secret_key)
|
438
|
-
settings.update(jwt_settings)
|
439
|
-
integrations.append("jwt")
|
440
|
-
|
441
|
-
# Check for Tasks/Dramatiq configuration
|
442
|
-
try:
|
443
|
-
# Use the config's computed method to determine if tasks should be enabled
|
444
|
-
if config.should_enable_tasks():
|
445
|
-
from django_cfg.models.tasks import TaskConfig
|
446
|
-
from django_cfg.modules.django_tasks import generate_dramatiq_settings_from_config
|
447
|
-
|
448
|
-
# Auto-initialize TaskConfig if needed and generate settings
|
449
|
-
task_config = TaskConfig.auto_initialize_if_needed()
|
450
|
-
if task_config is not None:
|
451
|
-
dramatiq_settings = generate_dramatiq_settings_from_config()
|
452
|
-
if dramatiq_settings:
|
453
|
-
settings.update(dramatiq_settings)
|
454
|
-
integrations.append("dramatiq")
|
455
|
-
logger.info("✅ Dramatiq enabled (tasks/knowbase/agents required)")
|
456
|
-
else:
|
457
|
-
logger.debug("⏭️ Dramatiq disabled (no tasks/knowbase/agents)")
|
458
|
-
|
459
|
-
except ImportError as e:
|
460
|
-
logger.warning(f"Failed to import django_tasks module: {e}")
|
461
|
-
except Exception as e:
|
462
|
-
logger.error(f"Failed to generate Dramatiq settings: {e}")
|
463
|
-
|
464
|
-
# Check for Django Revolution configuration
|
465
|
-
if hasattr(config, "revolution") and config.revolution:
|
466
|
-
revolution_settings = {
|
467
|
-
"DJANGO_REVOLUTION": {
|
468
|
-
"api_prefix": config.revolution.api_prefix,
|
469
|
-
"debug": getattr(config.revolution, "debug", config.debug),
|
470
|
-
"auto_install_deps": getattr(config.revolution, "auto_install_deps", True),
|
471
|
-
|
472
|
-
"zones": {zone_name: zone_config.model_dump() for zone_name, zone_config in config.revolution.get_zones_with_defaults().items()},
|
473
|
-
}
|
474
|
-
}
|
475
|
-
settings.update(revolution_settings)
|
476
|
-
integrations.append("django_revolution")
|
477
|
-
|
478
|
-
# Automatically generate DRF configuration using Revolution's core_config
|
479
|
-
try:
|
480
|
-
from django_revolution import create_drf_spectacular_config
|
481
|
-
|
482
|
-
# Extract DRF parameters from RevolutionConfig
|
483
|
-
drf_kwargs = {
|
484
|
-
"title": getattr(config.revolution, "drf_title", "API"),
|
485
|
-
"description": getattr(config.revolution, "drf_description", "RESTful API"),
|
486
|
-
"version": getattr(config.revolution, "drf_version", "1.0.0"),
|
487
|
-
"schema_path_prefix": f"/{config.revolution.api_prefix}/",
|
488
|
-
"enable_browsable_api": getattr(config.revolution, "drf_enable_browsable_api", False),
|
489
|
-
"enable_throttling": getattr(config.revolution, "drf_enable_throttling", False),
|
490
|
-
}
|
491
|
-
|
492
|
-
# Create DRF + Spectacular config with Revolution's comprehensive settings (includes proper enum config)
|
493
|
-
drf_settings = create_drf_spectacular_config(**drf_kwargs)
|
494
|
-
settings.update(drf_settings)
|
495
|
-
logger.info("🚀 Generated DRF + Spectacular settings using Revolution's create_drf_spectacular_config")
|
496
|
-
integrations.append("drf_spectacular")
|
497
|
-
|
498
|
-
except ImportError as e:
|
499
|
-
logger.warning(f"Could not import django_revolution.create_drf_spectacular_config: {e}")
|
500
|
-
except Exception as e:
|
501
|
-
logger.warning(f"Could not generate DRF config from Revolution: {e}")
|
502
|
-
|
503
|
-
# Apply django-cfg DRF/Spectacular extensions
|
504
|
-
try:
|
505
|
-
# Always apply project name to Spectacular settings if they exist
|
506
|
-
if "SPECTACULAR_SETTINGS" in settings:
|
507
|
-
if config.spectacular:
|
508
|
-
# User provided explicit spectacular config
|
509
|
-
spectacular_extensions = config.spectacular.get_spectacular_settings(project_name=config.project_name)
|
510
|
-
settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
|
511
|
-
logger.info("🔧 Extended SPECTACULAR_SETTINGS with django-cfg Spectacular config")
|
512
|
-
else:
|
513
|
-
# Auto-create minimal spectacular config to set project name
|
514
|
-
from django_cfg.models.drf import SpectacularConfig
|
515
|
-
auto_spectacular = SpectacularConfig()
|
516
|
-
spectacular_extensions = auto_spectacular.get_spectacular_settings(project_name=config.project_name)
|
517
|
-
settings["SPECTACULAR_SETTINGS"].update(spectacular_extensions)
|
518
|
-
logger.info(f"🚀 Auto-configured API title as '{config.project_name} API'")
|
519
|
-
|
520
|
-
integrations.append("drf_spectacular_extended")
|
521
|
-
|
522
|
-
# Always apply django-cfg DRF settings (create REST_FRAMEWORK if needed)
|
523
|
-
if config.drf:
|
524
|
-
# User provided explicit DRF config
|
525
|
-
drf_extensions = config.drf.get_rest_framework_settings()
|
526
|
-
if "REST_FRAMEWORK" in settings:
|
527
|
-
settings["REST_FRAMEWORK"].update(drf_extensions)
|
528
|
-
else:
|
529
|
-
settings["REST_FRAMEWORK"] = drf_extensions
|
530
|
-
logger.info("🔧 Extended REST_FRAMEWORK settings with django-cfg DRF config")
|
531
|
-
else:
|
532
|
-
# Auto-create minimal DRF config to set default pagination
|
533
|
-
from django_cfg.models.drf import DRFConfig
|
534
|
-
auto_drf = DRFConfig()
|
535
|
-
drf_extensions = auto_drf.get_rest_framework_settings()
|
536
|
-
|
537
|
-
if "REST_FRAMEWORK" in settings:
|
538
|
-
# Only apply pagination and page_size, don't override other settings
|
539
|
-
pagination_settings = {
|
540
|
-
'DEFAULT_PAGINATION_CLASS': drf_extensions['DEFAULT_PAGINATION_CLASS'],
|
541
|
-
'PAGE_SIZE': drf_extensions['PAGE_SIZE'],
|
542
|
-
}
|
543
|
-
settings["REST_FRAMEWORK"].update(pagination_settings)
|
544
|
-
else:
|
545
|
-
# Create new REST_FRAMEWORK settings with our defaults
|
546
|
-
settings["REST_FRAMEWORK"] = drf_extensions
|
547
|
-
|
548
|
-
logger.info(f"🚀 Auto-configured default pagination: {drf_extensions['DEFAULT_PAGINATION_CLASS']}")
|
549
|
-
|
550
|
-
except Exception as e:
|
551
|
-
logger.warning(f"Could not apply DRF/Spectacular extensions from django-cfg: {e}")
|
552
|
-
|
553
|
-
# Add integration info for debugging
|
554
|
-
if integrations:
|
555
|
-
settings["DJANGO_CFG_INTEGRATIONS"] = integrations
|
556
|
-
|
557
|
-
# Apply additional settings from config if available (for overrides)
|
558
|
-
if hasattr(config, "get_additional_settings"):
|
559
|
-
additional_settings = config.get_additional_settings()
|
560
|
-
settings.update(additional_settings)
|
561
|
-
|
562
|
-
return settings
|
563
|
-
|
564
|
-
except Exception as e:
|
565
|
-
raise ConfigurationError(f"Failed to generate integration settings: {e}") from e
|
566
|
-
|
567
|
-
@classmethod
|
568
|
-
def validate_generated_settings(cls, settings: Dict[str, Any]) -> List[str]:
|
569
|
-
"""
|
570
|
-
Validate generated Django settings.
|
571
|
-
|
572
|
-
Args:
|
573
|
-
settings: Generated Django settings
|
574
|
-
|
575
|
-
Returns:
|
576
|
-
List of validation errors (empty if valid)
|
577
|
-
"""
|
578
|
-
errors = []
|
579
|
-
|
580
|
-
# Required settings validation
|
581
|
-
required_settings = ["SECRET_KEY", "DEBUG", "ALLOWED_HOSTS", "INSTALLED_APPS", "MIDDLEWARE", "DATABASES"]
|
582
|
-
|
583
|
-
for setting in required_settings:
|
584
|
-
if setting not in settings:
|
585
|
-
errors.append(f"Missing required setting: {setting}")
|
586
|
-
|
587
|
-
# SECRET_KEY validation
|
588
|
-
if "SECRET_KEY" in settings:
|
589
|
-
secret_key = settings["SECRET_KEY"]
|
590
|
-
if not secret_key or len(secret_key) < 50:
|
591
|
-
errors.append("SECRET_KEY must be at least 50 characters long")
|
592
|
-
|
593
|
-
# DATABASES validation
|
594
|
-
if "DATABASES" in settings:
|
595
|
-
databases = settings["DATABASES"]
|
596
|
-
if not isinstance(databases, dict) or not databases:
|
597
|
-
errors.append("DATABASES must be a non-empty dictionary")
|
598
|
-
elif "default" not in databases:
|
599
|
-
errors.append("DATABASES must contain a 'default' database")
|
600
|
-
|
601
|
-
# INSTALLED_APPS validation
|
602
|
-
if "INSTALLED_APPS" in settings:
|
603
|
-
installed_apps = settings["INSTALLED_APPS"]
|
604
|
-
if not isinstance(installed_apps, list):
|
605
|
-
errors.append("INSTALLED_APPS must be a list")
|
606
|
-
else:
|
607
|
-
required_apps = [
|
608
|
-
"django.contrib.contenttypes",
|
609
|
-
"django.contrib.auth",
|
610
|
-
]
|
611
|
-
for app in required_apps:
|
612
|
-
if app not in installed_apps:
|
613
|
-
errors.append(f"Missing required app: {app}")
|
614
|
-
|
615
|
-
return errors
|
616
|
-
|
617
|
-
|
618
|
-
# Export the main class
|
619
|
-
__all__ = [
|
620
|
-
"SettingsGenerator",
|
621
|
-
]
|