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
@@ -4,13 +4,15 @@ NowPayments currency synchronization service.
|
|
4
4
|
Handles syncing currencies from NowPayments API to database.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Optional, Tuple
|
7
|
+
from typing import List, Optional, Tuple
|
8
|
+
|
8
9
|
from django.db import transaction
|
9
10
|
from django.utils import timezone
|
10
11
|
|
11
|
-
from django_cfg.modules.django_logging import get_logger
|
12
12
|
from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency
|
13
|
-
from
|
13
|
+
from django_cfg.modules.django_logging import get_logger
|
14
|
+
|
15
|
+
from ..models import CurrencySyncResult, UniversalCurrency
|
14
16
|
from .config import NowPaymentsConfig as Config
|
15
17
|
|
16
18
|
logger = get_logger("nowpayments_sync")
|
@@ -18,11 +20,11 @@ logger = get_logger("nowpayments_sync")
|
|
18
20
|
|
19
21
|
class NowPaymentsCurrencySync:
|
20
22
|
"""Service for synchronizing NowPayments currencies to database."""
|
21
|
-
|
23
|
+
|
22
24
|
def __init__(self, provider_name: str = 'nowpayments'):
|
23
25
|
"""Initialize currency sync service."""
|
24
26
|
self.provider_name = provider_name
|
25
|
-
|
27
|
+
|
26
28
|
def sync_currencies_to_db(self, currencies: List[UniversalCurrency]) -> CurrencySyncResult:
|
27
29
|
"""
|
28
30
|
Sync universal currencies to database.
|
@@ -34,7 +36,7 @@ class NowPaymentsCurrencySync:
|
|
34
36
|
CurrencySyncResult: Sync operation results
|
35
37
|
"""
|
36
38
|
result = CurrencySyncResult(total_processed=len(currencies))
|
37
|
-
|
39
|
+
|
38
40
|
try:
|
39
41
|
with transaction.atomic():
|
40
42
|
for currency in currencies:
|
@@ -44,24 +46,24 @@ class NowPaymentsCurrencySync:
|
|
44
46
|
error_msg = f"Failed to sync {currency.provider_currency_code}: {e}"
|
45
47
|
logger.error(error_msg)
|
46
48
|
result.errors.append(error_msg)
|
47
|
-
|
49
|
+
|
48
50
|
logger.info(
|
49
51
|
f"Currency sync completed: {result.currencies_created} created, "
|
50
52
|
f"{result.currencies_updated} updated, "
|
51
53
|
f"{result.provider_currencies_created} provider currencies created, "
|
52
54
|
f"{len(result.errors)} errors"
|
53
55
|
)
|
54
|
-
|
56
|
+
|
55
57
|
return result
|
56
|
-
|
58
|
+
|
57
59
|
except Exception as e:
|
58
60
|
logger.error(f"Currency sync transaction failed: {e}")
|
59
61
|
result.errors.append(f"Transaction failed: {e}")
|
60
62
|
return result
|
61
|
-
|
63
|
+
|
62
64
|
def _sync_single_currency(self, currency: UniversalCurrency, result: CurrencySyncResult):
|
63
65
|
"""Sync a single currency to database."""
|
64
|
-
|
66
|
+
|
65
67
|
# 1. Ensure base currency exists
|
66
68
|
base_currency, currency_created = self._get_or_create_currency(currency)
|
67
69
|
if currency_created:
|
@@ -71,19 +73,19 @@ class NowPaymentsCurrencySync:
|
|
71
73
|
updated = self._update_currency_if_needed(base_currency, currency)
|
72
74
|
if updated:
|
73
75
|
result.currencies_updated += 1
|
74
|
-
|
76
|
+
|
75
77
|
# 2. Ensure network exists (if applicable)
|
76
78
|
network = None
|
77
79
|
if currency.network_code:
|
78
80
|
network, network_created = self._get_or_create_network(currency, base_currency)
|
79
81
|
if network_created:
|
80
82
|
result.networks_created += 1
|
81
|
-
|
83
|
+
|
82
84
|
# 3. Create or update provider currency
|
83
85
|
provider_currency, pc_created = self._get_or_create_provider_currency(
|
84
86
|
currency, base_currency, network
|
85
87
|
)
|
86
|
-
|
88
|
+
|
87
89
|
if pc_created:
|
88
90
|
result.provider_currencies_created += 1
|
89
91
|
else:
|
@@ -91,10 +93,10 @@ class NowPaymentsCurrencySync:
|
|
91
93
|
updated = self._update_provider_currency_if_needed(provider_currency, currency)
|
92
94
|
if updated:
|
93
95
|
result.provider_currencies_updated += 1
|
94
|
-
|
96
|
+
|
95
97
|
def _get_or_create_currency(self, currency: UniversalCurrency) -> Tuple[Currency, bool]:
|
96
98
|
"""Get or create base currency."""
|
97
|
-
|
99
|
+
|
98
100
|
defaults = {
|
99
101
|
'name': currency.name,
|
100
102
|
'currency_type': currency.currency_type,
|
@@ -103,88 +105,88 @@ class NowPaymentsCurrencySync:
|
|
103
105
|
'usd_rate_updated_at': None,
|
104
106
|
'decimal_places': self._get_decimal_places(currency),
|
105
107
|
}
|
106
|
-
|
108
|
+
|
107
109
|
return Currency.objects.get_or_create(
|
108
110
|
code=currency.base_currency_code,
|
109
111
|
defaults=defaults
|
110
112
|
)
|
111
|
-
|
113
|
+
|
112
114
|
def _update_currency_if_needed(self, base_currency: Currency, currency: UniversalCurrency) -> bool:
|
113
115
|
"""Update currency if needed."""
|
114
116
|
updated = False
|
115
|
-
|
117
|
+
|
116
118
|
# Always update name to use the proper generated name
|
117
119
|
if base_currency.name != currency.name:
|
118
120
|
base_currency.name = currency.name
|
119
121
|
updated = True
|
120
|
-
|
122
|
+
|
121
123
|
# Update activity status
|
122
124
|
if base_currency.is_active != currency.is_enabled:
|
123
125
|
base_currency.is_active = currency.is_enabled
|
124
126
|
updated = True
|
125
|
-
|
127
|
+
|
126
128
|
if updated:
|
127
129
|
base_currency.save()
|
128
|
-
|
130
|
+
|
129
131
|
return updated
|
130
|
-
|
132
|
+
|
131
133
|
def _get_or_create_network(self, currency: UniversalCurrency, base_currency: Currency) -> Tuple[Network, bool]:
|
132
134
|
"""Get or create network for currency."""
|
133
|
-
|
135
|
+
|
134
136
|
network_name = Config.get_network_name(currency.network_code)
|
135
|
-
|
137
|
+
|
136
138
|
defaults = {
|
137
139
|
'name': network_name,
|
138
140
|
'native_currency': base_currency,
|
139
141
|
'is_active': True,
|
140
142
|
'confirmation_blocks': Config.get_confirmation_blocks(currency.network_code),
|
141
143
|
}
|
142
|
-
|
144
|
+
|
143
145
|
return Network.objects.get_or_create(
|
144
146
|
code=currency.network_code,
|
145
147
|
defaults=defaults
|
146
148
|
)
|
147
|
-
|
149
|
+
|
148
150
|
def _get_or_create_provider_currency(
|
149
|
-
self,
|
150
|
-
currency: UniversalCurrency,
|
151
|
-
base_currency: Currency,
|
151
|
+
self,
|
152
|
+
currency: UniversalCurrency,
|
153
|
+
base_currency: Currency,
|
152
154
|
network: Optional[Network]
|
153
155
|
) -> Tuple[ProviderCurrency, bool]:
|
154
156
|
"""Get or create provider currency."""
|
155
|
-
|
157
|
+
|
156
158
|
defaults = {
|
157
159
|
'currency': base_currency,
|
158
160
|
'network': network,
|
159
161
|
'is_enabled': currency.is_enabled,
|
160
162
|
}
|
161
|
-
|
163
|
+
|
162
164
|
return ProviderCurrency.objects.get_or_create(
|
163
165
|
provider=self.provider_name,
|
164
166
|
provider_currency_code=currency.provider_currency_code,
|
165
167
|
defaults=defaults
|
166
168
|
)
|
167
|
-
|
169
|
+
|
168
170
|
def _update_provider_currency_if_needed(
|
169
|
-
self,
|
170
|
-
provider_currency: ProviderCurrency,
|
171
|
+
self,
|
172
|
+
provider_currency: ProviderCurrency,
|
171
173
|
currency: UniversalCurrency
|
172
174
|
) -> bool:
|
173
175
|
"""Update provider currency if needed."""
|
174
176
|
updated = False
|
175
|
-
|
177
|
+
|
176
178
|
# Update enabled status
|
177
179
|
if provider_currency.is_enabled != currency.is_enabled:
|
178
180
|
provider_currency.is_enabled = currency.is_enabled
|
179
181
|
updated = True
|
180
|
-
|
182
|
+
|
181
183
|
# Update timestamps
|
182
184
|
if updated:
|
183
185
|
provider_currency.updated_at = timezone.now()
|
184
186
|
provider_currency.save()
|
185
|
-
|
187
|
+
|
186
188
|
return updated
|
187
|
-
|
189
|
+
|
188
190
|
def _get_decimal_places(self, currency: UniversalCurrency) -> int:
|
189
191
|
"""Get appropriate decimal places for currency."""
|
190
192
|
if currency.currency_type == 'fiat':
|
@@ -193,4 +195,3 @@ class NowPaymentsCurrencySync:
|
|
193
195
|
return 6 # Stablecoins
|
194
196
|
else:
|
195
197
|
return 8 # Regular crypto
|
196
|
-
|
@@ -4,8 +4,10 @@ Provider registry for the Universal Payment System v2.0.
|
|
4
4
|
Centralized management of payment providers with health monitoring and fallbacks.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Dict, List, Optional, Type
|
7
|
+
from typing import Any, Dict, List, Optional, Type
|
8
|
+
|
8
9
|
from django_cfg.modules.django_logging import get_logger
|
10
|
+
|
9
11
|
# ConfigService removed - using direct Constance access
|
10
12
|
from ..types import ServiceOperationResult
|
11
13
|
from .base import BaseProvider
|
@@ -21,7 +23,7 @@ class ProviderRegistry:
|
|
21
23
|
Provides centralized access to providers with health monitoring,
|
22
24
|
configuration management, and fallback mechanisms.
|
23
25
|
"""
|
24
|
-
|
26
|
+
|
25
27
|
def __init__(self):
|
26
28
|
"""Initialize provider registry."""
|
27
29
|
# Use PaymentsConfigManager for configuration from BaseCfgAutoModule
|
@@ -36,10 +38,10 @@ class ProviderRegistry:
|
|
36
38
|
self._provider_configs: Dict[str, Type[ProviderConfig]] = {
|
37
39
|
ProviderEnum.NOWPAYMENTS.value: NowPaymentsProviderConfig,
|
38
40
|
}
|
39
|
-
|
41
|
+
|
40
42
|
self._health_status: Dict[str, bool] = {}
|
41
43
|
self._initialized = False
|
42
|
-
|
44
|
+
|
43
45
|
def initialize(self) -> ServiceOperationResult:
|
44
46
|
"""
|
45
47
|
Initialize all configured providers.
|
@@ -49,7 +51,7 @@ class ProviderRegistry:
|
|
49
51
|
"""
|
50
52
|
try:
|
51
53
|
logger.info("Initializing provider registry")
|
52
|
-
|
54
|
+
|
53
55
|
# Get all provider configurations from BaseCfgAutoModule
|
54
56
|
try:
|
55
57
|
provider_configs = self.config_manager.get_all_provider_configs()
|
@@ -59,17 +61,17 @@ class ProviderRegistry:
|
|
59
61
|
message=f"Failed to get provider configurations: {e}",
|
60
62
|
error_code="config_failed"
|
61
63
|
)
|
62
|
-
|
64
|
+
|
63
65
|
# provider_configs is already a dict from get_all_provider_configs()
|
64
66
|
initialized_count = 0
|
65
67
|
failed_providers = []
|
66
|
-
|
68
|
+
|
67
69
|
# Initialize each configured provider
|
68
70
|
for provider_name, config_data in provider_configs.items():
|
69
71
|
if not config_data.get('enabled', False):
|
70
72
|
logger.debug(f"Skipping disabled provider: {provider_name}")
|
71
73
|
continue
|
72
|
-
|
74
|
+
|
73
75
|
try:
|
74
76
|
provider = self._create_provider(provider_name, config_data)
|
75
77
|
if provider:
|
@@ -78,20 +80,20 @@ class ProviderRegistry:
|
|
78
80
|
logger.info(f"Initialized provider: {provider_name}")
|
79
81
|
else:
|
80
82
|
failed_providers.append(provider_name)
|
81
|
-
|
83
|
+
|
82
84
|
except Exception as e:
|
83
85
|
logger.error(f"Failed to initialize provider {provider_name}: {e}")
|
84
86
|
failed_providers.append(provider_name)
|
85
|
-
|
87
|
+
|
86
88
|
self._initialized = True
|
87
|
-
|
89
|
+
|
88
90
|
# Perform initial health check
|
89
91
|
self.health_check_all()
|
90
|
-
|
92
|
+
|
91
93
|
result_message = f"Initialized {initialized_count} providers"
|
92
94
|
if failed_providers:
|
93
95
|
result_message += f", failed: {', '.join(failed_providers)}"
|
94
|
-
|
96
|
+
|
95
97
|
return ServiceOperationResult(
|
96
98
|
success=True,
|
97
99
|
message=result_message,
|
@@ -102,7 +104,7 @@ class ProviderRegistry:
|
|
102
104
|
'initialized_count': initialized_count
|
103
105
|
}
|
104
106
|
)
|
105
|
-
|
107
|
+
|
106
108
|
except Exception as e:
|
107
109
|
logger.error(f"Provider registry initialization failed: {e}")
|
108
110
|
return ServiceOperationResult(
|
@@ -110,7 +112,7 @@ class ProviderRegistry:
|
|
110
112
|
message=f"Registry initialization failed: {e}",
|
111
113
|
error_code="initialization_failed"
|
112
114
|
)
|
113
|
-
|
115
|
+
|
114
116
|
def get_provider(self, provider_name: str) -> Optional[BaseProvider]:
|
115
117
|
"""
|
116
118
|
Get provider by name.
|
@@ -124,18 +126,18 @@ class ProviderRegistry:
|
|
124
126
|
if not self._initialized:
|
125
127
|
logger.warning("Registry not initialized, initializing now")
|
126
128
|
self.initialize()
|
127
|
-
|
129
|
+
|
128
130
|
provider = self._providers.get(provider_name)
|
129
131
|
if not provider:
|
130
132
|
logger.warning(f"Provider not found: {provider_name}")
|
131
133
|
return None
|
132
|
-
|
134
|
+
|
133
135
|
# Check if provider is healthy
|
134
136
|
if not self._health_status.get(provider_name, False):
|
135
137
|
logger.warning(f"Provider {provider_name} is unhealthy")
|
136
|
-
|
138
|
+
|
137
139
|
return provider
|
138
|
-
|
140
|
+
|
139
141
|
def get_available_providers(self) -> List[str]:
|
140
142
|
"""
|
141
143
|
Get list of available (healthy) providers.
|
@@ -145,12 +147,12 @@ class ProviderRegistry:
|
|
145
147
|
"""
|
146
148
|
if not self._initialized:
|
147
149
|
self.initialize()
|
148
|
-
|
150
|
+
|
149
151
|
return [
|
150
152
|
name for name, provider in self._providers.items()
|
151
153
|
if self._health_status.get(name, False)
|
152
154
|
]
|
153
|
-
|
155
|
+
|
154
156
|
def get_primary_provider(self) -> Optional[BaseProvider]:
|
155
157
|
"""
|
156
158
|
Get primary (preferred) provider.
|
@@ -159,21 +161,21 @@ class ProviderRegistry:
|
|
159
161
|
Optional[BaseProvider]: Primary provider or None
|
160
162
|
"""
|
161
163
|
available_providers = self.get_available_providers()
|
162
|
-
|
164
|
+
|
163
165
|
if not available_providers:
|
164
166
|
logger.warning("No healthy providers available")
|
165
167
|
return None
|
166
|
-
|
168
|
+
|
167
169
|
# Priority order: nowpayments first, then others
|
168
170
|
priority_order = ProviderEnum.get_priority_order()
|
169
|
-
|
171
|
+
|
170
172
|
for provider_name in priority_order:
|
171
173
|
if provider_name in available_providers:
|
172
174
|
return self._providers[provider_name]
|
173
|
-
|
175
|
+
|
174
176
|
# Fallback to first available
|
175
177
|
return self._providers[available_providers[0]]
|
176
|
-
|
178
|
+
|
177
179
|
def get_provider_for_currency(self, currency_code: str) -> Optional[BaseProvider]:
|
178
180
|
"""
|
179
181
|
Get best provider for specific currency.
|
@@ -185,21 +187,21 @@ class ProviderRegistry:
|
|
185
187
|
Optional[BaseProvider]: Best provider for currency or None
|
186
188
|
"""
|
187
189
|
available_providers = self.get_available_providers()
|
188
|
-
|
190
|
+
|
189
191
|
# Find providers that support the currency
|
190
192
|
supporting_providers = []
|
191
193
|
for provider_name in available_providers:
|
192
194
|
provider = self._providers[provider_name]
|
193
195
|
if currency_code in provider.config.supported_currencies:
|
194
196
|
supporting_providers.append(provider)
|
195
|
-
|
197
|
+
|
196
198
|
if not supporting_providers:
|
197
199
|
logger.warning(f"No providers support currency: {currency_code}")
|
198
200
|
return None
|
199
|
-
|
201
|
+
|
200
202
|
# Return first supporting provider (could be enhanced with more logic)
|
201
203
|
return supporting_providers[0]
|
202
|
-
|
204
|
+
|
203
205
|
def health_check_all(self) -> ServiceOperationResult:
|
204
206
|
"""
|
205
207
|
Perform health check on all providers.
|
@@ -209,34 +211,34 @@ class ProviderRegistry:
|
|
209
211
|
"""
|
210
212
|
try:
|
211
213
|
logger.debug("Performing health check on all providers")
|
212
|
-
|
214
|
+
|
213
215
|
if not self._providers:
|
214
216
|
return ServiceOperationResult(
|
215
217
|
success=False,
|
216
218
|
message="No providers initialized",
|
217
219
|
error_code="no_providers"
|
218
220
|
)
|
219
|
-
|
221
|
+
|
220
222
|
health_results = {}
|
221
223
|
healthy_count = 0
|
222
|
-
|
224
|
+
|
223
225
|
for provider_name, provider in self._providers.items():
|
224
226
|
try:
|
225
227
|
health_result = provider.health_check()
|
226
228
|
is_healthy = health_result.success
|
227
|
-
|
229
|
+
|
228
230
|
self._health_status[provider_name] = is_healthy
|
229
231
|
health_results[provider_name] = {
|
230
232
|
'healthy': is_healthy,
|
231
233
|
'message': health_result.message,
|
232
234
|
'data': health_result.data
|
233
235
|
}
|
234
|
-
|
236
|
+
|
235
237
|
if is_healthy:
|
236
238
|
healthy_count += 1
|
237
|
-
|
239
|
+
|
238
240
|
logger.debug(f"Provider {provider_name} health: {is_healthy}")
|
239
|
-
|
241
|
+
|
240
242
|
except Exception as e:
|
241
243
|
logger.error(f"Health check failed for {provider_name}: {e}")
|
242
244
|
self._health_status[provider_name] = False
|
@@ -245,9 +247,9 @@ class ProviderRegistry:
|
|
245
247
|
'message': f"Health check error: {e}",
|
246
248
|
'data': {}
|
247
249
|
}
|
248
|
-
|
250
|
+
|
249
251
|
overall_healthy = healthy_count > 0
|
250
|
-
|
252
|
+
|
251
253
|
return ServiceOperationResult(
|
252
254
|
success=overall_healthy,
|
253
255
|
message=f"{healthy_count}/{len(self._providers)} providers healthy",
|
@@ -259,7 +261,7 @@ class ProviderRegistry:
|
|
259
261
|
'available_providers': self.get_available_providers()
|
260
262
|
}
|
261
263
|
)
|
262
|
-
|
264
|
+
|
263
265
|
except Exception as e:
|
264
266
|
logger.error(f"Health check failed: {e}")
|
265
267
|
return ServiceOperationResult(
|
@@ -267,7 +269,7 @@ class ProviderRegistry:
|
|
267
269
|
message=f"Health check error: {e}",
|
268
270
|
error_code="health_check_error"
|
269
271
|
)
|
270
|
-
|
272
|
+
|
271
273
|
def refresh_configurations(self) -> ServiceOperationResult:
|
272
274
|
"""
|
273
275
|
Refresh provider configurations from config service.
|
@@ -277,18 +279,18 @@ class ProviderRegistry:
|
|
277
279
|
"""
|
278
280
|
try:
|
279
281
|
logger.info("Refreshing provider configurations")
|
280
|
-
|
282
|
+
|
281
283
|
# Clear current providers
|
282
284
|
self._providers.clear()
|
283
285
|
self._health_status.clear()
|
284
286
|
self._initialized = False
|
285
|
-
|
287
|
+
|
286
288
|
# Refresh config service
|
287
289
|
self.config_service.refresh_configuration()
|
288
|
-
|
290
|
+
|
289
291
|
# Re-initialize providers
|
290
292
|
return self.initialize()
|
291
|
-
|
293
|
+
|
292
294
|
except Exception as e:
|
293
295
|
logger.error(f"Configuration refresh failed: {e}")
|
294
296
|
return ServiceOperationResult(
|
@@ -296,7 +298,7 @@ class ProviderRegistry:
|
|
296
298
|
message=f"Configuration refresh failed: {e}",
|
297
299
|
error_code="refresh_failed"
|
298
300
|
)
|
299
|
-
|
301
|
+
|
300
302
|
def get_registry_stats(self) -> ServiceOperationResult:
|
301
303
|
"""
|
302
304
|
Get registry statistics.
|
@@ -313,13 +315,13 @@ class ProviderRegistry:
|
|
313
315
|
'configured_providers': list(self._providers.keys()),
|
314
316
|
'health_status': dict(self._health_status)
|
315
317
|
}
|
316
|
-
|
318
|
+
|
317
319
|
return ServiceOperationResult(
|
318
320
|
success=True,
|
319
321
|
message="Registry statistics",
|
320
322
|
data=stats
|
321
323
|
)
|
322
|
-
|
324
|
+
|
323
325
|
except Exception as e:
|
324
326
|
logger.error(f"Failed to get registry stats: {e}")
|
325
327
|
return ServiceOperationResult(
|
@@ -327,7 +329,7 @@ class ProviderRegistry:
|
|
327
329
|
message=f"Stats error: {e}",
|
328
330
|
error_code="stats_error"
|
329
331
|
)
|
330
|
-
|
332
|
+
|
331
333
|
def _create_provider(self, provider_name: str, config_data: Dict[str, Any]) -> Optional[BaseProvider]:
|
332
334
|
"""
|
333
335
|
Create provider instance from configuration.
|
@@ -345,29 +347,29 @@ class ProviderRegistry:
|
|
345
347
|
if not provider_class:
|
346
348
|
logger.error(f"Unknown provider class: {provider_name}")
|
347
349
|
return None
|
348
|
-
|
350
|
+
|
349
351
|
# Get config class
|
350
352
|
config_class = self._provider_configs.get(provider_name)
|
351
353
|
if not config_class:
|
352
354
|
logger.error(f"Unknown provider config class: {provider_name}")
|
353
355
|
return None
|
354
|
-
|
356
|
+
|
355
357
|
# Create configuration
|
356
358
|
config = config_class(**config_data)
|
357
|
-
|
359
|
+
|
358
360
|
# Create provider
|
359
361
|
provider = provider_class(config)
|
360
|
-
|
362
|
+
|
361
363
|
logger.debug(f"Created provider: {provider}")
|
362
364
|
return provider
|
363
|
-
|
365
|
+
|
364
366
|
except Exception as e:
|
365
367
|
logger.error(f"Failed to create provider {provider_name}: {e}")
|
366
368
|
return None
|
367
|
-
|
369
|
+
|
368
370
|
def register_provider_class(
|
369
|
-
self,
|
370
|
-
provider_name: str,
|
371
|
+
self,
|
372
|
+
provider_name: str,
|
371
373
|
provider_class: Type[BaseProvider],
|
372
374
|
config_class: Type[ProviderConfig]
|
373
375
|
):
|
@@ -382,7 +384,7 @@ class ProviderRegistry:
|
|
382
384
|
self._provider_classes[provider_name] = provider_class
|
383
385
|
self._provider_configs[provider_name] = config_class
|
384
386
|
logger.info(f"Registered provider class: {provider_name}")
|
385
|
-
|
387
|
+
|
386
388
|
def register_provider(self, provider_name: str, provider_instance: BaseProvider):
|
387
389
|
"""
|
388
390
|
Register provider instance directly (for testing).
|
@@ -393,24 +395,24 @@ class ProviderRegistry:
|
|
393
395
|
"""
|
394
396
|
self._providers[provider_name] = provider_instance
|
395
397
|
logger.info(f"Registered provider instance: {provider_name}")
|
396
|
-
|
398
|
+
|
397
399
|
@property
|
398
400
|
def providers(self) -> Dict[str, BaseProvider]:
|
399
401
|
"""Get dictionary of registered providers."""
|
400
402
|
return self._providers.copy()
|
401
|
-
|
403
|
+
|
402
404
|
def list_providers(self) -> List[str]:
|
403
405
|
"""Get list of registered provider names."""
|
404
406
|
return list(self._providers.keys())
|
405
|
-
|
407
|
+
|
406
408
|
def __len__(self) -> int:
|
407
409
|
"""Get number of initialized providers."""
|
408
410
|
return len(self._providers)
|
409
|
-
|
411
|
+
|
410
412
|
def __contains__(self, provider_name: str) -> bool:
|
411
413
|
"""Check if provider is initialized."""
|
412
414
|
return provider_name in self._providers
|
413
|
-
|
415
|
+
|
414
416
|
def __iter__(self):
|
415
417
|
"""Iterate over provider names."""
|
416
418
|
return iter(self._providers.keys())
|