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
@@ -0,0 +1,168 @@
|
|
1
|
+
{% extends 'tasks/layout/base.html' %}
|
2
|
+
{% load static %}
|
3
|
+
|
4
|
+
{% block extra_css %}
|
5
|
+
<style>
|
6
|
+
/* Tab styling - важно для работы табов */
|
7
|
+
.tab-button.active {
|
8
|
+
border-color: #3b82f6 !important;
|
9
|
+
color: #3b82f6 !important;
|
10
|
+
}
|
11
|
+
|
12
|
+
.tab-panel {
|
13
|
+
display: none !important;
|
14
|
+
}
|
15
|
+
|
16
|
+
.tab-panel.active {
|
17
|
+
display: block !important;
|
18
|
+
}
|
19
|
+
|
20
|
+
/* Убираем все остальные табы кроме активного */
|
21
|
+
#queues-tab,
|
22
|
+
#workers-tab,
|
23
|
+
#tasks-tab {
|
24
|
+
display: none;
|
25
|
+
}
|
26
|
+
|
27
|
+
#overview-tab {
|
28
|
+
display: block;
|
29
|
+
}
|
30
|
+
</style>
|
31
|
+
{% endblock %}
|
32
|
+
|
33
|
+
{% block content %}
|
34
|
+
{% csrf_token %}
|
35
|
+
|
36
|
+
<!-- Management Actions -->
|
37
|
+
{% include 'tasks/components/management_actions.html' %}
|
38
|
+
|
39
|
+
<!-- Tab Navigation -->
|
40
|
+
{% include 'tasks/components/tab_navigation.html' %}
|
41
|
+
|
42
|
+
<!-- Tab Content -->
|
43
|
+
<div class="tab-content mt-6">
|
44
|
+
<!-- Overview Tab -->
|
45
|
+
<div id="overview-tab" class="tab-panel active">
|
46
|
+
{% include 'tasks/components/overview_content.html' %}
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<!-- Queues Tab -->
|
50
|
+
<div id="queues-tab" class="tab-panel">
|
51
|
+
{% include 'tasks/components/queues_content.html' %}
|
52
|
+
</div>
|
53
|
+
|
54
|
+
<!-- Workers Tab -->
|
55
|
+
<div id="workers-tab" class="tab-panel">
|
56
|
+
{% include 'tasks/components/workers_content.html' %}
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<!-- Tasks Tab -->
|
60
|
+
<div id="tasks-tab" class="tab-panel">
|
61
|
+
{% include 'tasks/components/tasks_content.html' %}
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<!-- Templates for JavaScript -->
|
66
|
+
{% include 'tasks/partials/task_row_template.html' %}
|
67
|
+
|
68
|
+
{% endblock %}
|
69
|
+
|
70
|
+
{% block extra_js %}
|
71
|
+
<!-- Improved API Loading with centralized loader -->
|
72
|
+
<script type="module">
|
73
|
+
// Import the API loader and task API
|
74
|
+
import { initializeAPIs, showNotification } from '{% static "js/api-loader.mjs" %}';
|
75
|
+
import { tasksAPI } from '{% static "api/tasks/index.mjs" %}';
|
76
|
+
|
77
|
+
// Initialize the API with error handling wrapper
|
78
|
+
async function setupAPIs() {
|
79
|
+
try {
|
80
|
+
// Load task API with automatic error handling
|
81
|
+
const apis = await initializeAPIs(['tasks']);
|
82
|
+
|
83
|
+
// Make available globally for dashboard modules
|
84
|
+
window.tasksAPI = apis.tasks || tasksAPI;
|
85
|
+
|
86
|
+
// Log successful loading
|
87
|
+
console.log('✅ Tasks API loaded with JSDoc types and error handling');
|
88
|
+
console.log('📚 Available methods:', Object.getOwnPropertyNames(Object.getPrototypeOf(window.tasksAPI)));
|
89
|
+
|
90
|
+
// Show IDE hints example
|
91
|
+
console.log(`
|
92
|
+
💡 IDE Tip: Your editor now provides:
|
93
|
+
- Autocomplete for all API methods
|
94
|
+
- Parameter hints with types
|
95
|
+
- Return type information
|
96
|
+
- Inline documentation
|
97
|
+
|
98
|
+
Try typing: tasksAPI. (and see the suggestions!)
|
99
|
+
`);
|
100
|
+
|
101
|
+
// Test the API connection
|
102
|
+
const healthCheck = await window.tasksAPI.cfgTasksApiQueuesStatusRetrieve();
|
103
|
+
if (healthCheck) {
|
104
|
+
showNotification('API connected successfully', 'success');
|
105
|
+
}
|
106
|
+
|
107
|
+
} catch (error) {
|
108
|
+
console.error('❌ Failed to initialize APIs:', error);
|
109
|
+
showNotification('Failed to load API. Some features may not work.', 'error');
|
110
|
+
|
111
|
+
// Fallback to direct import
|
112
|
+
window.tasksAPI = tasksAPI;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
// Setup APIs when DOM is ready
|
117
|
+
if (document.readyState === 'loading') {
|
118
|
+
document.addEventListener('DOMContentLoaded', setupAPIs);
|
119
|
+
} else {
|
120
|
+
setupAPIs();
|
121
|
+
}
|
122
|
+
</script>
|
123
|
+
|
124
|
+
<!-- Dashboard Modules (now with improved API) -->
|
125
|
+
<script type="module" src="{% static 'tasks/js/dashboard/overview.mjs' %}"></script>
|
126
|
+
<script type="module" src="{% static 'tasks/js/dashboard/queues.mjs' %}"></script>
|
127
|
+
<script type="module" src="{% static 'tasks/js/dashboard/workers.mjs' %}"></script>
|
128
|
+
<script type="module" src="{% static 'tasks/js/dashboard/tasks.mjs' %}"></script>
|
129
|
+
|
130
|
+
<!-- Main Dashboard Controller -->
|
131
|
+
<script type="module" src="{% static 'tasks/js/dashboard/main.mjs' %}"></script>
|
132
|
+
|
133
|
+
<!-- Debug Helper -->
|
134
|
+
<script type="module">
|
135
|
+
// Add debug helper to window for testing
|
136
|
+
window.debugAPI = {
|
137
|
+
// Test various API methods
|
138
|
+
testStats: async () => {
|
139
|
+
const stats = await window.tasksAPI.tasksApiTasksStatsRetrieve();
|
140
|
+
console.log('Task Statistics:', stats);
|
141
|
+
return stats;
|
142
|
+
},
|
143
|
+
|
144
|
+
testQueues: async () => {
|
145
|
+
const queues = await window.tasksAPI.tasksApiQueuesStatusRetrieve();
|
146
|
+
console.log('Queue Status:', queues);
|
147
|
+
return queues;
|
148
|
+
},
|
149
|
+
|
150
|
+
testWorkers: async () => {
|
151
|
+
const workers = await window.tasksAPI.tasksApiWorkersListRetrieve();
|
152
|
+
console.log('Workers List:', workers);
|
153
|
+
return workers;
|
154
|
+
},
|
155
|
+
|
156
|
+
// Show all available methods
|
157
|
+
showMethods: () => {
|
158
|
+
const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(window.tasksAPI))
|
159
|
+
.filter(m => typeof window.tasksAPI[m] === 'function')
|
160
|
+
.filter(m => !m.startsWith('_'));
|
161
|
+
console.log('📋 Available API Methods:', methods);
|
162
|
+
return methods;
|
163
|
+
}
|
164
|
+
};
|
165
|
+
|
166
|
+
console.log('🔧 Debug helpers available: window.debugAPI');
|
167
|
+
</script>
|
168
|
+
{% endblock %}
|
@@ -68,8 +68,27 @@
|
|
68
68
|
{% endblock %}
|
69
69
|
|
70
70
|
{% block extra_js %}
|
71
|
-
<!--
|
72
|
-
<script
|
71
|
+
<!-- Load and initialize Tasks API -->
|
72
|
+
<script type="module">
|
73
|
+
try {
|
74
|
+
console.log('🔄 Starting TasksAPI module import...');
|
75
|
+
const { loadAPI, showNotification } = await import('/static/js/api-loader.mjs');
|
76
|
+
|
77
|
+
// Load tasks API
|
78
|
+
const tasksAPI = await loadAPI('tasks');
|
79
|
+
console.log('✅ TasksAPI module imported successfully:', tasksAPI);
|
80
|
+
|
81
|
+
// Make it available globally as tasksAPI
|
82
|
+
window.tasksAPI = tasksAPI;
|
83
|
+
window.showNotification = showNotification;
|
84
|
+
|
85
|
+
console.log('✅ TasksAPI loaded from generated MJS client');
|
86
|
+
} catch (error) {
|
87
|
+
console.error('❌ Failed to load TasksAPI module:', error);
|
88
|
+
console.error('Error stack:', error.stack);
|
89
|
+
window.tasksAPI = null;
|
90
|
+
}
|
91
|
+
</script>
|
73
92
|
|
74
93
|
<!-- Dashboard Modules -->
|
75
94
|
<script type="module" src="{% static 'tasks/js/dashboard/overview.mjs' %}"></script>
|
django_cfg/apps/tasks/urls.py
CHANGED
@@ -4,8 +4,9 @@ URLs for Django CFG Tasks app.
|
|
4
4
|
Provides RESTful endpoints for task queue management and monitoring using ViewSets and routers.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.urls import
|
7
|
+
from django.urls import include, path
|
8
8
|
from rest_framework.routers import DefaultRouter
|
9
|
+
|
9
10
|
from .views import TaskManagementViewSet
|
10
11
|
|
11
12
|
app_name = 'tasks'
|
@@ -17,5 +18,5 @@ router.register(r'', TaskManagementViewSet, basename='task-management')
|
|
17
18
|
urlpatterns = [
|
18
19
|
# RESTful API endpoints using ViewSets
|
19
20
|
path('api/', include(router.urls)),
|
20
|
-
|
21
|
+
|
21
22
|
]
|
@@ -5,37 +5,34 @@ This module provides real-time access to Dramatiq queue data from Redis,
|
|
5
5
|
with optional test task generation for demonstration purposes.
|
6
6
|
"""
|
7
7
|
|
8
|
-
import
|
9
|
-
import time
|
8
|
+
import logging
|
10
9
|
import random
|
11
|
-
import
|
12
|
-
from
|
13
|
-
from typing import Dict, Any, List, Optional
|
10
|
+
from datetime import datetime
|
11
|
+
from typing import Any, Dict, Optional
|
14
12
|
from urllib.parse import urlparse
|
13
|
+
|
14
|
+
import redis
|
15
15
|
from django.conf import settings
|
16
|
-
from django.core.cache import cache
|
17
|
-
import dramatiq
|
18
|
-
import logging
|
19
16
|
|
20
17
|
logger = logging.getLogger(__name__)
|
21
18
|
|
22
19
|
|
23
20
|
class TaskSimulator:
|
24
21
|
"""Real Dramatiq data provider with test task generation capabilities."""
|
25
|
-
|
22
|
+
|
26
23
|
def __init__(self):
|
27
24
|
"""Initialize with Redis connection for real Dramatiq data."""
|
28
25
|
self.queues = ['critical', 'high', 'default', 'low', 'background', 'payments', 'agents', 'knowbase']
|
29
26
|
self._redis_client = None
|
30
27
|
self._setup_redis_connection()
|
31
|
-
|
28
|
+
|
32
29
|
def _setup_redis_connection(self):
|
33
30
|
"""Setup Redis connection for real Dramatiq data."""
|
34
31
|
try:
|
35
32
|
# Get Redis URL from Django settings (DRAMATIQ_BROKER)
|
36
33
|
dramatiq_config = getattr(settings, 'DRAMATIQ_BROKER', {})
|
37
34
|
redis_url = dramatiq_config.get('OPTIONS', {}).get('url')
|
38
|
-
|
35
|
+
|
39
36
|
if redis_url:
|
40
37
|
parsed = urlparse(redis_url)
|
41
38
|
self._redis_client = redis.Redis(
|
@@ -49,11 +46,11 @@ class TaskSimulator:
|
|
49
46
|
logger.info(f"Connected to Redis: {redis_url}")
|
50
47
|
else:
|
51
48
|
logger.warning("No Redis URL found in DRAMATIQ_BROKER settings")
|
52
|
-
|
49
|
+
|
53
50
|
except Exception as e:
|
54
51
|
logger.error(f"Failed to connect to Redis: {e}")
|
55
52
|
self._redis_client = None
|
56
|
-
|
53
|
+
|
57
54
|
def get_current_queue_status(self) -> Dict[str, Any]:
|
58
55
|
"""
|
59
56
|
Get current queue status from real Dramatiq Redis data.
|
@@ -63,13 +60,13 @@ class TaskSimulator:
|
|
63
60
|
"""
|
64
61
|
if not self._redis_client:
|
65
62
|
return self._get_no_connection_response()
|
66
|
-
|
63
|
+
|
67
64
|
try:
|
68
65
|
queues_data = {}
|
69
66
|
total_pending = 0
|
70
67
|
total_failed = 0
|
71
68
|
active_queues = 0
|
72
|
-
|
69
|
+
|
73
70
|
# Get real queue data from Redis
|
74
71
|
for queue_name in self.queues:
|
75
72
|
# Get queue length (pending tasks) - Dramatiq uses dramatiq:{queue_name}.msgs format
|
@@ -77,13 +74,13 @@ class TaskSimulator:
|
|
77
74
|
pending = self._redis_client.hlen(f'dramatiq:{queue_name}.msgs')
|
78
75
|
except:
|
79
76
|
pending = 0
|
80
|
-
|
81
|
-
# Get failed queue length - Dramatiq uses dramatiq:{queue_name}.DQ format
|
77
|
+
|
78
|
+
# Get failed queue length - Dramatiq uses dramatiq:{queue_name}.DQ format
|
82
79
|
try:
|
83
80
|
failed = self._redis_client.llen(f'dramatiq:{queue_name}.DQ')
|
84
81
|
except:
|
85
82
|
failed = 0
|
86
|
-
|
83
|
+
|
87
84
|
if pending > 0 or failed > 0:
|
88
85
|
active_queues += 1
|
89
86
|
queues_data[queue_name] = {
|
@@ -92,16 +89,16 @@ class TaskSimulator:
|
|
92
89
|
'processed': 0, # Can't easily get this from Redis
|
93
90
|
'last_activity': datetime.now().isoformat()
|
94
91
|
}
|
95
|
-
|
92
|
+
|
96
93
|
total_pending += pending
|
97
94
|
total_failed += failed
|
98
|
-
|
95
|
+
|
99
96
|
# Get worker count from heartbeats - Dramatiq uses dramatiq:__heartbeats__ sorted set
|
100
97
|
try:
|
101
98
|
active_workers = self._redis_client.zcard('dramatiq:__heartbeats__')
|
102
99
|
except:
|
103
100
|
active_workers = 0
|
104
|
-
|
101
|
+
|
105
102
|
return {
|
106
103
|
'queues': queues_data,
|
107
104
|
'workers': active_workers,
|
@@ -112,11 +109,11 @@ class TaskSimulator:
|
|
112
109
|
'total_failed': total_failed,
|
113
110
|
'active_queues': active_queues
|
114
111
|
}
|
115
|
-
|
112
|
+
|
116
113
|
except Exception as e:
|
117
114
|
logger.error(f"Error getting queue status: {e}")
|
118
115
|
return self._get_error_response(str(e))
|
119
|
-
|
116
|
+
|
120
117
|
def get_current_workers_list(self) -> Dict[str, Any]:
|
121
118
|
"""
|
122
119
|
Get current workers list from real Dramatiq Redis data.
|
@@ -133,7 +130,7 @@ class TaskSimulator:
|
|
133
130
|
'timestamp': datetime.now().isoformat(),
|
134
131
|
'simulated': False
|
135
132
|
}
|
136
|
-
|
133
|
+
|
137
134
|
try:
|
138
135
|
workers = []
|
139
136
|
# Get worker IDs from heartbeats - Dramatiq uses dramatiq:__heartbeats__ sorted set
|
@@ -141,7 +138,7 @@ class TaskSimulator:
|
|
141
138
|
worker_ids = self._redis_client.zrange('dramatiq:__heartbeats__', 0, -1)
|
142
139
|
except:
|
143
140
|
worker_ids = []
|
144
|
-
|
141
|
+
|
145
142
|
for worker_id in worker_ids:
|
146
143
|
# Create worker info from heartbeat data
|
147
144
|
workers.append({
|
@@ -154,7 +151,7 @@ class TaskSimulator:
|
|
154
151
|
'last_heartbeat': datetime.now().isoformat(),
|
155
152
|
'uptime': 'Active' # Since it's in heartbeats, it's active
|
156
153
|
})
|
157
|
-
|
154
|
+
|
158
155
|
return {
|
159
156
|
'workers': workers,
|
160
157
|
'active_count': len(workers),
|
@@ -162,7 +159,7 @@ class TaskSimulator:
|
|
162
159
|
'timestamp': datetime.now().isoformat(),
|
163
160
|
'simulated': False
|
164
161
|
}
|
165
|
-
|
162
|
+
|
166
163
|
except Exception as e:
|
167
164
|
logger.error(f"Error getting workers list: {e}")
|
168
165
|
return {
|
@@ -173,7 +170,7 @@ class TaskSimulator:
|
|
173
170
|
'timestamp': datetime.now().isoformat(),
|
174
171
|
'simulated': False
|
175
172
|
}
|
176
|
-
|
173
|
+
|
177
174
|
def get_current_task_statistics(self) -> Dict[str, Any]:
|
178
175
|
"""
|
179
176
|
Get current task statistics from real Dramatiq Redis data.
|
@@ -189,19 +186,19 @@ class TaskSimulator:
|
|
189
186
|
'timestamp': datetime.now().isoformat(),
|
190
187
|
'simulated': False
|
191
188
|
}
|
192
|
-
|
189
|
+
|
193
190
|
try:
|
194
191
|
# Calculate statistics from queue data
|
195
192
|
queue_status = self.get_current_queue_status()
|
196
|
-
|
193
|
+
|
197
194
|
total_pending = queue_status.get('total_pending', 0)
|
198
195
|
total_failed = queue_status.get('total_failed', 0)
|
199
|
-
|
196
|
+
|
200
197
|
# Estimate completed tasks (this is approximate)
|
201
198
|
estimated_completed = random.randint(100, 1000) # Would need persistent storage for real data
|
202
|
-
|
199
|
+
|
203
200
|
total_tasks = total_pending + total_failed + estimated_completed
|
204
|
-
|
201
|
+
|
205
202
|
statistics = {
|
206
203
|
'total': total_tasks,
|
207
204
|
'completed': estimated_completed,
|
@@ -211,14 +208,14 @@ class TaskSimulator:
|
|
211
208
|
'tasks_per_minute': round(random.uniform(5, 50), 1), # Would need real tracking
|
212
209
|
'success_rate': round((estimated_completed / max(total_tasks, 1)) * 100, 1) if total_tasks > 0 else 100
|
213
210
|
}
|
214
|
-
|
211
|
+
|
215
212
|
return {
|
216
213
|
'statistics': statistics,
|
217
214
|
'recent_tasks': [], # Would need task history storage for real data
|
218
215
|
'timestamp': datetime.now().isoformat(),
|
219
216
|
'simulated': False
|
220
217
|
}
|
221
|
-
|
218
|
+
|
222
219
|
except Exception as e:
|
223
220
|
logger.error(f"Error getting task statistics: {e}")
|
224
221
|
return {
|
@@ -228,7 +225,7 @@ class TaskSimulator:
|
|
228
225
|
'timestamp': datetime.now().isoformat(),
|
229
226
|
'simulated': False
|
230
227
|
}
|
231
|
-
|
228
|
+
|
232
229
|
def run_simulation(self, workers: int = 3, clear_first: bool = True) -> Dict[str, Any]:
|
233
230
|
"""
|
234
231
|
Generate test tasks for demonstration purposes.
|
@@ -243,7 +240,7 @@ class TaskSimulator:
|
|
243
240
|
try:
|
244
241
|
# Generate realistic test tasks using Dramatiq
|
245
242
|
tasks_created = self._generate_test_tasks()
|
246
|
-
|
243
|
+
|
247
244
|
return {
|
248
245
|
'success': True,
|
249
246
|
'message': f'Generated {tasks_created} test tasks for demonstration',
|
@@ -253,14 +250,14 @@ class TaskSimulator:
|
|
253
250
|
'timestamp': datetime.now().isoformat()
|
254
251
|
}
|
255
252
|
}
|
256
|
-
|
253
|
+
|
257
254
|
except Exception as e:
|
258
255
|
logger.error(f"Test task generation failed: {e}")
|
259
256
|
return {
|
260
257
|
'success': False,
|
261
258
|
'error': f'Test task generation failed: {str(e)}'
|
262
259
|
}
|
263
|
-
|
260
|
+
|
264
261
|
def clear_all_data(self) -> Dict[str, Any]:
|
265
262
|
"""
|
266
263
|
Clear all tasks from Dramatiq queues.
|
@@ -273,10 +270,10 @@ class TaskSimulator:
|
|
273
270
|
'success': False,
|
274
271
|
'error': 'Redis connection not available'
|
275
272
|
}
|
276
|
-
|
273
|
+
|
277
274
|
try:
|
278
275
|
cleared_count = 0
|
279
|
-
|
276
|
+
|
280
277
|
# Clear all queue data
|
281
278
|
for queue_name in self.queues:
|
282
279
|
# Clear main queue - Dramatiq uses dramatiq:{queue_name} format
|
@@ -284,26 +281,26 @@ class TaskSimulator:
|
|
284
281
|
if main_queue_len > 0:
|
285
282
|
self._redis_client.delete(f'dramatiq:{queue_name}')
|
286
283
|
cleared_count += main_queue_len
|
287
|
-
|
284
|
+
|
288
285
|
# Clear failed queue - Dramatiq uses dramatiq:{queue_name}.DQ format
|
289
286
|
failed_queue_len = self._redis_client.llen(f'dramatiq:{queue_name}.DQ')
|
290
287
|
if failed_queue_len > 0:
|
291
288
|
self._redis_client.delete(f'dramatiq:{queue_name}.DQ')
|
292
289
|
cleared_count += failed_queue_len
|
293
|
-
|
290
|
+
|
294
291
|
return {
|
295
292
|
'success': True,
|
296
293
|
'message': f'Cleared {cleared_count} tasks from all queues',
|
297
294
|
'cleared_tasks': cleared_count
|
298
295
|
}
|
299
|
-
|
296
|
+
|
300
297
|
except Exception as e:
|
301
298
|
logger.error(f"Clear operation failed: {e}")
|
302
299
|
return {
|
303
300
|
'success': False,
|
304
301
|
'error': f'Clear operation failed: {str(e)}'
|
305
302
|
}
|
306
|
-
|
303
|
+
|
307
304
|
def _generate_test_tasks(self) -> int:
|
308
305
|
"""Generate realistic test tasks for demonstration."""
|
309
306
|
try:
|
@@ -313,26 +310,26 @@ class TaskSimulator:
|
|
313
310
|
except ImportError as e:
|
314
311
|
logger.error(f"Failed to import demo tasks: {e}")
|
315
312
|
return 0
|
316
|
-
|
313
|
+
|
317
314
|
def _calculate_uptime(self, started_at: Optional[str]) -> str:
|
318
315
|
"""Calculate uptime from start time."""
|
319
316
|
if not started_at:
|
320
317
|
return 'Unknown'
|
321
|
-
|
318
|
+
|
322
319
|
try:
|
323
320
|
start_time = datetime.fromisoformat(started_at.replace('Z', '+00:00'))
|
324
321
|
uptime = datetime.now() - start_time.replace(tzinfo=None)
|
325
|
-
|
322
|
+
|
326
323
|
hours = int(uptime.total_seconds() // 3600)
|
327
324
|
minutes = int((uptime.total_seconds() % 3600) // 60)
|
328
|
-
|
325
|
+
|
329
326
|
if hours > 0:
|
330
327
|
return f'{hours}h {minutes}m'
|
331
328
|
else:
|
332
329
|
return f'{minutes}m'
|
333
330
|
except:
|
334
331
|
return 'Unknown'
|
335
|
-
|
332
|
+
|
336
333
|
def _get_no_connection_response(self) -> Dict[str, Any]:
|
337
334
|
"""Return response when Redis connection is not available."""
|
338
335
|
return {
|
@@ -343,7 +340,7 @@ class TaskSimulator:
|
|
343
340
|
'timestamp': datetime.now().isoformat(),
|
344
341
|
'simulated': False
|
345
342
|
}
|
346
|
-
|
343
|
+
|
347
344
|
def _get_error_response(self, error_message: str) -> Dict[str, Any]:
|
348
345
|
"""Return error response."""
|
349
346
|
return {
|
@@ -353,4 +350,4 @@ class TaskSimulator:
|
|
353
350
|
'redis_connected': False,
|
354
351
|
'timestamp': datetime.now().isoformat(),
|
355
352
|
'simulated': False
|
356
|
-
}
|
353
|
+
}
|