django-cfg 1.3.13__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/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.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
"""
|
2
|
+
Dramatiq settings generation.
|
3
|
+
|
4
|
+
Functions to generate Dramatiq settings from DjangoConfig.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Optional, Dict, Any
|
8
|
+
import logging
|
9
|
+
|
10
|
+
logger = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
|
13
|
+
def generate_dramatiq_settings_from_config(config=None) -> Optional[Dict[str, Any]]:
|
14
|
+
"""
|
15
|
+
Generate Dramatiq settings from DjangoConfig instance.
|
16
|
+
|
17
|
+
Args:
|
18
|
+
config: DjangoConfig instance (optional, will auto-discover if not provided)
|
19
|
+
|
20
|
+
Returns:
|
21
|
+
Dict[str, Any]: Dramatiq settings dictionary or None if not enabled
|
22
|
+
"""
|
23
|
+
# If config provided, use it directly
|
24
|
+
if config is not None:
|
25
|
+
try:
|
26
|
+
if not hasattr(config, "tasks") or not config.tasks or not config.tasks.enabled:
|
27
|
+
return None
|
28
|
+
|
29
|
+
# Get Redis URL from cache configuration
|
30
|
+
redis_url = None
|
31
|
+
if config.cache_default and hasattr(config.cache_default, 'redis_url'):
|
32
|
+
redis_url = config.cache_default.redis_url
|
33
|
+
elif config.cache_default and hasattr(config.cache_default, 'location'):
|
34
|
+
redis_url = config.cache_default.location
|
35
|
+
else:
|
36
|
+
redis_url = "redis://localhost:6379"
|
37
|
+
|
38
|
+
if redis_url:
|
39
|
+
dramatiq_settings = config.tasks.get_dramatiq_settings(redis_url)
|
40
|
+
logger.debug(f"Generated Dramatiq settings with Redis URL: {redis_url}")
|
41
|
+
return dramatiq_settings
|
42
|
+
else:
|
43
|
+
logger.warning("Tasks enabled but no Redis URL available for Dramatiq")
|
44
|
+
return None
|
45
|
+
|
46
|
+
except Exception as e:
|
47
|
+
logger.error(f"Failed to generate Dramatiq settings: {e}")
|
48
|
+
return None
|
49
|
+
|
50
|
+
# Auto-discover config if not provided
|
51
|
+
try:
|
52
|
+
from ..base import BaseCfgModule
|
53
|
+
|
54
|
+
base_module = BaseCfgModule()
|
55
|
+
config = base_module.get_config()
|
56
|
+
|
57
|
+
if not config or not hasattr(config, 'tasks') or not config.tasks or not config.tasks.enabled:
|
58
|
+
return None
|
59
|
+
|
60
|
+
# Get Redis URL from cache config or environment
|
61
|
+
redis_url = None
|
62
|
+
if hasattr(config, 'cache_default') and config.cache_default:
|
63
|
+
redis_url = getattr(config.cache_default, 'redis_url', None)
|
64
|
+
|
65
|
+
if not redis_url:
|
66
|
+
# Fallback to environment or default
|
67
|
+
import os
|
68
|
+
redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379/1')
|
69
|
+
|
70
|
+
# Generate Dramatiq settings
|
71
|
+
dramatiq_settings = config.tasks.get_dramatiq_settings(redis_url)
|
72
|
+
|
73
|
+
# Ensure we only use Redis broker (no RabbitMQ)
|
74
|
+
if 'DRAMATIQ_BROKER' in dramatiq_settings:
|
75
|
+
dramatiq_settings['DRAMATIQ_BROKER']['BROKER'] = 'dramatiq.brokers.redis.RedisBroker'
|
76
|
+
|
77
|
+
logger.info(f"✅ Generated Dramatiq settings with Redis broker and {len(config.tasks.dramatiq.queues)} queues")
|
78
|
+
return dramatiq_settings
|
79
|
+
|
80
|
+
except Exception as e:
|
81
|
+
logger.error(f"Failed to generate Dramatiq settings: {e}")
|
82
|
+
return None
|
83
|
+
|
84
|
+
|
85
|
+
def extend_constance_config_with_tasks():
|
86
|
+
"""Extend Constance configuration with Dramatiq task fields if tasks are enabled."""
|
87
|
+
try:
|
88
|
+
from .factory import get_task_service
|
89
|
+
|
90
|
+
service = get_task_service()
|
91
|
+
if not service.is_enabled():
|
92
|
+
logger.debug("Task system not enabled, skipping Constance extension")
|
93
|
+
return []
|
94
|
+
|
95
|
+
fields = service.get_constance_fields()
|
96
|
+
logger.info(f"🔧 Extended Constance with {len(fields)} task configuration fields")
|
97
|
+
return fields
|
98
|
+
|
99
|
+
except Exception as e:
|
100
|
+
logger.error(f"Failed to extend Constance config with tasks: {e}")
|
101
|
+
return []
|
102
|
+
|
103
|
+
|
104
|
+
__all__ = [
|
105
|
+
"generate_dramatiq_settings_from_config",
|
106
|
+
"extend_constance_config_with_tasks",
|
107
|
+
]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"""
|
2
|
+
Django Telegram Service for django_cfg.
|
3
|
+
|
4
|
+
Auto-configuring Telegram notification service that integrates with DjangoConfig.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .service import (
|
8
|
+
TelegramParseMode,
|
9
|
+
TelegramError,
|
10
|
+
TelegramConfigError,
|
11
|
+
TelegramSendError,
|
12
|
+
DjangoTelegram,
|
13
|
+
)
|
14
|
+
from .utils import (
|
15
|
+
send_telegram_message,
|
16
|
+
send_telegram_photo,
|
17
|
+
send_telegram_document,
|
18
|
+
)
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"TelegramParseMode",
|
22
|
+
"TelegramError",
|
23
|
+
"TelegramConfigError",
|
24
|
+
"TelegramSendError",
|
25
|
+
"DjangoTelegram",
|
26
|
+
"send_telegram_message",
|
27
|
+
"send_telegram_photo",
|
28
|
+
"send_telegram_document",
|
29
|
+
]
|
@@ -5,11 +5,10 @@ Auto-configuring Telegram notification service that integrates with DjangoConfig
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
import
|
9
|
-
from typing import Optional, Dict, Any, Union, List, BinaryIO
|
8
|
+
from typing import Optional, Dict, Any, Union, BinaryIO
|
10
9
|
from enum import Enum
|
11
10
|
import yaml
|
12
|
-
from
|
11
|
+
from ..base import BaseCfgModule
|
13
12
|
from django_cfg.core.exceptions import ConfigurationError
|
14
13
|
import telebot
|
15
14
|
|
@@ -26,19 +25,16 @@ class TelegramParseMode(Enum):
|
|
26
25
|
|
27
26
|
class TelegramError(Exception):
|
28
27
|
"""Base exception for Telegram-related errors."""
|
29
|
-
|
30
28
|
pass
|
31
29
|
|
32
30
|
|
33
31
|
class TelegramConfigError(TelegramError):
|
34
32
|
"""Raised when configuration is missing or invalid."""
|
35
|
-
|
36
33
|
pass
|
37
34
|
|
38
35
|
|
39
36
|
class TelegramSendError(TelegramError):
|
40
37
|
"""Raised when message sending fails."""
|
41
|
-
|
42
38
|
pass
|
43
39
|
|
44
40
|
|
@@ -91,7 +87,6 @@ class DjangoTelegram(BaseCfgModule):
|
|
91
87
|
|
92
88
|
if self._bot is None:
|
93
89
|
try:
|
94
|
-
|
95
90
|
telegram_config = self.config.telegram
|
96
91
|
self._bot = telebot.TeleBot(telegram_config.bot_token)
|
97
92
|
except ImportError:
|
@@ -116,7 +111,7 @@ class DjangoTelegram(BaseCfgModule):
|
|
116
111
|
"configured": True,
|
117
112
|
"bot_token": f"{telegram_config.bot_token[:10]}..." if telegram_config.bot_token else "Not set",
|
118
113
|
"chat_id": telegram_config.chat_id or "Not set",
|
119
|
-
"enabled": True,
|
114
|
+
"enabled": True,
|
120
115
|
"parse_mode": telegram_config.parse_mode or "None",
|
121
116
|
}
|
122
117
|
|
@@ -152,8 +147,6 @@ class DjangoTelegram(BaseCfgModule):
|
|
152
147
|
return False
|
153
148
|
|
154
149
|
telegram_config = self.config.telegram
|
155
|
-
|
156
|
-
# Use provided chat_id or fall back to config
|
157
150
|
target_chat_id = chat_id or telegram_config.chat_id
|
158
151
|
if not target_chat_id:
|
159
152
|
error_msg = "No chat_id provided and none configured"
|
@@ -162,20 +155,17 @@ class DjangoTelegram(BaseCfgModule):
|
|
162
155
|
raise TelegramConfigError(error_msg)
|
163
156
|
return False
|
164
157
|
|
165
|
-
# Use provided parse_mode or fall back to config
|
166
158
|
target_parse_mode = parse_mode or telegram_config.parse_mode
|
167
|
-
|
159
|
+
|
168
160
|
# Handle both enum and string parse modes
|
169
161
|
if target_parse_mode:
|
170
162
|
if isinstance(target_parse_mode, TelegramParseMode):
|
171
163
|
parse_mode_str = target_parse_mode.value
|
172
164
|
else:
|
173
|
-
# If it's already a string from config, use it directly
|
174
165
|
parse_mode_str = target_parse_mode
|
175
166
|
else:
|
176
167
|
parse_mode_str = None
|
177
168
|
|
178
|
-
# Send message
|
179
169
|
self.bot.send_message(
|
180
170
|
chat_id=target_chat_id,
|
181
171
|
text=message,
|
@@ -234,13 +224,12 @@ class DjangoTelegram(BaseCfgModule):
|
|
234
224
|
return False
|
235
225
|
|
236
226
|
target_parse_mode = parse_mode or telegram_config.parse_mode
|
237
|
-
|
227
|
+
|
238
228
|
# Handle both enum and string parse modes
|
239
229
|
if target_parse_mode:
|
240
230
|
if isinstance(target_parse_mode, TelegramParseMode):
|
241
231
|
parse_mode_str = target_parse_mode.value
|
242
232
|
else:
|
243
|
-
# If it's already a string from config, use it directly
|
244
233
|
parse_mode_str = target_parse_mode
|
245
234
|
else:
|
246
235
|
parse_mode_str = None
|
@@ -302,13 +291,12 @@ class DjangoTelegram(BaseCfgModule):
|
|
302
291
|
return False
|
303
292
|
|
304
293
|
target_parse_mode = parse_mode or telegram_config.parse_mode
|
305
|
-
|
294
|
+
|
306
295
|
# Handle both enum and string parse modes
|
307
296
|
if target_parse_mode:
|
308
297
|
if isinstance(target_parse_mode, TelegramParseMode):
|
309
298
|
parse_mode_str = target_parse_mode.value
|
310
299
|
else:
|
311
|
-
# If it's already a string from config, use it directly
|
312
300
|
parse_mode_str = target_parse_mode
|
313
301
|
else:
|
314
302
|
parse_mode_str = None
|
@@ -360,8 +348,6 @@ class DjangoTelegram(BaseCfgModule):
|
|
360
348
|
def _format_to_yaml(cls, data: Dict[str, Any]) -> str:
|
361
349
|
"""Format dictionary data as YAML string."""
|
362
350
|
try:
|
363
|
-
import yaml
|
364
|
-
|
365
351
|
yaml_str = yaml.safe_dump(
|
366
352
|
data,
|
367
353
|
default_flow_style=False,
|
@@ -372,59 +358,50 @@ class DjangoTelegram(BaseCfgModule):
|
|
372
358
|
return yaml_str
|
373
359
|
except Exception as e:
|
374
360
|
logger.error(f"Error formatting to YAML: {str(e)}")
|
375
|
-
# Final fallback to string representation
|
376
361
|
return str(data)
|
377
362
|
|
378
363
|
@classmethod
|
379
364
|
def send_error(cls, error: str, context: Optional[Dict[str, Any]] = None) -> None:
|
380
|
-
"""Send error notification.
|
381
|
-
|
382
|
-
|
383
|
-
error
|
384
|
-
context:
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
365
|
+
"""Send error notification."""
|
366
|
+
try:
|
367
|
+
telegram = cls()
|
368
|
+
text = f"{cls.EMOJI_MAP['error']} <b>Error</b>\n\n{error}"
|
369
|
+
if context:
|
370
|
+
text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
|
371
|
+
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
372
|
+
except Exception:
|
373
|
+
# Silently fail - error notifications should not cause cascading failures
|
374
|
+
pass
|
391
375
|
|
392
376
|
@classmethod
|
393
377
|
def send_success(cls, message: str, details: Optional[Dict[str, Any]] = None) -> None:
|
394
|
-
"""Send success notification.
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
details:
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
378
|
+
"""Send success notification."""
|
379
|
+
try:
|
380
|
+
telegram = cls()
|
381
|
+
text = f"{cls.EMOJI_MAP['success']} <b>Success</b>\n\n{message}"
|
382
|
+
if details:
|
383
|
+
text += "\n\n<pre>" + cls._format_to_yaml(details) + "</pre>"
|
384
|
+
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
385
|
+
except Exception:
|
386
|
+
# Silently fail - success notifications should not cause failures
|
387
|
+
pass
|
405
388
|
|
406
389
|
@classmethod
|
407
390
|
def send_warning(cls, warning: str, context: Optional[Dict[str, Any]] = None) -> None:
|
408
|
-
"""Send warning notification.
|
409
|
-
|
410
|
-
|
411
|
-
warning
|
412
|
-
context:
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
391
|
+
"""Send warning notification."""
|
392
|
+
try:
|
393
|
+
telegram = cls()
|
394
|
+
text = f"{cls.EMOJI_MAP['warning']} <b>Warning</b>\n\n{warning}"
|
395
|
+
if context:
|
396
|
+
text += "\n\n<pre>" + cls._format_to_yaml(context) + "</pre>"
|
397
|
+
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
398
|
+
except Exception:
|
399
|
+
# Silently fail - warning notifications should not cause failures
|
400
|
+
pass
|
419
401
|
|
420
402
|
@classmethod
|
421
403
|
def send_info(cls, message: str, data: Optional[Dict[str, Any]] = None) -> None:
|
422
|
-
"""Send informational message.
|
423
|
-
|
424
|
-
Args:
|
425
|
-
message: Info message
|
426
|
-
data: Optional data
|
427
|
-
"""
|
404
|
+
"""Send informational message."""
|
428
405
|
telegram = cls()
|
429
406
|
text = f"{cls.EMOJI_MAP['info']} <b>Info</b>\n\n{message}"
|
430
407
|
if data:
|
@@ -433,62 +410,17 @@ class DjangoTelegram(BaseCfgModule):
|
|
433
410
|
|
434
411
|
@classmethod
|
435
412
|
def send_stats(cls, title: str, stats: Dict[str, Any]) -> None:
|
436
|
-
"""Send statistics data.
|
437
|
-
|
438
|
-
Args:
|
439
|
-
title: Stats title
|
440
|
-
stats: Statistics data
|
441
|
-
"""
|
413
|
+
"""Send statistics data."""
|
442
414
|
telegram = cls()
|
443
415
|
text = f"{cls.EMOJI_MAP['stats']} <b>{title}</b>"
|
444
416
|
text += "\n\n<pre>" + cls._format_to_yaml(stats) + "</pre>"
|
445
417
|
telegram.send_message(text, parse_mode=TelegramParseMode.HTML)
|
446
418
|
|
447
419
|
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
"""Send a Telegram message using auto-configured service."""
|
456
|
-
telegram = DjangoTelegram()
|
457
|
-
return telegram.send_message(
|
458
|
-
message=message,
|
459
|
-
chat_id=chat_id,
|
460
|
-
parse_mode=parse_mode,
|
461
|
-
fail_silently=fail_silently,
|
462
|
-
)
|
463
|
-
|
464
|
-
|
465
|
-
def send_telegram_photo(
|
466
|
-
photo: Union[str, BinaryIO],
|
467
|
-
caption: Optional[str] = None,
|
468
|
-
chat_id: Optional[Union[int, str]] = None,
|
469
|
-
fail_silently: bool = False,
|
470
|
-
) -> bool:
|
471
|
-
"""Send a Telegram photo using auto-configured service."""
|
472
|
-
telegram = DjangoTelegram()
|
473
|
-
return telegram.send_photo(
|
474
|
-
photo=photo,
|
475
|
-
caption=caption,
|
476
|
-
chat_id=chat_id,
|
477
|
-
fail_silently=fail_silently,
|
478
|
-
)
|
479
|
-
|
480
|
-
|
481
|
-
def send_telegram_document(
|
482
|
-
document: Union[str, BinaryIO],
|
483
|
-
caption: Optional[str] = None,
|
484
|
-
chat_id: Optional[Union[int, str]] = None,
|
485
|
-
fail_silently: bool = False,
|
486
|
-
) -> bool:
|
487
|
-
"""Send a Telegram document using auto-configured service."""
|
488
|
-
telegram = DjangoTelegram()
|
489
|
-
return telegram.send_document(
|
490
|
-
document=document,
|
491
|
-
caption=caption,
|
492
|
-
chat_id=chat_id,
|
493
|
-
fail_silently=fail_silently,
|
494
|
-
)
|
420
|
+
__all__ = [
|
421
|
+
"TelegramParseMode",
|
422
|
+
"TelegramError",
|
423
|
+
"TelegramConfigError",
|
424
|
+
"TelegramSendError",
|
425
|
+
"DjangoTelegram",
|
426
|
+
]
|
@@ -0,0 +1,62 @@
|
|
1
|
+
"""
|
2
|
+
Telegram utilities and convenience functions.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Optional, Union, BinaryIO
|
6
|
+
|
7
|
+
from .service import DjangoTelegram, TelegramParseMode
|
8
|
+
|
9
|
+
|
10
|
+
def send_telegram_message(
|
11
|
+
message: str,
|
12
|
+
chat_id: Optional[Union[int, str]] = None,
|
13
|
+
parse_mode: Optional[TelegramParseMode] = None,
|
14
|
+
fail_silently: bool = False,
|
15
|
+
) -> bool:
|
16
|
+
"""Send a Telegram message using auto-configured service."""
|
17
|
+
telegram = DjangoTelegram()
|
18
|
+
return telegram.send_message(
|
19
|
+
message=message,
|
20
|
+
chat_id=chat_id,
|
21
|
+
parse_mode=parse_mode,
|
22
|
+
fail_silently=fail_silently,
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
def send_telegram_photo(
|
27
|
+
photo: Union[str, BinaryIO],
|
28
|
+
caption: Optional[str] = None,
|
29
|
+
chat_id: Optional[Union[int, str]] = None,
|
30
|
+
fail_silently: bool = False,
|
31
|
+
) -> bool:
|
32
|
+
"""Send a Telegram photo using auto-configured service."""
|
33
|
+
telegram = DjangoTelegram()
|
34
|
+
return telegram.send_photo(
|
35
|
+
photo=photo,
|
36
|
+
caption=caption,
|
37
|
+
chat_id=chat_id,
|
38
|
+
fail_silently=fail_silently,
|
39
|
+
)
|
40
|
+
|
41
|
+
|
42
|
+
def send_telegram_document(
|
43
|
+
document: Union[str, BinaryIO],
|
44
|
+
caption: Optional[str] = None,
|
45
|
+
chat_id: Optional[Union[int, str]] = None,
|
46
|
+
fail_silently: bool = False,
|
47
|
+
) -> bool:
|
48
|
+
"""Send a Telegram document using auto-configured service."""
|
49
|
+
telegram = DjangoTelegram()
|
50
|
+
return telegram.send_document(
|
51
|
+
document=document,
|
52
|
+
caption=caption,
|
53
|
+
chat_id=chat_id,
|
54
|
+
fail_silently=fail_silently,
|
55
|
+
)
|
56
|
+
|
57
|
+
|
58
|
+
__all__ = [
|
59
|
+
"send_telegram_message",
|
60
|
+
"send_telegram_photo",
|
61
|
+
"send_telegram_document",
|
62
|
+
]
|
@@ -13,134 +13,81 @@ Features:
|
|
13
13
|
- Type-safe configuration with Pydantic v2
|
14
14
|
"""
|
15
15
|
|
16
|
-
|
16
|
+
# Configuration
|
17
|
+
from django_cfg.modules.django_twilio.models import TwilioConfig
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
SMSOTPService,
|
25
|
-
UnifiedOTPService,
|
26
|
-
)
|
27
|
-
from django_cfg.modules.django_twilio.simple_service import SimpleTwilioService
|
28
|
-
from django_cfg.modules.django_twilio.exceptions import (
|
29
|
-
TwilioError,
|
30
|
-
TwilioConfigurationError,
|
31
|
-
TwilioVerificationError,
|
32
|
-
TwilioSendError,
|
33
|
-
)
|
19
|
+
# Services
|
20
|
+
from django_cfg.modules.django_twilio.base import BaseTwilioService, is_async_context
|
21
|
+
from django_cfg.modules.django_twilio.whatsapp import WhatsAppOTPService
|
22
|
+
from django_cfg.modules.django_twilio.email_otp import EmailOTPService
|
23
|
+
from django_cfg.modules.django_twilio.sms import SMSOTPService
|
24
|
+
from django_cfg.modules.django_twilio.unified import UnifiedOTPService, DjangoTwilioService
|
34
25
|
|
26
|
+
# Simple messaging service
|
27
|
+
from django_cfg.modules.django_twilio.simple_service import SimpleTwilioService
|
35
28
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
elif name == "SMSOTPService":
|
64
|
-
from django_cfg.modules.django_twilio.service import SMSOTPService
|
65
|
-
return SMSOTPService
|
66
|
-
|
67
|
-
elif name == "UnifiedOTPService":
|
68
|
-
from django_cfg.modules.django_twilio.service import UnifiedOTPService
|
69
|
-
return UnifiedOTPService
|
70
|
-
|
71
|
-
# Exceptions
|
72
|
-
elif name == "TwilioError":
|
73
|
-
from django_cfg.modules.django_twilio.exceptions import TwilioError
|
74
|
-
return TwilioError
|
75
|
-
|
76
|
-
elif name == "TwilioConfigurationError":
|
77
|
-
from django_cfg.modules.django_twilio.exceptions import TwilioConfigurationError
|
78
|
-
return TwilioConfigurationError
|
79
|
-
|
80
|
-
elif name == "TwilioVerificationError":
|
81
|
-
from django_cfg.modules.django_twilio.exceptions import TwilioVerificationError
|
82
|
-
return TwilioVerificationError
|
83
|
-
|
84
|
-
elif name == "TwilioSendError":
|
85
|
-
from django_cfg.modules.django_twilio.exceptions import TwilioSendError
|
86
|
-
return TwilioSendError
|
87
|
-
|
88
|
-
# Convenience functions
|
89
|
-
elif name == "send_whatsapp_otp":
|
90
|
-
from django_cfg.modules.django_twilio.service import send_whatsapp_otp
|
91
|
-
return send_whatsapp_otp
|
92
|
-
|
93
|
-
elif name == "send_email_otp":
|
94
|
-
from django_cfg.modules.django_twilio.service import send_email_otp
|
95
|
-
return send_email_otp
|
96
|
-
|
97
|
-
elif name == "send_sms_otp":
|
98
|
-
from django_cfg.modules.django_twilio.service import send_sms_otp
|
99
|
-
return send_sms_otp
|
100
|
-
|
101
|
-
elif name == "verify_otp":
|
102
|
-
from django_cfg.modules.django_twilio.service import verify_otp
|
103
|
-
return verify_otp
|
104
|
-
|
105
|
-
# Simple service convenience functions
|
106
|
-
elif name == "send_whatsapp":
|
107
|
-
from django_cfg.modules.django_twilio.simple_service import send_whatsapp
|
108
|
-
return send_whatsapp
|
109
|
-
|
110
|
-
elif name == "send_sms":
|
111
|
-
from django_cfg.modules.django_twilio.simple_service import send_sms
|
112
|
-
return send_sms
|
113
|
-
|
114
|
-
else:
|
115
|
-
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
29
|
+
# Exceptions
|
30
|
+
from django_cfg.modules.django_twilio.exceptions import (
|
31
|
+
TwilioError,
|
32
|
+
TwilioConfigurationError,
|
33
|
+
TwilioVerificationError,
|
34
|
+
TwilioSendError,
|
35
|
+
)
|
36
|
+
|
37
|
+
# Convenience functions
|
38
|
+
from django_cfg.modules.django_twilio.utils import (
|
39
|
+
send_whatsapp_otp,
|
40
|
+
send_email_otp,
|
41
|
+
send_sms_otp,
|
42
|
+
verify_otp,
|
43
|
+
asend_whatsapp_otp,
|
44
|
+
asend_email_otp,
|
45
|
+
asend_sms_otp,
|
46
|
+
averify_otp,
|
47
|
+
)
|
48
|
+
|
49
|
+
# Simple messaging convenience functions
|
50
|
+
try:
|
51
|
+
from django_cfg.modules.django_twilio.simple_service import send_whatsapp, send_sms
|
52
|
+
except ImportError:
|
53
|
+
send_whatsapp = None
|
54
|
+
send_sms = None
|
116
55
|
|
117
56
|
|
118
57
|
# Public API
|
119
58
|
__all__ = [
|
120
59
|
# Configuration
|
121
60
|
"TwilioConfig",
|
122
|
-
|
61
|
+
|
123
62
|
# Services
|
124
63
|
"DjangoTwilioService",
|
125
64
|
"SimpleTwilioService",
|
126
|
-
"WhatsAppOTPService",
|
65
|
+
"WhatsAppOTPService",
|
127
66
|
"EmailOTPService",
|
128
67
|
"SMSOTPService",
|
129
68
|
"UnifiedOTPService",
|
130
|
-
|
69
|
+
"BaseTwilioService",
|
70
|
+
|
131
71
|
# Exceptions
|
132
72
|
"TwilioError",
|
133
|
-
"TwilioConfigurationError",
|
73
|
+
"TwilioConfigurationError",
|
134
74
|
"TwilioVerificationError",
|
135
75
|
"TwilioSendError",
|
136
|
-
|
76
|
+
|
137
77
|
# OTP functions
|
138
78
|
"send_whatsapp_otp",
|
139
|
-
"send_email_otp",
|
79
|
+
"send_email_otp",
|
140
80
|
"send_sms_otp",
|
141
81
|
"verify_otp",
|
142
|
-
|
143
|
-
|
144
|
-
"
|
145
|
-
"
|
82
|
+
"asend_whatsapp_otp",
|
83
|
+
"asend_email_otp",
|
84
|
+
"asend_sms_otp",
|
85
|
+
"averify_otp",
|
86
|
+
|
87
|
+
# Utility functions
|
88
|
+
"is_async_context",
|
146
89
|
]
|
90
|
+
|
91
|
+
# Add simple messaging if available
|
92
|
+
if send_whatsapp is not None:
|
93
|
+
__all__.extend(["send_whatsapp", "send_sms"])
|