django-cfg 1.4.20__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/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- 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 +35 -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 +36 -35
- 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 +12 -13
- 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.20.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.20.dist-info/RECORD +0 -1110
- /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.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -3,12 +3,12 @@ User Account Notification System
|
|
3
3
|
Centralized email and telegram notifications for user account events
|
4
4
|
"""
|
5
5
|
import logging
|
6
|
+
|
6
7
|
from django.utils import timezone
|
7
|
-
|
8
|
-
from django_cfg.modules.django_telegram import DjangoTelegram
|
9
|
-
from django_cfg.modules.django_email import DjangoEmailService
|
10
|
-
from django_cfg.modules.django_twilio import SimpleTwilioService
|
8
|
+
|
11
9
|
from django_cfg.core.state import get_current_config
|
10
|
+
from django_cfg.modules.django_email import DjangoEmailService
|
11
|
+
from django_cfg.modules.django_telegram import DjangoTelegram
|
12
12
|
|
13
13
|
# Get config once
|
14
14
|
config = get_current_config()
|
@@ -17,9 +17,9 @@ logger = logging.getLogger(__name__)
|
|
17
17
|
|
18
18
|
class AccountNotifications:
|
19
19
|
"""Centralized account notification system"""
|
20
|
-
|
20
|
+
|
21
21
|
# === PRIVATE EMAIL METHODS ===
|
22
|
-
|
22
|
+
|
23
23
|
@staticmethod
|
24
24
|
def _send_email(
|
25
25
|
user,
|
@@ -51,9 +51,9 @@ class AccountNotifications:
|
|
51
51
|
context=context,
|
52
52
|
recipient_list=[user.email],
|
53
53
|
)
|
54
|
-
|
54
|
+
|
55
55
|
# === EMAIL NOTIFICATIONS ===
|
56
|
-
|
56
|
+
|
57
57
|
@staticmethod
|
58
58
|
def send_welcome_email(user, send_email=True, send_telegram=True):
|
59
59
|
"""Send welcome email and telegram notification for new user"""
|
@@ -81,7 +81,7 @@ class AccountNotifications:
|
|
81
81
|
}
|
82
82
|
)
|
83
83
|
logger.info(f"Welcome telegram notification sent for {user.email}")
|
84
|
-
|
84
|
+
|
85
85
|
@staticmethod
|
86
86
|
def send_profile_update_notification(user, changes, send_email=True, send_telegram=True):
|
87
87
|
"""Send profile update notification"""
|
@@ -93,7 +93,7 @@ class AccountNotifications:
|
|
93
93
|
if send_email:
|
94
94
|
AccountNotifications._send_email(
|
95
95
|
user=user,
|
96
|
-
subject=
|
96
|
+
subject="Security Alert: Profile Updated ⚠️",
|
97
97
|
main_text="A security alert has been triggered for your account.",
|
98
98
|
main_html_content='<p style="font-size: 1.5em; font-weight: bold; color: #dc3545;">Profile Updated</p>',
|
99
99
|
secondary_text=f"Details: Your {change_text} has been updated. If this wasn't you, please contact support immediately.",
|
@@ -112,7 +112,7 @@ class AccountNotifications:
|
|
112
112
|
}
|
113
113
|
)
|
114
114
|
logger.info(f"Profile update telegram notification sent for {user.email}")
|
115
|
-
|
115
|
+
|
116
116
|
@staticmethod
|
117
117
|
def send_account_status_change(user, status_type, reason=None, send_email=True, send_telegram=True):
|
118
118
|
"""Send account status change notification (activated/deactivated)"""
|
@@ -160,7 +160,7 @@ class AccountNotifications:
|
|
160
160
|
DjangoTelegram.send_warning(title, data)
|
161
161
|
|
162
162
|
logger.info(f"Account status change telegram notification sent for {user.email}")
|
163
|
-
|
163
|
+
|
164
164
|
@staticmethod
|
165
165
|
def send_login_notification(user, ip_address=None, send_email=False, send_telegram=True):
|
166
166
|
"""Send login notification (usually only telegram for security monitoring)"""
|
@@ -189,7 +189,7 @@ class AccountNotifications:
|
|
189
189
|
}
|
190
190
|
)
|
191
191
|
logger.info(f"Login telegram notification sent for {user.email}")
|
192
|
-
|
192
|
+
|
193
193
|
@staticmethod
|
194
194
|
def send_otp_notification(user, otp_code, is_new_user=False, source_url=None, channel='email', send_email=True, send_telegram=True):
|
195
195
|
"""Send OTP notification via email"""
|
@@ -222,7 +222,7 @@ class AccountNotifications:
|
|
222
222
|
DjangoTelegram.send_info("🔑 OTP Login Request", notification_data)
|
223
223
|
|
224
224
|
logger.info(f"OTP telegram notification sent for {user.email}")
|
225
|
-
|
225
|
+
|
226
226
|
@staticmethod
|
227
227
|
def send_phone_otp_notification(user, otp_code, phone_number, is_new_user=False, source_url=None):
|
228
228
|
"""Send OTP notification via SMS to client and system notification to Telegram"""
|
@@ -257,7 +257,7 @@ class AccountNotifications:
|
|
257
257
|
DjangoTelegram.send_info("🔑📱 Phone OTP Login Request", notification_data)
|
258
258
|
|
259
259
|
logger.info(f"Phone OTP system notification sent to Telegram for {phone_number}")
|
260
|
-
|
260
|
+
|
261
261
|
@staticmethod
|
262
262
|
def send_otp_verification_success(user, source_url=None, send_telegram=True):
|
263
263
|
"""Send successful OTP verification notification"""
|
@@ -272,9 +272,9 @@ class AccountNotifications:
|
|
272
272
|
|
273
273
|
DjangoTelegram.send_success("✅ Successful OTP Login", verification_data)
|
274
274
|
logger.info(f"OTP verification telegram notification sent for {user.email}")
|
275
|
-
|
275
|
+
|
276
276
|
# === SECURITY NOTIFICATIONS ===
|
277
|
-
|
277
|
+
|
278
278
|
@staticmethod
|
279
279
|
def send_security_alert(user, alert_type, details, send_email=True, send_telegram=True):
|
280
280
|
"""Send security alert notification"""
|
@@ -300,7 +300,7 @@ class AccountNotifications:
|
|
300
300
|
|
301
301
|
DjangoTelegram.send_warning(f"🚨 Security Alert: {alert_type}", alert_data)
|
302
302
|
logger.info(f"Security alert telegram notification sent for {user.email}")
|
303
|
-
|
303
|
+
|
304
304
|
@staticmethod
|
305
305
|
def send_failed_otp_attempt(identifier, channel='email', ip_address=None, reason="Invalid OTP", send_telegram=True):
|
306
306
|
"""Send notification about failed OTP attempt"""
|
@@ -316,7 +316,7 @@ class AccountNotifications:
|
|
316
316
|
channel_emoji = "📧" if channel == 'email' else "📱"
|
317
317
|
DjangoTelegram.send_warning(f"❌ Failed {channel.title()} OTP Attempt {channel_emoji}", details)
|
318
318
|
logger.info(f"Failed OTP attempt telegram notification sent for {identifier} ({channel})")
|
319
|
-
|
319
|
+
|
320
320
|
@staticmethod
|
321
321
|
def send_suspicious_activity(user, activity_type, details, send_email=True, send_telegram=True):
|
322
322
|
"""Send suspicious activity notification"""
|
@@ -344,9 +344,9 @@ class AccountNotifications:
|
|
344
344
|
|
345
345
|
DjangoTelegram.send_error(f"🚨 Suspicious Activity: {activity_type}", alert_data)
|
346
346
|
logger.info(f"Suspicious activity telegram notification sent for {user.email}")
|
347
|
-
|
347
|
+
|
348
348
|
# === ADMIN NOTIFICATIONS ===
|
349
|
-
|
349
|
+
|
350
350
|
@staticmethod
|
351
351
|
def send_admin_user_created(user, created_by=None, send_telegram=True):
|
352
352
|
"""Send notification when admin creates user"""
|
@@ -363,7 +363,7 @@ class AccountNotifications:
|
|
363
363
|
|
364
364
|
DjangoTelegram.send_info("👨💼 Admin Created User", data)
|
365
365
|
logger.info(f"Admin user creation telegram notification sent for {user.email}")
|
366
|
-
|
366
|
+
|
367
367
|
@staticmethod
|
368
368
|
def send_bulk_operation_notification(operation_type, count, details=None, send_telegram=True):
|
369
369
|
"""Send notification about bulk operations"""
|
@@ -1,21 +1,22 @@
|
|
1
|
-
from rest_framework import status, permissions, viewsets
|
2
|
-
from rest_framework.response import Response
|
3
|
-
from rest_framework_simplejwt.tokens import RefreshToken
|
4
|
-
from rest_framework.decorators import action
|
5
|
-
from drf_spectacular.utils import extend_schema
|
6
1
|
import logging
|
7
2
|
import traceback
|
8
3
|
|
9
|
-
from
|
4
|
+
from django.contrib.auth import get_user_model
|
5
|
+
from drf_spectacular.utils import extend_schema
|
6
|
+
from rest_framework import permissions, status, viewsets
|
7
|
+
from rest_framework.decorators import action
|
8
|
+
from rest_framework.response import Response
|
9
|
+
from rest_framework_simplejwt.tokens import RefreshToken
|
10
|
+
|
10
11
|
from ..serializers.otp import (
|
11
|
-
|
12
|
-
OTPVerifySerializer,
|
12
|
+
OTPErrorResponseSerializer,
|
13
13
|
OTPRequestResponseSerializer,
|
14
|
+
OTPRequestSerializer,
|
14
15
|
OTPVerifyResponseSerializer,
|
15
|
-
|
16
|
+
OTPVerifySerializer,
|
16
17
|
)
|
17
18
|
from ..serializers.profile import UserSerializer
|
18
|
-
from
|
19
|
+
from ..services import OTPService
|
19
20
|
|
20
21
|
logger = logging.getLogger(__name__)
|
21
22
|
|
@@ -25,7 +26,7 @@ class OTPViewSet(viewsets.GenericViewSet):
|
|
25
26
|
|
26
27
|
permission_classes = [permissions.AllowAny]
|
27
28
|
serializer_class = OTPRequestSerializer # Default serializer for the viewset
|
28
|
-
|
29
|
+
|
29
30
|
def get_serializer_class(self):
|
30
31
|
"""Return the appropriate serializer class based on the action."""
|
31
32
|
if self.action == 'request_otp':
|
@@ -51,11 +52,11 @@ class OTPViewSet(viewsets.GenericViewSet):
|
|
51
52
|
identifier = serializer.validated_data["identifier"]
|
52
53
|
channel = serializer.validated_data.get("channel")
|
53
54
|
source_url = serializer.validated_data.get("source_url")
|
54
|
-
|
55
|
+
|
55
56
|
# Auto-detect channel if not provided
|
56
57
|
if not channel:
|
57
58
|
channel = 'email' if '@' in identifier else 'phone'
|
58
|
-
|
59
|
+
|
59
60
|
logger.debug(f"Starting OTP request for {channel}: {identifier}, source: {source_url}")
|
60
61
|
|
61
62
|
try:
|
@@ -121,7 +122,7 @@ class OTPViewSet(viewsets.GenericViewSet):
|
|
121
122
|
otp = serializer.validated_data["otp"]
|
122
123
|
channel = serializer.validated_data.get("channel")
|
123
124
|
source_url = serializer.validated_data.get("source_url")
|
124
|
-
|
125
|
+
|
125
126
|
# Auto-detect channel if not provided
|
126
127
|
if not channel:
|
127
128
|
channel = 'email' if '@' in identifier else 'phone'
|
@@ -1,10 +1,14 @@
|
|
1
|
+
from django.contrib.auth import get_user_model
|
2
|
+
from drf_spectacular.utils import OpenApiExample, extend_schema
|
1
3
|
from rest_framework import generics, permissions, status
|
2
|
-
from rest_framework.response import Response
|
3
4
|
from rest_framework.decorators import api_view, permission_classes
|
4
|
-
from
|
5
|
-
from django.contrib.auth import get_user_model
|
5
|
+
from rest_framework.response import Response
|
6
6
|
|
7
|
-
from ..serializers.profile import
|
7
|
+
from ..serializers.profile import (
|
8
|
+
AvatarUploadSerializer,
|
9
|
+
UserProfileUpdateSerializer,
|
10
|
+
UserSerializer,
|
11
|
+
)
|
8
12
|
|
9
13
|
User = get_user_model()
|
10
14
|
|
@@ -141,21 +145,21 @@ def upload_avatar(request):
|
|
141
145
|
"""Upload avatar for current user."""
|
142
146
|
if 'avatar' not in request.FILES:
|
143
147
|
return Response(
|
144
|
-
{'error': 'No avatar file provided'},
|
148
|
+
{'error': 'No avatar file provided'},
|
145
149
|
status=status.HTTP_400_BAD_REQUEST
|
146
150
|
)
|
147
|
-
|
151
|
+
|
148
152
|
avatar_file = request.FILES['avatar']
|
149
153
|
user = request.user
|
150
|
-
|
154
|
+
|
151
155
|
# Validate file
|
152
156
|
serializer = AvatarUploadSerializer(user, data={'avatar': avatar_file}, partial=True)
|
153
157
|
if not serializer.is_valid():
|
154
158
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
155
|
-
|
159
|
+
|
156
160
|
# Save avatar
|
157
161
|
serializer.save()
|
158
|
-
|
162
|
+
|
159
163
|
# Return updated user data
|
160
164
|
user_serializer = UserSerializer(user)
|
161
|
-
return Response(user_serializer.data, status=status.HTTP_200_OK)
|
165
|
+
return Response(user_serializer.data, status=status.HTTP_200_OK)
|
@@ -5,23 +5,21 @@ Handles incoming webhooks from Twilio for status updates and delivery reports.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
|
9
|
-
import hmac
|
10
|
-
import base64
|
11
|
-
from urllib.parse import urljoin
|
8
|
+
|
12
9
|
from django.http import HttpResponse
|
10
|
+
from django.utils.decorators import method_decorator
|
13
11
|
from django.views.decorators.csrf import csrf_exempt
|
14
12
|
from django.views.decorators.http import require_POST
|
15
|
-
from django.utils.decorators import method_decorator
|
16
|
-
from rest_framework import status, permissions, viewsets
|
17
|
-
from rest_framework.response import Response
|
18
|
-
from rest_framework.decorators import action
|
19
|
-
from drf_spectacular.utils import extend_schema, OpenApiParameter
|
20
13
|
from drf_spectacular.types import OpenApiTypes
|
14
|
+
from drf_spectacular.utils import OpenApiParameter, extend_schema
|
15
|
+
from rest_framework import permissions, status, viewsets
|
16
|
+
from rest_framework.decorators import action
|
17
|
+
from rest_framework.response import Response
|
21
18
|
from twilio.request_validator import RequestValidator
|
22
19
|
|
23
20
|
from django_cfg.core.state import get_current_config
|
24
|
-
|
21
|
+
|
22
|
+
from ..models import TwilioResponse
|
25
23
|
from ..serializers.webhook import TwilioWebhookSerializer
|
26
24
|
|
27
25
|
logger = logging.getLogger(__name__)
|
@@ -36,10 +34,10 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
36
34
|
- Verification status updates (approved, canceled, etc.)
|
37
35
|
- Error notifications and delivery reports
|
38
36
|
"""
|
39
|
-
|
37
|
+
|
40
38
|
permission_classes = [permissions.AllowAny] # Twilio webhooks don't use standard auth
|
41
39
|
serializer_class = TwilioWebhookSerializer
|
42
|
-
|
40
|
+
|
43
41
|
def _validate_twilio_signature(self, request):
|
44
42
|
"""
|
45
43
|
Validate that the request came from Twilio by verifying the signature.
|
@@ -52,34 +50,34 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
52
50
|
if not config or not hasattr(config, 'twilio') or not config.twilio:
|
53
51
|
logger.warning("Twilio config not found - skipping signature validation")
|
54
52
|
return True # Allow in development if config is missing
|
55
|
-
|
53
|
+
|
56
54
|
auth_token = config.twilio.auth_token.get_secret_value()
|
57
55
|
validator = RequestValidator(auth_token)
|
58
|
-
|
56
|
+
|
59
57
|
# Get the signature from headers
|
60
58
|
signature = request.META.get('HTTP_X_TWILIO_SIGNATURE', '')
|
61
59
|
if not signature:
|
62
60
|
logger.warning("No Twilio signature found in headers")
|
63
61
|
return False
|
64
|
-
|
62
|
+
|
65
63
|
# Build the full URL
|
66
64
|
url = request.build_absolute_uri()
|
67
|
-
|
65
|
+
|
68
66
|
# Get POST data as dict
|
69
67
|
post_data = dict(request.POST.items())
|
70
|
-
|
68
|
+
|
71
69
|
# Validate the signature
|
72
70
|
is_valid = validator.validate(url, post_data, signature)
|
73
|
-
|
71
|
+
|
74
72
|
if not is_valid:
|
75
73
|
logger.warning(f"Invalid Twilio signature for URL: {url}")
|
76
|
-
|
74
|
+
|
77
75
|
return is_valid
|
78
|
-
|
76
|
+
|
79
77
|
except Exception as e:
|
80
78
|
logger.error(f"Error validating Twilio signature: {e}")
|
81
79
|
return False
|
82
|
-
|
80
|
+
|
83
81
|
@extend_schema(
|
84
82
|
summary="Twilio Message Status Webhook",
|
85
83
|
description="Receives status updates for SMS and WhatsApp messages from Twilio",
|
@@ -98,15 +96,15 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
98
96
|
@action(detail=False, methods=["post"], url_path="message-status")
|
99
97
|
def message_status(self, request):
|
100
98
|
"""Handle message status webhooks from Twilio."""
|
101
|
-
|
99
|
+
|
102
100
|
# Validate signature
|
103
101
|
if not self._validate_twilio_signature(request):
|
104
102
|
logger.warning("Invalid Twilio signature - rejecting webhook")
|
105
103
|
return Response(
|
106
|
-
{"error": "Invalid signature"},
|
104
|
+
{"error": "Invalid signature"},
|
107
105
|
status=status.HTTP_403_FORBIDDEN
|
108
106
|
)
|
109
|
-
|
107
|
+
|
110
108
|
# Parse webhook data
|
111
109
|
serializer = self.get_serializer(data=request.data)
|
112
110
|
if not serializer.is_valid():
|
@@ -115,17 +113,17 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
115
113
|
{"error": "Invalid webhook data", "details": serializer.errors},
|
116
114
|
status=status.HTTP_400_BAD_REQUEST
|
117
115
|
)
|
118
|
-
|
116
|
+
|
119
117
|
webhook_data = serializer.validated_data
|
120
118
|
message_sid = webhook_data.get('MessageSid') or webhook_data.get('message_sid')
|
121
|
-
|
119
|
+
|
122
120
|
if not message_sid:
|
123
121
|
logger.warning("No MessageSid found in webhook data")
|
124
122
|
return Response(
|
125
123
|
{"error": "MessageSid required"},
|
126
124
|
status=status.HTTP_400_BAD_REQUEST
|
127
125
|
)
|
128
|
-
|
126
|
+
|
129
127
|
try:
|
130
128
|
# Find existing TwilioResponse or create new one
|
131
129
|
twilio_response, created = TwilioResponse.objects.get_or_create(
|
@@ -141,7 +139,7 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
141
139
|
'response_data': webhook_data,
|
142
140
|
}
|
143
141
|
)
|
144
|
-
|
142
|
+
|
145
143
|
if not created:
|
146
144
|
# Update existing record
|
147
145
|
twilio_response.status = webhook_data.get('MessageStatus', twilio_response.status)
|
@@ -149,18 +147,18 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
149
147
|
twilio_response.error_message = webhook_data.get('ErrorMessage', twilio_response.error_message)
|
150
148
|
twilio_response.response_data.update(webhook_data)
|
151
149
|
twilio_response.save(update_fields=['status', 'error_code', 'error_message', 'response_data', 'updated_at'])
|
152
|
-
|
150
|
+
|
153
151
|
logger.info(f"Processed message status webhook for {message_sid}: {webhook_data.get('MessageStatus')}")
|
154
|
-
|
152
|
+
|
155
153
|
return Response({"status": "processed"}, status=status.HTTP_200_OK)
|
156
|
-
|
154
|
+
|
157
155
|
except Exception as e:
|
158
156
|
logger.error(f"Error processing message status webhook: {e}")
|
159
157
|
return Response(
|
160
158
|
{"error": "Internal server error"},
|
161
159
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
162
160
|
)
|
163
|
-
|
161
|
+
|
164
162
|
@extend_schema(
|
165
163
|
summary="Twilio Verification Status Webhook",
|
166
164
|
description="Receives status updates for Verify API verifications from Twilio",
|
@@ -171,14 +169,14 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
171
169
|
@action(detail=False, methods=["post"], url_path="verification-status")
|
172
170
|
def verification_status(self, request):
|
173
171
|
"""Handle verification status webhooks from Twilio Verify API."""
|
174
|
-
|
172
|
+
|
175
173
|
# Validate signature
|
176
174
|
if not self._validate_twilio_signature(request):
|
177
175
|
return Response(
|
178
|
-
{"error": "Invalid signature"},
|
176
|
+
{"error": "Invalid signature"},
|
179
177
|
status=status.HTTP_403_FORBIDDEN
|
180
178
|
)
|
181
|
-
|
179
|
+
|
182
180
|
# Parse webhook data
|
183
181
|
serializer = self.get_serializer(data=request.data)
|
184
182
|
if not serializer.is_valid():
|
@@ -186,16 +184,16 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
186
184
|
{"error": "Invalid webhook data", "details": serializer.errors},
|
187
185
|
status=status.HTTP_400_BAD_REQUEST
|
188
186
|
)
|
189
|
-
|
187
|
+
|
190
188
|
webhook_data = serializer.validated_data
|
191
189
|
verification_sid = webhook_data.get('VerificationSid') or webhook_data.get('verification_sid')
|
192
|
-
|
190
|
+
|
193
191
|
if not verification_sid:
|
194
192
|
return Response(
|
195
193
|
{"error": "VerificationSid required"},
|
196
194
|
status=status.HTTP_400_BAD_REQUEST
|
197
195
|
)
|
198
|
-
|
196
|
+
|
199
197
|
try:
|
200
198
|
# Find existing TwilioResponse or create new one
|
201
199
|
twilio_response, created = TwilioResponse.objects.get_or_create(
|
@@ -208,28 +206,28 @@ class TwilioWebhookViewSet(viewsets.GenericViewSet):
|
|
208
206
|
'response_data': webhook_data,
|
209
207
|
}
|
210
208
|
)
|
211
|
-
|
209
|
+
|
212
210
|
if not created:
|
213
211
|
# Update existing record
|
214
212
|
twilio_response.status = webhook_data.get('VerificationStatus', twilio_response.status)
|
215
213
|
twilio_response.response_data.update(webhook_data)
|
216
214
|
twilio_response.save(update_fields=['status', 'response_data', 'updated_at'])
|
217
|
-
|
215
|
+
|
218
216
|
logger.info(f"Processed verification status webhook for {verification_sid}: {webhook_data.get('VerificationStatus')}")
|
219
|
-
|
217
|
+
|
220
218
|
return Response({"status": "processed"}, status=status.HTTP_200_OK)
|
221
|
-
|
219
|
+
|
222
220
|
except Exception as e:
|
223
221
|
logger.error(f"Error processing verification status webhook: {e}")
|
224
222
|
return Response(
|
225
223
|
{"error": "Internal server error"},
|
226
224
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
227
225
|
)
|
228
|
-
|
226
|
+
|
229
227
|
def _detect_service_type(self, webhook_data):
|
230
228
|
"""Detect service type from webhook data."""
|
231
229
|
from_number = webhook_data.get('From', '')
|
232
|
-
|
230
|
+
|
233
231
|
if 'whatsapp:' in from_number:
|
234
232
|
return 'whatsapp'
|
235
233
|
elif webhook_data.get('VerificationSid'):
|
@@ -253,13 +251,13 @@ def twilio_webhook_legacy(request):
|
|
253
251
|
webhook_data = dict(request.POST.items())
|
254
252
|
message_sid = webhook_data.get('MessageSid')
|
255
253
|
status_value = webhook_data.get('MessageStatus')
|
256
|
-
|
254
|
+
|
257
255
|
logger.info(f"Legacy webhook received - MessageSid: {message_sid}, Status: {status_value}")
|
258
|
-
|
256
|
+
|
259
257
|
# You can add more processing here if needed
|
260
|
-
|
258
|
+
|
261
259
|
return HttpResponse("OK", status=200)
|
262
|
-
|
260
|
+
|
263
261
|
except Exception as e:
|
264
262
|
logger.error(f"Error in legacy webhook: {e}")
|
265
263
|
return HttpResponse("Error", status=500)
|
@@ -16,16 +16,16 @@ __all__ = [
|
|
16
16
|
"SimpleOrchestrator",
|
17
17
|
"DjangoDeps",
|
18
18
|
"RunContext",
|
19
|
-
|
19
|
+
|
20
20
|
# Models
|
21
21
|
"ExecutionResult",
|
22
22
|
"WorkflowConfig",
|
23
23
|
"ProcessResult",
|
24
24
|
"AnalysisResult",
|
25
|
-
|
25
|
+
|
26
26
|
# Exceptions
|
27
27
|
"AgentError",
|
28
|
-
"AgentNotFoundError",
|
28
|
+
"AgentNotFoundError",
|
29
29
|
"ExecutionError",
|
30
30
|
]
|
31
31
|
|
@@ -9,7 +9,7 @@ from django.contrib import admin
|
|
9
9
|
# Import all admin classes
|
10
10
|
from .execution_admin import AgentExecutionAdmin, WorkflowExecutionAdmin
|
11
11
|
from .registry_admin import AgentDefinitionAdmin, AgentTemplateAdmin
|
12
|
-
from .toolsets_admin import
|
12
|
+
from .toolsets_admin import ApprovalLogAdmin, ToolExecutionAdmin, ToolsetConfigurationAdmin
|
13
13
|
|
14
14
|
# All models are registered in their respective admin files using @admin.register
|
15
15
|
# This provides:
|