django-cfg 1.4.21__py3-none-any.whl → 1.4.24__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 +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -6,16 +6,16 @@ Built-in health monitoring endpoints that auto-configure from DjangoConfig.
|
|
6
6
|
|
7
7
|
import os
|
8
8
|
import time
|
9
|
-
import psutil
|
10
9
|
from datetime import datetime
|
11
|
-
from typing import
|
10
|
+
from typing import Any, Dict
|
12
11
|
|
13
|
-
|
14
|
-
from django.views import View
|
15
|
-
from django.db import connections
|
16
|
-
from django.core.cache import cache
|
12
|
+
import psutil
|
17
13
|
from django.conf import settings
|
14
|
+
from django.core.cache import cache
|
15
|
+
from django.db import connections
|
16
|
+
from django.http import JsonResponse
|
18
17
|
from django.utils import timezone
|
18
|
+
from django.views import View
|
19
19
|
|
20
20
|
from django_cfg.core.integration import get_current_version
|
21
21
|
|
@@ -30,14 +30,14 @@ class HealthCheckView(View):
|
|
30
30
|
- System resources
|
31
31
|
- Configuration status
|
32
32
|
"""
|
33
|
-
|
33
|
+
|
34
34
|
def get(self, request):
|
35
35
|
"""Return comprehensive health check data."""
|
36
36
|
# Get DjangoConfig instance
|
37
37
|
try:
|
38
38
|
from django.conf import settings
|
39
39
|
config = getattr(settings, 'config', None)
|
40
|
-
|
40
|
+
|
41
41
|
health_data = {
|
42
42
|
"status": "healthy",
|
43
43
|
"timestamp": timezone.now().isoformat(),
|
@@ -47,13 +47,13 @@ class HealthCheckView(View):
|
|
47
47
|
}
|
48
48
|
except Exception:
|
49
49
|
health_data = {
|
50
|
-
"status": "healthy",
|
50
|
+
"status": "healthy",
|
51
51
|
"timestamp": timezone.now().isoformat(),
|
52
52
|
"service": "Django CFG",
|
53
53
|
"version": get_current_version(),
|
54
54
|
"checks": {}
|
55
55
|
}
|
56
|
-
|
56
|
+
|
57
57
|
# Database connectivity check
|
58
58
|
try:
|
59
59
|
db_status = self._check_databases()
|
@@ -64,19 +64,19 @@ class HealthCheckView(View):
|
|
64
64
|
"error": str(e)
|
65
65
|
}
|
66
66
|
health_data["status"] = "unhealthy"
|
67
|
-
|
67
|
+
|
68
68
|
# Cache availability check
|
69
69
|
try:
|
70
70
|
cache_status = self._check_cache()
|
71
71
|
health_data["checks"]["cache"] = cache_status
|
72
72
|
except Exception as e:
|
73
73
|
health_data["checks"]["cache"] = {
|
74
|
-
"status": "error",
|
74
|
+
"status": "error",
|
75
75
|
"error": str(e)
|
76
76
|
}
|
77
77
|
if health_data["status"] != "unhealthy":
|
78
78
|
health_data["status"] = "degraded"
|
79
|
-
|
79
|
+
|
80
80
|
# System resources check
|
81
81
|
try:
|
82
82
|
system_status = self._check_system_resources()
|
@@ -86,84 +86,84 @@ class HealthCheckView(View):
|
|
86
86
|
"status": "error",
|
87
87
|
"error": str(e)
|
88
88
|
}
|
89
|
-
|
89
|
+
|
90
90
|
# Environment info
|
91
91
|
health_data["environment"] = {
|
92
92
|
"debug": getattr(settings, 'DEBUG', False),
|
93
93
|
"django_env": os.getenv("DJANGO_ENV", "development"),
|
94
94
|
"python_version": f"{os.sys.version_info.major}.{os.sys.version_info.minor}.{os.sys.version_info.micro}",
|
95
95
|
}
|
96
|
-
|
96
|
+
|
97
97
|
# Return appropriate HTTP status
|
98
98
|
status_code = 200
|
99
99
|
if health_data["status"] == "unhealthy":
|
100
100
|
status_code = 503
|
101
101
|
elif health_data["status"] == "degraded":
|
102
102
|
status_code = 200 # Still operational
|
103
|
-
|
103
|
+
|
104
104
|
return JsonResponse(health_data, status=status_code)
|
105
|
-
|
105
|
+
|
106
106
|
def _check_databases(self) -> Dict[str, Any]:
|
107
107
|
"""Check all configured database connections."""
|
108
108
|
db_results = {}
|
109
|
-
|
109
|
+
|
110
110
|
# Get all configured databases
|
111
111
|
database_names = list(getattr(settings, 'DATABASES', {}).keys())
|
112
|
-
|
112
|
+
|
113
113
|
for db_name in database_names:
|
114
114
|
try:
|
115
115
|
start_time = time.time()
|
116
116
|
conn = connections[db_name]
|
117
|
-
|
117
|
+
|
118
118
|
with conn.cursor() as cursor:
|
119
119
|
cursor.execute("SELECT 1")
|
120
120
|
cursor.fetchone()
|
121
|
-
|
121
|
+
|
122
122
|
response_time = (time.time() - start_time) * 1000 # ms
|
123
|
-
|
123
|
+
|
124
124
|
db_results[db_name] = {
|
125
125
|
"status": "healthy",
|
126
126
|
"response_time_ms": round(response_time, 2),
|
127
127
|
"engine": conn.settings_dict.get("ENGINE", "unknown"),
|
128
128
|
}
|
129
|
-
|
129
|
+
|
130
130
|
except Exception as e:
|
131
131
|
db_results[db_name] = {
|
132
132
|
"status": "error",
|
133
133
|
"error": str(e)[:100], # Truncate long errors
|
134
134
|
}
|
135
|
-
|
135
|
+
|
136
136
|
# Overall database status
|
137
137
|
all_healthy = all(
|
138
|
-
db["status"] == "healthy"
|
138
|
+
db["status"] == "healthy"
|
139
139
|
for db in db_results.values()
|
140
140
|
) if db_results else False
|
141
|
-
|
141
|
+
|
142
142
|
return {
|
143
143
|
"status": "healthy" if all_healthy else "error",
|
144
144
|
"databases": db_results,
|
145
145
|
"total_databases": len(db_results),
|
146
146
|
}
|
147
|
-
|
147
|
+
|
148
148
|
def _check_cache(self) -> Dict[str, Any]:
|
149
149
|
"""Check cache connectivity and performance."""
|
150
150
|
try:
|
151
151
|
test_key = "django_cfg_health_check"
|
152
152
|
test_value = f"test_{int(time.time())}"
|
153
|
-
|
153
|
+
|
154
154
|
# Test cache write
|
155
155
|
start_time = time.time()
|
156
156
|
cache.set(test_key, test_value, timeout=60)
|
157
157
|
write_time = (time.time() - start_time) * 1000
|
158
|
-
|
158
|
+
|
159
159
|
# Test cache read
|
160
160
|
start_time = time.time()
|
161
161
|
cached_value = cache.get(test_key)
|
162
162
|
read_time = (time.time() - start_time) * 1000
|
163
|
-
|
163
|
+
|
164
164
|
# Cleanup
|
165
165
|
cache.delete(test_key)
|
166
|
-
|
166
|
+
|
167
167
|
if cached_value == test_value:
|
168
168
|
return {
|
169
169
|
"status": "healthy",
|
@@ -176,29 +176,29 @@ class HealthCheckView(View):
|
|
176
176
|
"status": "error",
|
177
177
|
"error": "Cache read/write mismatch"
|
178
178
|
}
|
179
|
-
|
179
|
+
|
180
180
|
except Exception as e:
|
181
181
|
return {
|
182
182
|
"status": "error",
|
183
183
|
"error": str(e)
|
184
184
|
}
|
185
|
-
|
185
|
+
|
186
186
|
def _check_system_resources(self) -> Dict[str, Any]:
|
187
187
|
"""Check system resource usage."""
|
188
188
|
try:
|
189
189
|
# CPU usage
|
190
190
|
cpu_percent = psutil.cpu_percent(interval=1)
|
191
|
-
|
191
|
+
|
192
192
|
# Memory usage
|
193
193
|
memory = psutil.virtual_memory()
|
194
|
-
|
194
|
+
|
195
195
|
# Disk usage
|
196
196
|
disk = psutil.disk_usage('/')
|
197
|
-
|
197
|
+
|
198
198
|
# System uptime
|
199
199
|
boot_time = datetime.fromtimestamp(psutil.boot_time())
|
200
200
|
uptime = datetime.now() - boot_time
|
201
|
-
|
201
|
+
|
202
202
|
return {
|
203
203
|
"status": "healthy",
|
204
204
|
"cpu": {
|
@@ -222,7 +222,7 @@ class HealthCheckView(View):
|
|
222
222
|
},
|
223
223
|
"process_count": len(psutil.pids()),
|
224
224
|
}
|
225
|
-
|
225
|
+
|
226
226
|
except Exception as e:
|
227
227
|
return {
|
228
228
|
"status": "error",
|
@@ -232,7 +232,7 @@ class HealthCheckView(View):
|
|
232
232
|
|
233
233
|
class QuickHealthView(View):
|
234
234
|
"""Quick health check for load balancers."""
|
235
|
-
|
235
|
+
|
236
236
|
def get(self, request):
|
237
237
|
"""Return minimal health status."""
|
238
238
|
try:
|
@@ -240,12 +240,12 @@ class QuickHealthView(View):
|
|
240
240
|
conn = connections["default"]
|
241
241
|
with conn.cursor() as cursor:
|
242
242
|
cursor.execute("SELECT 1")
|
243
|
-
|
243
|
+
|
244
244
|
return JsonResponse({
|
245
245
|
"status": "ok",
|
246
246
|
"timestamp": timezone.now().isoformat(),
|
247
247
|
})
|
248
|
-
|
248
|
+
|
249
249
|
except Exception as e:
|
250
250
|
return JsonResponse({
|
251
251
|
"status": "error",
|
@@ -28,13 +28,13 @@ Example:
|
|
28
28
|
... )
|
29
29
|
"""
|
30
30
|
|
31
|
-
from .client import DjangoCfgRPCClient, get_rpc_client
|
32
|
-
from .config import DjangoCfgRPCConfig
|
33
|
-
from .exceptions import (
|
34
|
-
RPCTimeoutError,
|
35
|
-
RPCRemoteError,
|
36
|
-
RPCConnectionError,
|
31
|
+
from .services.client.client import DjangoCfgRPCClient, get_rpc_client
|
32
|
+
from .services.client.config import DjangoCfgRPCConfig
|
33
|
+
from .services.client.exceptions import (
|
37
34
|
RPCConfigurationError,
|
35
|
+
RPCConnectionError,
|
36
|
+
RPCRemoteError,
|
37
|
+
RPCTimeoutError,
|
38
38
|
)
|
39
39
|
|
40
40
|
__all__ = [
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"""
|
2
|
+
Django app configuration for IPC/RPC module.
|
3
|
+
|
4
|
+
Provides RPC client and monitoring dashboard.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from django.apps import AppConfig
|
8
|
+
|
9
|
+
|
10
|
+
class IPCConfig(AppConfig):
|
11
|
+
"""
|
12
|
+
IPC/RPC application configuration.
|
13
|
+
|
14
|
+
Provides:
|
15
|
+
- RPC client for inter-service communication
|
16
|
+
- Monitoring dashboard with real-time stats
|
17
|
+
- DRF API endpoints for dashboard
|
18
|
+
"""
|
19
|
+
|
20
|
+
default_auto_field = 'django.db.models.BigAutoField'
|
21
|
+
name = 'django_cfg.apps.ipc'
|
22
|
+
label = 'django_cfg_ipc'
|
23
|
+
verbose_name = 'IPC/RPC System'
|
24
|
+
|
25
|
+
def ready(self):
|
26
|
+
"""Initialize app when Django starts."""
|
27
|
+
# Import monitor to ensure Redis connection is initialized
|
28
|
+
from .services import monitor # noqa: F401
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"""
|
2
|
+
Serializers for IPC/RPC module.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from .serializers import (
|
6
|
+
HealthCheckSerializer,
|
7
|
+
MethodStatsSerializer,
|
8
|
+
NotificationStatsSerializer,
|
9
|
+
OverviewStatsSerializer,
|
10
|
+
RecentRequestsSerializer,
|
11
|
+
)
|
12
|
+
|
13
|
+
__all__ = [
|
14
|
+
'HealthCheckSerializer',
|
15
|
+
'OverviewStatsSerializer',
|
16
|
+
'RecentRequestsSerializer',
|
17
|
+
'NotificationStatsSerializer',
|
18
|
+
'MethodStatsSerializer',
|
19
|
+
]
|
@@ -0,0 +1,229 @@
|
|
1
|
+
"""
|
2
|
+
Serializers for RPC Dashboard API.
|
3
|
+
|
4
|
+
DRF serializers for consistent API responses with type hints.
|
5
|
+
"""
|
6
|
+
|
7
|
+
|
8
|
+
from rest_framework import serializers
|
9
|
+
|
10
|
+
|
11
|
+
class HealthCheckSerializer(serializers.Serializer):
|
12
|
+
"""Serializer for health check response."""
|
13
|
+
|
14
|
+
redis_connected = serializers.BooleanField(
|
15
|
+
help_text="Whether Redis is connected"
|
16
|
+
)
|
17
|
+
stream_exists = serializers.BooleanField(
|
18
|
+
help_text="Whether the request stream exists"
|
19
|
+
)
|
20
|
+
stream_length = serializers.IntegerField(
|
21
|
+
help_text="Number of entries in the stream"
|
22
|
+
)
|
23
|
+
consumer_group_exists = serializers.BooleanField(
|
24
|
+
required=False,
|
25
|
+
default=False,
|
26
|
+
help_text="Whether the consumer group exists"
|
27
|
+
)
|
28
|
+
recent_activity = serializers.BooleanField(
|
29
|
+
help_text="Whether there was recent activity (last 5 min)"
|
30
|
+
)
|
31
|
+
last_request_time = serializers.CharField(
|
32
|
+
required=False,
|
33
|
+
allow_null=True,
|
34
|
+
default=None,
|
35
|
+
help_text="ISO timestamp of last request"
|
36
|
+
)
|
37
|
+
error = serializers.CharField(
|
38
|
+
required=False,
|
39
|
+
allow_null=True,
|
40
|
+
help_text="Error message if any"
|
41
|
+
)
|
42
|
+
|
43
|
+
|
44
|
+
class OverviewStatsSerializer(serializers.Serializer):
|
45
|
+
"""Serializer for overview statistics."""
|
46
|
+
|
47
|
+
redis_connected = serializers.BooleanField(
|
48
|
+
required=False,
|
49
|
+
help_text="Whether Redis is connected"
|
50
|
+
)
|
51
|
+
total_requests_today = serializers.IntegerField(
|
52
|
+
help_text="Total requests processed today"
|
53
|
+
)
|
54
|
+
total_requests_hour = serializers.IntegerField(
|
55
|
+
required=False,
|
56
|
+
default=0,
|
57
|
+
help_text="Total requests in the last hour"
|
58
|
+
)
|
59
|
+
active_methods = serializers.ListField(
|
60
|
+
child=serializers.CharField(),
|
61
|
+
help_text="List of active RPC methods"
|
62
|
+
)
|
63
|
+
top_method = serializers.CharField(
|
64
|
+
allow_null=True,
|
65
|
+
help_text="Most frequently called method"
|
66
|
+
)
|
67
|
+
method_counts = serializers.DictField(
|
68
|
+
required=False,
|
69
|
+
help_text="Count of requests per method"
|
70
|
+
)
|
71
|
+
avg_response_time_ms = serializers.FloatField(
|
72
|
+
help_text="Average response time in milliseconds"
|
73
|
+
)
|
74
|
+
success_rate = serializers.FloatField(
|
75
|
+
help_text="Success rate percentage"
|
76
|
+
)
|
77
|
+
error_rate = serializers.FloatField(
|
78
|
+
required=False,
|
79
|
+
default=0.0,
|
80
|
+
help_text="Error rate percentage"
|
81
|
+
)
|
82
|
+
timestamp = serializers.CharField(
|
83
|
+
required=False,
|
84
|
+
help_text="ISO timestamp of the stats"
|
85
|
+
)
|
86
|
+
error = serializers.CharField(
|
87
|
+
required=False,
|
88
|
+
allow_null=True,
|
89
|
+
help_text="Error message if any"
|
90
|
+
)
|
91
|
+
|
92
|
+
|
93
|
+
class RPCRequestSerializer(serializers.Serializer):
|
94
|
+
"""Serializer for individual RPC request."""
|
95
|
+
|
96
|
+
id = serializers.CharField(
|
97
|
+
required=False,
|
98
|
+
help_text="Stream entry ID"
|
99
|
+
)
|
100
|
+
request_id = serializers.CharField(
|
101
|
+
required=False,
|
102
|
+
help_text="Unique request ID"
|
103
|
+
)
|
104
|
+
timestamp = serializers.CharField(
|
105
|
+
help_text="ISO timestamp of the request"
|
106
|
+
)
|
107
|
+
method = serializers.CharField(
|
108
|
+
allow_null=True,
|
109
|
+
help_text="RPC method name"
|
110
|
+
)
|
111
|
+
params = serializers.DictField(
|
112
|
+
allow_null=True,
|
113
|
+
required=False,
|
114
|
+
help_text="Request parameters"
|
115
|
+
)
|
116
|
+
correlation_id = serializers.CharField(
|
117
|
+
allow_null=True,
|
118
|
+
required=False,
|
119
|
+
help_text="Correlation ID for tracking"
|
120
|
+
)
|
121
|
+
source = serializers.CharField(
|
122
|
+
allow_null=True,
|
123
|
+
required=False,
|
124
|
+
help_text="Source of the request"
|
125
|
+
)
|
126
|
+
|
127
|
+
|
128
|
+
class RecentRequestsSerializer(serializers.Serializer):
|
129
|
+
"""Serializer for recent requests response."""
|
130
|
+
|
131
|
+
requests = serializers.ListField(
|
132
|
+
child=RPCRequestSerializer(),
|
133
|
+
help_text="List of recent RPC requests"
|
134
|
+
)
|
135
|
+
count = serializers.IntegerField(
|
136
|
+
help_text="Number of requests returned"
|
137
|
+
)
|
138
|
+
total_available = serializers.IntegerField(
|
139
|
+
help_text="Total number of requests available"
|
140
|
+
)
|
141
|
+
|
142
|
+
|
143
|
+
class NotificationTypeStatsSerializer(serializers.Serializer):
|
144
|
+
"""Serializer for notification type statistics."""
|
145
|
+
|
146
|
+
user_activity = serializers.IntegerField(default=0)
|
147
|
+
system_alert = serializers.IntegerField(default=0)
|
148
|
+
error_notification = serializers.IntegerField(default=0)
|
149
|
+
info_message = serializers.IntegerField(default=0)
|
150
|
+
|
151
|
+
|
152
|
+
class NotificationStatsSerializer(serializers.Serializer):
|
153
|
+
"""Serializer for notification statistics."""
|
154
|
+
|
155
|
+
total_sent = serializers.IntegerField(
|
156
|
+
help_text="Total notifications sent"
|
157
|
+
)
|
158
|
+
delivery_rate = serializers.FloatField(
|
159
|
+
help_text="Delivery success rate percentage"
|
160
|
+
)
|
161
|
+
by_type = serializers.DictField(
|
162
|
+
required=False,
|
163
|
+
help_text="Breakdown by notification type"
|
164
|
+
)
|
165
|
+
recent = serializers.ListField(
|
166
|
+
required=False,
|
167
|
+
help_text="Recent notifications"
|
168
|
+
)
|
169
|
+
last_sent = serializers.CharField(
|
170
|
+
allow_null=True,
|
171
|
+
required=False,
|
172
|
+
help_text="ISO timestamp of last notification"
|
173
|
+
)
|
174
|
+
timestamp = serializers.CharField(
|
175
|
+
required=False,
|
176
|
+
help_text="ISO timestamp of the stats"
|
177
|
+
)
|
178
|
+
error = serializers.CharField(
|
179
|
+
required=False,
|
180
|
+
allow_null=True,
|
181
|
+
help_text="Error message if any"
|
182
|
+
)
|
183
|
+
|
184
|
+
|
185
|
+
class MethodStatSerializer(serializers.Serializer):
|
186
|
+
"""Serializer for individual method statistics."""
|
187
|
+
|
188
|
+
method = serializers.CharField(
|
189
|
+
help_text="RPC method name"
|
190
|
+
)
|
191
|
+
count = serializers.IntegerField(
|
192
|
+
help_text="Number of calls"
|
193
|
+
)
|
194
|
+
percentage = serializers.FloatField(
|
195
|
+
help_text="Percentage of total calls"
|
196
|
+
)
|
197
|
+
avg_time_ms = serializers.FloatField(
|
198
|
+
required=False,
|
199
|
+
help_text="Average execution time in milliseconds"
|
200
|
+
)
|
201
|
+
avg_time = serializers.FloatField(
|
202
|
+
required=False,
|
203
|
+
help_text="Average execution time (alternative field)"
|
204
|
+
)
|
205
|
+
success_rate = serializers.FloatField(
|
206
|
+
required=False,
|
207
|
+
default=100.0,
|
208
|
+
help_text="Success rate percentage"
|
209
|
+
)
|
210
|
+
last_called = serializers.CharField(
|
211
|
+
allow_null=True,
|
212
|
+
required=False,
|
213
|
+
help_text="ISO timestamp of last call"
|
214
|
+
)
|
215
|
+
|
216
|
+
|
217
|
+
class MethodStatsSerializer(serializers.Serializer):
|
218
|
+
"""Serializer for method statistics response."""
|
219
|
+
|
220
|
+
methods = serializers.ListField(
|
221
|
+
child=MethodStatSerializer(),
|
222
|
+
help_text="List of method statistics"
|
223
|
+
)
|
224
|
+
count = serializers.IntegerField(
|
225
|
+
help_text="Total number of methods"
|
226
|
+
)
|
227
|
+
total_calls = serializers.IntegerField(
|
228
|
+
help_text="Total calls across all methods"
|
229
|
+
)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"""
|
2
|
+
RPC Client services for IPC module.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from .client import DjangoCfgRPCClient
|
6
|
+
from .config import DjangoCfgRPCConfig
|
7
|
+
from .exceptions import (
|
8
|
+
RPCConnectionError,
|
9
|
+
RPCError,
|
10
|
+
RPCInternalError,
|
11
|
+
RPCInvalidMethodError,
|
12
|
+
RPCTimeoutError,
|
13
|
+
)
|
14
|
+
|
15
|
+
__all__ = [
|
16
|
+
'DjangoCfgRPCClient',
|
17
|
+
'DjangoCfgRPCConfig',
|
18
|
+
'RPCError',
|
19
|
+
'RPCConnectionError',
|
20
|
+
'RPCTimeoutError',
|
21
|
+
'RPCInvalidMethodError',
|
22
|
+
'RPCInternalError',
|
23
|
+
]
|
@@ -9,18 +9,19 @@ Works with or without django-cfg-rpc installed:
|
|
9
9
|
- Without django-cfg-rpc: Basic dict-based communication
|
10
10
|
"""
|
11
11
|
|
12
|
-
import redis
|
13
12
|
import json
|
14
13
|
import logging
|
14
|
+
from typing import Any, Dict, Optional, Type, TypeVar
|
15
15
|
from uuid import uuid4
|
16
|
-
|
16
|
+
|
17
|
+
import redis
|
17
18
|
|
18
19
|
from .exceptions import (
|
19
|
-
RPCTimeoutError,
|
20
|
-
RPCRemoteError,
|
21
|
-
RPCConnectionError,
|
22
|
-
RPCConfigurationError,
|
23
20
|
HAS_DJANGO_CFG_RPC,
|
21
|
+
RPCConfigurationError,
|
22
|
+
RPCConnectionError,
|
23
|
+
RPCRemoteError,
|
24
|
+
RPCTimeoutError,
|
24
25
|
)
|
25
26
|
|
26
27
|
logger = logging.getLogger(__name__)
|
@@ -5,7 +5,7 @@ Provides specific exception types for better error handling and debugging.
|
|
5
5
|
Works independently or with django-cfg-rpc models.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Optional
|
9
9
|
|
10
10
|
# Try to import RPCError from django-cfg-rpc if available
|
11
11
|
try:
|
@@ -5,11 +5,10 @@ Reads RPC metrics from Redis DB 2 and provides statistics.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import json
|
8
|
-
import time
|
9
8
|
import logging
|
10
|
-
from typing import Dict, List, Any, Optional
|
11
|
-
from datetime import datetime, timedelta
|
12
9
|
from collections import defaultdict
|
10
|
+
from datetime import datetime, timedelta
|
11
|
+
from typing import Any, Dict, List
|
13
12
|
|
14
13
|
logger = logging.getLogger(__name__)
|
15
14
|
|
@@ -35,18 +34,30 @@ class RPCMonitor:
|
|
35
34
|
Args:
|
36
35
|
redis_client: Optional Redis client. If not provided, creates from config.
|
37
36
|
"""
|
38
|
-
|
39
|
-
from
|
40
|
-
|
37
|
+
from .client.config import DjangoCfgRPCConfig
|
38
|
+
from django_cfg.core import get_current_config
|
39
|
+
|
40
|
+
# Try to get config from django-cfg global state first
|
41
|
+
django_cfg_config = get_current_config()
|
42
|
+
|
43
|
+
if django_cfg_config and hasattr(django_cfg_config, 'django_ipc') and django_cfg_config.django_ipc:
|
44
|
+
# Use config from django-cfg DjangoConfig
|
45
|
+
self.config = django_cfg_config.django_ipc
|
46
|
+
logger.debug(f"RPCMonitor initialized from django-cfg config: {self.config.redis_url}")
|
47
|
+
else:
|
48
|
+
# Fallback to default config
|
49
|
+
self.config = DjangoCfgRPCConfig()
|
50
|
+
logger.warning("Django-CFG config not found, using default RPC config")
|
41
51
|
|
42
52
|
self.redis_client = redis_client or self._create_redis_client()
|
43
53
|
|
44
54
|
def _create_redis_client(self):
|
45
55
|
"""Create Redis client from config."""
|
46
56
|
try:
|
47
|
-
import redis
|
48
57
|
from urllib.parse import urlparse
|
49
58
|
|
59
|
+
import redis
|
60
|
+
|
50
61
|
# Use instance config (already loaded in __init__)
|
51
62
|
parsed = urlparse(self.config.redis_url)
|
52
63
|
|
@@ -243,6 +254,24 @@ class RPCMonitor:
|
|
243
254
|
logger.error(f"Error getting notification stats: {e}")
|
244
255
|
return self._error_response(str(e))
|
245
256
|
|
257
|
+
def get_total_requests_count(self) -> int:
|
258
|
+
"""
|
259
|
+
Get total number of requests in the stream.
|
260
|
+
|
261
|
+
Returns:
|
262
|
+
Total count of requests in the stream
|
263
|
+
"""
|
264
|
+
if not self.redis_client:
|
265
|
+
return 0
|
266
|
+
|
267
|
+
try:
|
268
|
+
# Get stream length
|
269
|
+
stream_len = self.redis_client.xlen(self.config.request_stream)
|
270
|
+
return stream_len or 0
|
271
|
+
except Exception as e:
|
272
|
+
logger.error(f"Error getting total requests count: {e}")
|
273
|
+
return 0
|
274
|
+
|
246
275
|
def get_method_stats(self) -> List[Dict[str, Any]]:
|
247
276
|
"""
|
248
277
|
Get statistics grouped by RPC method.
|