django-cfg 1.4.21__py3-none-any.whl → 1.4.23__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 +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -8,20 +8,16 @@ Handles all Twilio-specific functionality including:
|
|
8
8
|
"""
|
9
9
|
|
10
10
|
import logging
|
11
|
-
import
|
12
|
-
import string
|
13
|
-
from typing import Optional, Dict, Any, Tuple
|
14
|
-
from datetime import datetime, timedelta
|
15
|
-
|
16
|
-
from ._imports import Client, TwilioException
|
17
|
-
from asgiref.sync import sync_to_async
|
11
|
+
from typing import Any, Dict, Optional, Tuple
|
18
12
|
|
19
13
|
from django_cfg.modules.base import BaseCfgModule
|
20
|
-
from django_cfg.modules.django_twilio.models import TwilioConfig, TwilioVerifyConfig
|
21
14
|
from django_cfg.modules.django_twilio.exceptions import (
|
22
15
|
TwilioConfigurationError,
|
23
16
|
TwilioSendError,
|
24
17
|
)
|
18
|
+
from django_cfg.modules.django_twilio.models import TwilioConfig
|
19
|
+
|
20
|
+
from ._imports import Client, TwilioException
|
25
21
|
|
26
22
|
logger = logging.getLogger(__name__)
|
27
23
|
|
@@ -32,13 +28,13 @@ class TwilioService(BaseCfgModule):
|
|
32
28
|
|
33
29
|
Handles all Twilio operations with auto-configuration from DjangoConfig.
|
34
30
|
"""
|
35
|
-
|
31
|
+
|
36
32
|
def __init__(self):
|
37
33
|
"""Initialize with auto-discovered configuration."""
|
38
34
|
super().__init__()
|
39
35
|
self._config: Optional[TwilioConfig] = None
|
40
36
|
self._client: Optional[Client] = None
|
41
|
-
|
37
|
+
|
42
38
|
def get_config(self) -> TwilioConfig:
|
43
39
|
"""Get Twilio configuration from DjangoConfig."""
|
44
40
|
if self._config is None:
|
@@ -48,7 +44,7 @@ class TwilioService(BaseCfgModule):
|
|
48
44
|
"DjangoConfig instance not found",
|
49
45
|
suggestions=["Ensure DjangoConfig is properly initialized"]
|
50
46
|
)
|
51
|
-
|
47
|
+
|
52
48
|
twilio_config = getattr(django_config, 'twilio', None)
|
53
49
|
if not twilio_config:
|
54
50
|
raise TwilioConfigurationError(
|
@@ -56,11 +52,11 @@ class TwilioService(BaseCfgModule):
|
|
56
52
|
missing_fields=["twilio"],
|
57
53
|
suggestions=["Add TwilioConfig to your DjangoConfig class"]
|
58
54
|
)
|
59
|
-
|
55
|
+
|
60
56
|
self._config = twilio_config
|
61
|
-
|
57
|
+
|
62
58
|
return self._config
|
63
|
-
|
59
|
+
|
64
60
|
def get_client(self) -> Client:
|
65
61
|
"""Get or create Twilio client."""
|
66
62
|
if self._client is None:
|
@@ -70,25 +66,25 @@ class TwilioService(BaseCfgModule):
|
|
70
66
|
config.account_sid,
|
71
67
|
config.auth_token.get_secret_value()
|
72
68
|
)
|
73
|
-
|
69
|
+
|
74
70
|
if config.debug_logging:
|
75
71
|
logger.info(f"Twilio client initialized for account: {config.account_sid[:8]}...")
|
76
|
-
|
72
|
+
|
77
73
|
except Exception as e:
|
78
74
|
raise TwilioConfigurationError(
|
79
75
|
f"Failed to initialize Twilio client: {str(e)}",
|
80
76
|
context={"account_sid": config.account_sid[:8] + "..."},
|
81
77
|
suggestions=["Verify your Twilio credentials"]
|
82
78
|
)
|
83
|
-
|
79
|
+
|
84
80
|
return self._client
|
85
|
-
|
81
|
+
|
86
82
|
# === WhatsApp Methods ===
|
87
|
-
|
83
|
+
|
88
84
|
def send_whatsapp_message(
|
89
|
-
self,
|
90
|
-
to: str,
|
91
|
-
body: str,
|
85
|
+
self,
|
86
|
+
to: str,
|
87
|
+
body: str,
|
92
88
|
from_number: Optional[str] = None
|
93
89
|
) -> Dict[str, Any]:
|
94
90
|
"""
|
@@ -105,11 +101,11 @@ class TwilioService(BaseCfgModule):
|
|
105
101
|
try:
|
106
102
|
client = self.get_client()
|
107
103
|
config = self.get_config()
|
108
|
-
|
104
|
+
|
109
105
|
# Ensure to number has whatsapp prefix
|
110
106
|
if not to.startswith('whatsapp:'):
|
111
107
|
to = f'whatsapp:{to}'
|
112
|
-
|
108
|
+
|
113
109
|
# Use default from number if not provided
|
114
110
|
if not from_number:
|
115
111
|
if config.whatsapp_from:
|
@@ -118,17 +114,17 @@ class TwilioService(BaseCfgModule):
|
|
118
114
|
from_number = 'whatsapp:+14155238886' # Twilio sandbox fallback
|
119
115
|
elif not from_number.startswith('whatsapp:'):
|
120
116
|
from_number = f'whatsapp:{from_number}'
|
121
|
-
|
117
|
+
|
122
118
|
if config.debug_logging:
|
123
119
|
logger.info(f"Sending WhatsApp message to {to[:15]}...")
|
124
|
-
|
120
|
+
|
125
121
|
# Send message
|
126
122
|
message = client.messages.create(
|
127
123
|
to=to,
|
128
124
|
from_=from_number,
|
129
125
|
body=body
|
130
126
|
)
|
131
|
-
|
127
|
+
|
132
128
|
result = {
|
133
129
|
'sid': message.sid,
|
134
130
|
'status': message.status,
|
@@ -139,12 +135,12 @@ class TwilioService(BaseCfgModule):
|
|
139
135
|
'price': message.price,
|
140
136
|
'price_unit': message.price_unit,
|
141
137
|
}
|
142
|
-
|
138
|
+
|
143
139
|
if config.debug_logging:
|
144
140
|
logger.info(f"WhatsApp message sent successfully: {message.sid}")
|
145
|
-
|
141
|
+
|
146
142
|
return result
|
147
|
-
|
143
|
+
|
148
144
|
except TwilioException as e:
|
149
145
|
logger.error(f"Twilio API error: {e}")
|
150
146
|
raise TwilioSendError(
|
@@ -159,13 +155,13 @@ class TwilioService(BaseCfgModule):
|
|
159
155
|
except Exception as e:
|
160
156
|
logger.error(f"Unexpected error sending WhatsApp message: {e}")
|
161
157
|
raise TwilioSendError(f"Unexpected error: {str(e)}")
|
162
|
-
|
158
|
+
|
163
159
|
# === SMS Methods ===
|
164
|
-
|
160
|
+
|
165
161
|
def send_sms_message(
|
166
|
-
self,
|
167
|
-
to: str,
|
168
|
-
body: str,
|
162
|
+
self,
|
163
|
+
to: str,
|
164
|
+
body: str,
|
169
165
|
from_number: Optional[str] = None
|
170
166
|
) -> Dict[str, Any]:
|
171
167
|
"""
|
@@ -182,7 +178,7 @@ class TwilioService(BaseCfgModule):
|
|
182
178
|
try:
|
183
179
|
client = self.get_client()
|
184
180
|
config = self.get_config()
|
185
|
-
|
181
|
+
|
186
182
|
# Use default from number if not provided
|
187
183
|
if not from_number:
|
188
184
|
if config.sms_from:
|
@@ -193,17 +189,17 @@ class TwilioService(BaseCfgModule):
|
|
193
189
|
missing_fields=["sms_from"],
|
194
190
|
suggestions=["Set sms_from in your TwilioConfig"]
|
195
191
|
)
|
196
|
-
|
192
|
+
|
197
193
|
if config.debug_logging:
|
198
194
|
logger.info(f"Sending SMS to {to[:10]}...")
|
199
|
-
|
195
|
+
|
200
196
|
# Send message
|
201
197
|
message = client.messages.create(
|
202
198
|
to=to,
|
203
199
|
from_=from_number,
|
204
200
|
body=body
|
205
201
|
)
|
206
|
-
|
202
|
+
|
207
203
|
result = {
|
208
204
|
'sid': message.sid,
|
209
205
|
'status': message.status,
|
@@ -214,12 +210,12 @@ class TwilioService(BaseCfgModule):
|
|
214
210
|
'price': message.price,
|
215
211
|
'price_unit': message.price_unit,
|
216
212
|
}
|
217
|
-
|
213
|
+
|
218
214
|
if config.debug_logging:
|
219
215
|
logger.info(f"SMS sent successfully: {message.sid}")
|
220
|
-
|
216
|
+
|
221
217
|
return result
|
222
|
-
|
218
|
+
|
223
219
|
except TwilioException as e:
|
224
220
|
logger.error(f"Twilio API error: {e}")
|
225
221
|
raise TwilioSendError(
|
@@ -234,9 +230,9 @@ class TwilioService(BaseCfgModule):
|
|
234
230
|
except Exception as e:
|
235
231
|
logger.error(f"Unexpected error sending SMS: {e}")
|
236
232
|
raise TwilioSendError(f"Unexpected error: {str(e)}")
|
237
|
-
|
233
|
+
|
238
234
|
# === OTP Methods (Twilio Verify API) ===
|
239
|
-
|
235
|
+
|
240
236
|
def send_whatsapp_otp_hybrid(self, phone_number: str, otp_code: str, fallback_to_sms: bool = True) -> Tuple[bool, str]:
|
241
237
|
"""
|
242
238
|
HYBRID APPROACH: Send OTP via Direct WhatsApp first, then fallback to Verify API.
|
@@ -252,13 +248,13 @@ class TwilioService(BaseCfgModule):
|
|
252
248
|
success = False
|
253
249
|
final_message = ""
|
254
250
|
method_used = ""
|
255
|
-
|
251
|
+
|
256
252
|
# STEP 1: Try Direct WhatsApp with custom OTP
|
257
253
|
try:
|
258
254
|
from django_cfg.core.state import get_current_config
|
259
255
|
django_config = get_current_config()
|
260
256
|
site_name = django_config.project_name if django_config else "Django CFG"
|
261
|
-
|
257
|
+
|
262
258
|
# Create beautiful WhatsApp message
|
263
259
|
whatsapp_message = f"""🔐 *{site_name} Verification*
|
264
260
|
|
@@ -268,43 +264,43 @@ Your verification code: *{otp_code}*
|
|
268
264
|
🔒 Keep this code secure
|
269
265
|
|
270
266
|
_Powered by {site_name}_"""
|
271
|
-
|
267
|
+
|
272
268
|
logger.info(f"🎯 Attempting Direct WhatsApp OTP to {self._mask_phone(phone_number)}...")
|
273
269
|
result = self.send_whatsapp_message(phone_number, whatsapp_message)
|
274
|
-
|
270
|
+
|
275
271
|
if result.get('sid'): # If we got a message SID, it was sent successfully
|
276
272
|
success = True
|
277
273
|
method_used = "Direct WhatsApp"
|
278
274
|
final_message = f"OTP sent via WhatsApp to {self._mask_phone(phone_number)}"
|
279
275
|
logger.info(f"✅ Direct WhatsApp OTP sent successfully: {result.get('sid', 'N/A')}")
|
280
276
|
else:
|
281
|
-
logger.warning(
|
282
|
-
|
277
|
+
logger.warning("❌ Direct WhatsApp failed: No SID returned")
|
278
|
+
|
283
279
|
except Exception as e:
|
284
280
|
logger.warning(f"❌ Direct WhatsApp error: {e}")
|
285
|
-
|
281
|
+
|
286
282
|
# STEP 2: Fallback to Verify API if Direct WhatsApp failed
|
287
283
|
if not success:
|
288
284
|
try:
|
289
285
|
logger.info(f"🔄 Fallback: Trying Verify API for {self._mask_phone(phone_number)}...")
|
290
286
|
verify_success, verify_message = self.send_whatsapp_otp_verify(phone_number, fallback_to_sms)
|
291
|
-
|
287
|
+
|
292
288
|
if verify_success:
|
293
289
|
success = True
|
294
290
|
method_used = "Verify API"
|
295
291
|
final_message = verify_message
|
296
|
-
logger.info(
|
292
|
+
logger.info("✅ Verify API fallback successful")
|
297
293
|
else:
|
298
294
|
logger.error(f"❌ Verify API fallback failed: {verify_message}")
|
299
|
-
|
295
|
+
|
300
296
|
except Exception as e:
|
301
297
|
logger.error(f"❌ Verify API fallback error: {e}")
|
302
|
-
|
298
|
+
|
303
299
|
# STEP 3: Final check
|
304
300
|
if not success:
|
305
301
|
logger.error(f"❌ All WhatsApp methods failed for {self._mask_phone(phone_number)}")
|
306
302
|
return False, "All WhatsApp delivery methods failed"
|
307
|
-
|
303
|
+
|
308
304
|
logger.info(f"🎉 Phone OTP sent via {method_used} to {self._mask_phone(phone_number)}")
|
309
305
|
return True, f"{final_message} ({method_used})"
|
310
306
|
|
@@ -320,16 +316,16 @@ _Powered by {site_name}_"""
|
|
320
316
|
Tuple[bool, str]: (success, message)
|
321
317
|
"""
|
322
318
|
config = self.get_config()
|
323
|
-
|
319
|
+
|
324
320
|
if not config.verify:
|
325
321
|
raise TwilioConfigurationError(
|
326
322
|
"Twilio Verify service not configured",
|
327
323
|
missing_fields=["verify"],
|
328
324
|
suggestions=["Configure TwilioVerifyConfig in your Twilio settings"]
|
329
325
|
)
|
330
|
-
|
326
|
+
|
331
327
|
client = self.get_client()
|
332
|
-
|
328
|
+
|
333
329
|
try:
|
334
330
|
# Try WhatsApp first
|
335
331
|
logger.info(f"🚀 Sending WhatsApp OTP to {self._mask_phone(phone_number)} via Verify API")
|
@@ -339,29 +335,29 @@ _Powered by {site_name}_"""
|
|
339
335
|
to=phone_number,
|
340
336
|
channel='whatsapp'
|
341
337
|
)
|
342
|
-
|
338
|
+
|
343
339
|
# Log detailed Twilio response
|
344
340
|
logger.info(f"📱 Twilio Verify Response: status={verification.status}, sid={verification.sid}, channel={verification.channel}, to={verification.to}")
|
345
|
-
|
341
|
+
|
346
342
|
if verification.status == 'pending':
|
347
343
|
logger.info(f"✅ WhatsApp OTP sent successfully to {self._mask_phone(phone_number)}")
|
348
344
|
return True, f"OTP sent via WhatsApp to {self._mask_phone(phone_number)}"
|
349
|
-
|
345
|
+
|
350
346
|
# If WhatsApp failed and fallback is enabled, try SMS
|
351
347
|
if fallback_to_sms and verification.status != 'pending':
|
352
348
|
logger.warning(f"WhatsApp failed for {self._mask_phone(phone_number)}, trying SMS fallback")
|
353
349
|
return self.send_sms_otp(phone_number)
|
354
|
-
|
350
|
+
|
355
351
|
raise TwilioSendError(
|
356
352
|
f"WhatsApp OTP failed with status: {verification.status}",
|
357
353
|
context={'phone': phone_number, 'status': verification.status}
|
358
354
|
)
|
359
|
-
|
355
|
+
|
360
356
|
except TwilioException as e:
|
361
357
|
if fallback_to_sms:
|
362
358
|
logger.warning(f"WhatsApp error for {self._mask_phone(phone_number)}: {e}, trying SMS")
|
363
359
|
return self.send_sms_otp(phone_number)
|
364
|
-
|
360
|
+
|
365
361
|
raise TwilioSendError(
|
366
362
|
f"WhatsApp OTP failed: {e}",
|
367
363
|
context={
|
@@ -370,7 +366,7 @@ _Powered by {site_name}_"""
|
|
370
366
|
'error_message': str(e)
|
371
367
|
}
|
372
368
|
) from e
|
373
|
-
|
369
|
+
|
374
370
|
def send_sms_otp(self, phone_number: str) -> Tuple[bool, str]:
|
375
371
|
"""
|
376
372
|
Send OTP via SMS using Twilio Verify API.
|
@@ -382,16 +378,16 @@ _Powered by {site_name}_"""
|
|
382
378
|
Tuple[bool, str]: (success, message)
|
383
379
|
"""
|
384
380
|
config = self.get_config()
|
385
|
-
|
381
|
+
|
386
382
|
if not config.verify:
|
387
383
|
raise TwilioConfigurationError(
|
388
384
|
"Twilio Verify service not configured",
|
389
385
|
missing_fields=["verify"],
|
390
386
|
suggestions=["Configure TwilioVerifyConfig in your Twilio settings"]
|
391
387
|
)
|
392
|
-
|
388
|
+
|
393
389
|
client = self.get_client()
|
394
|
-
|
390
|
+
|
395
391
|
try:
|
396
392
|
logger.info(f"📱 Sending SMS OTP to {self._mask_phone(phone_number)} via Verify API")
|
397
393
|
verification = client.verify.v2.services(
|
@@ -400,10 +396,10 @@ _Powered by {site_name}_"""
|
|
400
396
|
to=phone_number,
|
401
397
|
channel='sms'
|
402
398
|
)
|
403
|
-
|
399
|
+
|
404
400
|
# Log detailed Twilio response
|
405
401
|
logger.info(f"📱 Twilio SMS Response: status={verification.status}, sid={verification.sid}, channel={verification.channel}, to={verification.to}")
|
406
|
-
|
402
|
+
|
407
403
|
if verification.status == 'pending':
|
408
404
|
logger.info(f"✅ SMS OTP sent successfully to {self._mask_phone(phone_number)}")
|
409
405
|
return True, f"OTP sent via SMS to {self._mask_phone(phone_number)}"
|
@@ -412,7 +408,7 @@ _Powered by {site_name}_"""
|
|
412
408
|
f"SMS OTP failed with status: {verification.status}",
|
413
409
|
context={'phone': phone_number, 'status': verification.status}
|
414
410
|
)
|
415
|
-
|
411
|
+
|
416
412
|
except TwilioException as e:
|
417
413
|
raise TwilioSendError(
|
418
414
|
f"SMS OTP failed: {e}",
|
@@ -422,7 +418,7 @@ _Powered by {site_name}_"""
|
|
422
418
|
'error_message': str(e)
|
423
419
|
}
|
424
420
|
) from e
|
425
|
-
|
421
|
+
|
426
422
|
def verify_otp(self, phone_number: str, code: str) -> Tuple[bool, str]:
|
427
423
|
"""
|
428
424
|
Verify OTP code using Twilio Verify API.
|
@@ -435,26 +431,26 @@ _Powered by {site_name}_"""
|
|
435
431
|
Tuple[bool, str]: (is_valid, message)
|
436
432
|
"""
|
437
433
|
config = self.get_config()
|
438
|
-
|
434
|
+
|
439
435
|
if not config.verify:
|
440
436
|
raise TwilioConfigurationError("Twilio Verify service not configured")
|
441
|
-
|
437
|
+
|
442
438
|
try:
|
443
439
|
client = self.get_client()
|
444
|
-
|
440
|
+
|
445
441
|
verification_check = client.verify.v2.services(
|
446
442
|
config.verify.service_sid
|
447
443
|
).verification_checks.create(
|
448
444
|
to=phone_number,
|
449
445
|
code=code
|
450
446
|
)
|
451
|
-
|
447
|
+
|
452
448
|
if verification_check.status == 'approved':
|
453
449
|
logger.info(f"OTP verified successfully for {self._mask_phone(phone_number)}")
|
454
450
|
return True, "OTP verified successfully"
|
455
451
|
else:
|
456
452
|
return False, f"Invalid OTP code: {verification_check.status}"
|
457
|
-
|
453
|
+
|
458
454
|
except TwilioException as e:
|
459
455
|
raise TwilioSendError(
|
460
456
|
f"OTP verification failed: {e}",
|
@@ -464,13 +460,13 @@ _Powered by {site_name}_"""
|
|
464
460
|
'error_message': str(e)
|
465
461
|
}
|
466
462
|
) from e
|
467
|
-
|
463
|
+
|
468
464
|
# === Utility Methods ===
|
469
|
-
|
465
|
+
|
470
466
|
def _mask_phone(self, phone: str) -> str:
|
471
467
|
"""Mask phone number for security in logs."""
|
472
468
|
return f"***{phone[-4:]}" if len(phone) > 4 else "***"
|
473
|
-
|
469
|
+
|
474
470
|
def get_message_status(self, message_sid: str) -> Dict[str, Any]:
|
475
471
|
"""
|
476
472
|
Get status of a sent message.
|
@@ -484,7 +480,7 @@ _Powered by {site_name}_"""
|
|
484
480
|
try:
|
485
481
|
client = self.get_client()
|
486
482
|
message = client.messages(message_sid).fetch()
|
487
|
-
|
483
|
+
|
488
484
|
return {
|
489
485
|
'sid': message.sid,
|
490
486
|
'status': message.status,
|
@@ -499,7 +495,7 @@ _Powered by {site_name}_"""
|
|
499
495
|
'error_code': message.error_code,
|
500
496
|
'error_message': message.error_message,
|
501
497
|
}
|
502
|
-
|
498
|
+
|
503
499
|
except TwilioException as e:
|
504
500
|
raise TwilioSendError(f"Failed to get message status: {str(e)}")
|
505
501
|
|
@@ -6,20 +6,21 @@ configuration and delivery success rates.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import logging
|
9
|
-
from typing import Tuple, Optional, List, Dict, Any
|
10
9
|
from datetime import datetime
|
10
|
+
from typing import Any, Dict, List, Optional, Tuple
|
11
|
+
|
11
12
|
from asgiref.sync import sync_to_async
|
12
13
|
|
13
14
|
from .base import BaseTwilioService
|
14
|
-
from .whatsapp import WhatsAppOTPService
|
15
15
|
from .email_otp import EmailOTPService
|
16
|
-
from .sms import SMSOTPService
|
17
|
-
from .models import TwilioConfig, TwilioChannelType
|
18
16
|
from .exceptions import (
|
19
17
|
TwilioConfigurationError,
|
20
18
|
TwilioSendError,
|
21
19
|
TwilioVerificationError,
|
22
20
|
)
|
21
|
+
from .models import TwilioChannelType, TwilioConfig
|
22
|
+
from .sms import SMSOTPService
|
23
|
+
from .whatsapp import WhatsAppOTPService
|
23
24
|
|
24
25
|
logger = logging.getLogger(__name__)
|
25
26
|
|
@@ -120,7 +121,7 @@ class UnifiedOTPService(BaseTwilioService):
|
|
120
121
|
config = self.get_twilio_config()
|
121
122
|
|
122
123
|
# For Twilio Verify channels (WhatsApp, SMS), use Twilio verification
|
123
|
-
if
|
124
|
+
if "@" not in identifier and config.verify:
|
124
125
|
return self._verify_twilio_otp(identifier, code, config)
|
125
126
|
|
126
127
|
# For email or custom verification, use stored OTP
|
@@ -5,13 +5,12 @@ Provides simple function-based API for sending and verifying OTPs
|
|
5
5
|
without manually instantiating service classes.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from typing import
|
8
|
+
from typing import Optional, Tuple
|
9
9
|
|
10
|
-
from .whatsapp import WhatsAppOTPService
|
11
10
|
from .email_otp import EmailOTPService
|
12
11
|
from .sms import SMSOTPService
|
13
12
|
from .unified import UnifiedOTPService
|
14
|
-
|
13
|
+
from .whatsapp import WhatsAppOTPService
|
15
14
|
|
16
15
|
# Sync convenience functions
|
17
16
|
|
@@ -7,15 +7,16 @@ Supports both sync and async operations.
|
|
7
7
|
|
8
8
|
import logging
|
9
9
|
from typing import Tuple
|
10
|
-
|
10
|
+
|
11
11
|
from asgiref.sync import sync_to_async
|
12
12
|
|
13
|
+
from ._imports import Client, TwilioException
|
13
14
|
from .base import BaseTwilioService
|
14
|
-
from .models import TwilioVerifyConfig
|
15
15
|
from .exceptions import (
|
16
16
|
TwilioConfigurationError,
|
17
17
|
TwilioSendError,
|
18
18
|
)
|
19
|
+
from .models import TwilioVerifyConfig
|
19
20
|
|
20
21
|
logger = logging.getLogger(__name__)
|
21
22
|
|
@@ -5,11 +5,12 @@ Provides complete Unfold admin interface integration with dashboard,
|
|
5
5
|
navigation, theming, and callback support.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from .dashboard import DashboardManager, get_dashboard_manager
|
9
8
|
from .callbacks import UnfoldCallbacks
|
10
|
-
from .
|
11
|
-
from .tailwind import get_unfold_colors, get_css_variables
|
9
|
+
from .dashboard import DashboardManager, get_dashboard_manager
|
12
10
|
from .models import *
|
11
|
+
from .system_monitor import SystemMonitor
|
12
|
+
from .tailwind import get_css_variables, get_unfold_colors
|
13
|
+
|
13
14
|
|
14
15
|
# Lazy initialization functions to avoid circular imports
|
15
16
|
def get_system_monitor() -> SystemMonitor:
|
@@ -30,7 +31,7 @@ def get_unfold_callbacks() -> UnfoldCallbacks:
|
|
30
31
|
__all__ = [
|
31
32
|
'DashboardManager',
|
32
33
|
'get_dashboard_manager',
|
33
|
-
'UnfoldCallbacks',
|
34
|
+
'UnfoldCallbacks',
|
34
35
|
'get_unfold_callbacks',
|
35
36
|
'SystemMonitor',
|
36
37
|
'get_system_monitor',
|
@@ -38,7 +39,7 @@ __all__ = [
|
|
38
39
|
'get_css_variables',
|
39
40
|
# Models
|
40
41
|
'UnfoldConfig',
|
41
|
-
'UnfoldTheme',
|
42
|
+
'UnfoldTheme',
|
42
43
|
'UnfoldColors',
|
43
44
|
'UnfoldSidebar',
|
44
45
|
'UnfoldThemeConfig',
|
@@ -66,4 +67,4 @@ __email__ = 'team@djangocfg.com'
|
|
66
67
|
# Module metadata
|
67
68
|
__title__ = 'Django CFG Unfold'
|
68
69
|
__description__ = 'Complete Unfold admin interface integration'
|
69
|
-
__url__ = 'https://github.com/djangocfg/django-cfg'
|
70
|
+
__url__ = 'https://github.com/djangocfg/django-cfg'
|
@@ -5,8 +5,9 @@ Quick actions callbacks.
|
|
5
5
|
import logging
|
6
6
|
from typing import List
|
7
7
|
|
8
|
-
from ..models.dashboard import QuickAction
|
9
8
|
from django_cfg.modules.django_admin.icons import Icons
|
9
|
+
|
10
|
+
from ..models.dashboard import QuickAction
|
10
11
|
from .base import get_user_admin_urls
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
@@ -14,12 +15,12 @@ logger = logging.getLogger(__name__)
|
|
14
15
|
|
15
16
|
class ActionsCallbacks:
|
16
17
|
"""Quick actions callbacks."""
|
17
|
-
|
18
|
+
|
18
19
|
def get_quick_actions(self) -> List[QuickAction]:
|
19
20
|
"""Get quick action buttons as Pydantic models."""
|
20
21
|
# Get user admin URLs dynamically based on AUTH_USER_MODEL
|
21
22
|
user_admin_urls = get_user_admin_urls()
|
22
|
-
|
23
|
+
|
23
24
|
actions = [
|
24
25
|
QuickAction(
|
25
26
|
title="Add User",
|
@@ -45,6 +46,6 @@ class ActionsCallbacks:
|
|
45
46
|
color="success",
|
46
47
|
category="system",
|
47
48
|
),
|
48
|
-
]
|
49
|
-
|
49
|
+
]
|
50
|
+
|
50
51
|
return actions
|