django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,12 +4,12 @@ Support Admin Views
|
|
4
4
|
Admin-specific views for managing support tickets.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.shortcuts import render, get_object_or_404, redirect
|
8
|
-
from django.contrib.admin.views.decorators import staff_member_required
|
9
7
|
from django.contrib import messages as dj_messages
|
8
|
+
from django.contrib.admin.views.decorators import staff_member_required
|
9
|
+
from django.shortcuts import get_object_or_404, redirect, render
|
10
10
|
from django.urls import reverse
|
11
11
|
|
12
|
-
from ..models import Ticket
|
12
|
+
from ..models import Ticket
|
13
13
|
|
14
14
|
|
15
15
|
@staff_member_required
|
@@ -20,10 +20,10 @@ def ticket_admin_chat_view(request, ticket_uuid):
|
|
20
20
|
Enhanced version with admin tools and quick actions.
|
21
21
|
"""
|
22
22
|
ticket = get_object_or_404(Ticket, uuid=ticket_uuid)
|
23
|
-
|
23
|
+
|
24
24
|
# Get all messages for this ticket
|
25
25
|
messages = ticket.messages.all().order_by('created_at')
|
26
|
-
|
26
|
+
|
27
27
|
# Handle quick status change
|
28
28
|
if request.method == 'POST' and 'change_status' in request.POST:
|
29
29
|
new_status = request.POST.get('status')
|
@@ -31,13 +31,13 @@ def ticket_admin_chat_view(request, ticket_uuid):
|
|
31
31
|
old_status = ticket.get_status_display()
|
32
32
|
ticket.status = new_status
|
33
33
|
ticket.save()
|
34
|
-
|
34
|
+
|
35
35
|
dj_messages.success(
|
36
|
-
request,
|
36
|
+
request,
|
37
37
|
f'Ticket status changed from "{old_status}" to "{ticket.get_status_display()}"'
|
38
38
|
)
|
39
39
|
return redirect(request.path)
|
40
|
-
|
40
|
+
|
41
41
|
context = {
|
42
42
|
'ticket': ticket,
|
43
43
|
'messages': messages,
|
@@ -46,5 +46,5 @@ def ticket_admin_chat_view(request, ticket_uuid):
|
|
46
46
|
'status_choices': Ticket.STATUS_CHOICES,
|
47
47
|
'admin_chat_url': reverse('admin:django_cfg_support_ticket_change', args=[ticket.pk]),
|
48
48
|
}
|
49
|
-
|
49
|
+
|
50
50
|
return render(request, 'support/admin/ticket_admin_chat.html', context)
|
@@ -4,10 +4,11 @@ Support API Views
|
|
4
4
|
REST API ViewSets for tickets and messages.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
|
10
|
-
from ..
|
7
|
+
from drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema
|
8
|
+
from rest_framework import permissions, viewsets
|
9
|
+
|
10
|
+
from ..models import Message, Ticket
|
11
|
+
from ..serializers import MessageCreateSerializer, MessageSerializer, TicketSerializer
|
11
12
|
|
12
13
|
|
13
14
|
class TicketViewSet(viewsets.ModelViewSet):
|
@@ -22,7 +23,7 @@ class TicketViewSet(viewsets.ModelViewSet):
|
|
22
23
|
# Handle swagger fake view
|
23
24
|
if getattr(self, 'swagger_fake_view', False):
|
24
25
|
return Ticket.objects.none()
|
25
|
-
|
26
|
+
|
26
27
|
if self.request.user.is_staff:
|
27
28
|
return Ticket.objects.all().order_by('-created_at')
|
28
29
|
return Ticket.objects.filter(user=self.request.user).order_by('-created_at')
|
@@ -145,16 +146,16 @@ class MessageViewSet(viewsets.ModelViewSet):
|
|
145
146
|
# Handle swagger fake view
|
146
147
|
if getattr(self, 'swagger_fake_view', False):
|
147
148
|
return Message.objects.none()
|
148
|
-
|
149
|
+
|
149
150
|
ticket_uuid = self.kwargs.get('ticket_uuid')
|
150
|
-
|
151
|
+
|
151
152
|
# Base queryset filtered by ticket
|
152
153
|
queryset = Message.objects.filter(ticket__uuid=ticket_uuid)
|
153
|
-
|
154
|
+
|
154
155
|
# Additional permission filtering
|
155
156
|
if not self.request.user.is_staff:
|
156
157
|
queryset = queryset.filter(ticket__user=self.request.user)
|
157
|
-
|
158
|
+
|
158
159
|
return queryset.order_by('created_at')
|
159
160
|
|
160
161
|
def get_serializer_class(self):
|
@@ -4,14 +4,14 @@ Support Chat Views
|
|
4
4
|
Beautiful chat interface for support tickets with Tailwind CSS.
|
5
5
|
"""
|
6
6
|
|
7
|
-
|
7
|
+
import json
|
8
|
+
|
8
9
|
from django.contrib.auth.decorators import login_required
|
9
10
|
from django.http import JsonResponse
|
11
|
+
from django.shortcuts import get_object_or_404, render
|
10
12
|
from django.views.decorators.http import require_POST
|
11
|
-
from django.contrib import messages as dj_messages
|
12
|
-
import json
|
13
13
|
|
14
|
-
from ..models import
|
14
|
+
from ..models import Message, Ticket
|
15
15
|
|
16
16
|
|
17
17
|
@login_required
|
@@ -23,23 +23,23 @@ def ticket_chat_view(request, ticket_uuid):
|
|
23
23
|
with real-time messaging capabilities.
|
24
24
|
"""
|
25
25
|
ticket = get_object_or_404(Ticket, uuid=ticket_uuid)
|
26
|
-
|
26
|
+
|
27
27
|
# Check permissions
|
28
28
|
if not request.user.is_staff and ticket.user != request.user:
|
29
29
|
return render(request, 'support/chat/access_denied.html', {
|
30
30
|
'ticket': ticket
|
31
31
|
})
|
32
|
-
|
32
|
+
|
33
33
|
# Get all messages for this ticket
|
34
34
|
messages = ticket.messages.all().order_by('created_at')
|
35
|
-
|
35
|
+
|
36
36
|
context = {
|
37
37
|
'ticket': ticket,
|
38
38
|
'messages': messages,
|
39
39
|
'user': request.user,
|
40
40
|
'is_staff': request.user.is_staff,
|
41
41
|
}
|
42
|
-
|
42
|
+
|
43
43
|
return render(request, 'support/chat/ticket_chat.html', context)
|
44
44
|
|
45
45
|
|
@@ -53,31 +53,31 @@ def send_message_ajax(request, ticket_uuid):
|
|
53
53
|
"""
|
54
54
|
try:
|
55
55
|
ticket = get_object_or_404(Ticket, uuid=ticket_uuid)
|
56
|
-
|
56
|
+
|
57
57
|
# Check permissions
|
58
58
|
if not request.user.is_staff and ticket.user != request.user:
|
59
59
|
return JsonResponse({
|
60
60
|
'success': False,
|
61
61
|
'error': 'Permission denied'
|
62
62
|
}, status=403)
|
63
|
-
|
63
|
+
|
64
64
|
# Parse JSON data
|
65
65
|
data = json.loads(request.body)
|
66
66
|
message_text = data.get('text', '').strip()
|
67
|
-
|
67
|
+
|
68
68
|
if not message_text:
|
69
69
|
return JsonResponse({
|
70
70
|
'success': False,
|
71
71
|
'error': 'Message text is required'
|
72
72
|
}, status=400)
|
73
|
-
|
73
|
+
|
74
74
|
# Create message
|
75
75
|
message = Message.objects.create(
|
76
76
|
ticket=ticket,
|
77
77
|
sender=request.user,
|
78
78
|
text=message_text
|
79
79
|
)
|
80
|
-
|
80
|
+
|
81
81
|
# Return message data
|
82
82
|
return JsonResponse({
|
83
83
|
'success': True,
|
@@ -95,7 +95,7 @@ def send_message_ajax(request, ticket_uuid):
|
|
95
95
|
}
|
96
96
|
}
|
97
97
|
})
|
98
|
-
|
98
|
+
|
99
99
|
except json.JSONDecodeError:
|
100
100
|
return JsonResponse({
|
101
101
|
'success': False,
|
@@ -6,38 +6,29 @@ Only available if django-dramatiq is installed.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import logging
|
9
|
-
|
10
|
-
import sys
|
11
|
-
from typing import Dict, Any, Optional
|
12
|
-
from django.db.models import Count
|
9
|
+
|
13
10
|
from django.contrib import admin, messages
|
14
11
|
from django.contrib.admin.views.main import ChangeList
|
15
|
-
from django.
|
16
|
-
from django.urls import path
|
17
|
-
from django.views.decorators.csrf import csrf_exempt
|
18
|
-
from django.db import models
|
19
|
-
from django.db.models import Q
|
12
|
+
from django.db.models import Count
|
20
13
|
from unfold.admin import ModelAdmin
|
21
14
|
|
22
15
|
from django_cfg.modules.django_admin import (
|
23
|
-
|
16
|
+
ActionVariant,
|
24
17
|
DisplayMixin,
|
25
|
-
StatusBadgeConfig,
|
26
|
-
DateTimeDisplayConfig,
|
27
18
|
Icons,
|
28
|
-
|
29
|
-
display,
|
30
|
-
action,
|
19
|
+
OptimizedModelAdmin,
|
31
20
|
StandaloneActionsMixin,
|
32
|
-
|
21
|
+
action,
|
22
|
+
display,
|
23
|
+
standalone_action,
|
33
24
|
)
|
34
25
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
35
26
|
from django_cfg.modules.django_tasks import DjangoTasks
|
36
27
|
|
37
28
|
# Try to import django-dramatiq components
|
38
29
|
try:
|
39
|
-
from django_dramatiq.models import Task
|
40
30
|
from django_dramatiq.admin import TaskAdmin as BaseDramatiqTaskAdmin
|
31
|
+
from django_dramatiq.models import Task
|
41
32
|
DRAMATIQ_AVAILABLE = True
|
42
33
|
except ImportError:
|
43
34
|
Task = None
|
@@ -46,10 +37,10 @@ except ImportError:
|
|
46
37
|
|
47
38
|
|
48
39
|
if DRAMATIQ_AVAILABLE:
|
49
|
-
|
40
|
+
|
50
41
|
class TaskQueueChangeList(ChangeList):
|
51
42
|
"""Custom changelist for task queue management."""
|
52
|
-
|
43
|
+
|
53
44
|
def __init__(self, *args, **kwargs):
|
54
45
|
super().__init__(*args, **kwargs)
|
55
46
|
self.tasks_service = DjangoTasks()
|
@@ -57,39 +48,39 @@ if DRAMATIQ_AVAILABLE:
|
|
57
48
|
|
58
49
|
class TaskQueueAdminMixin(OptimizedModelAdmin, DisplayMixin, StandaloneActionsMixin):
|
59
50
|
"""Mixin for task queue management functionality."""
|
60
|
-
|
51
|
+
|
61
52
|
# change_list_template = 'admin/tasks/taskqueue/change_list.html'
|
62
53
|
# actions_list = ['start_workers', 'clear_queues', 'refresh_status']
|
63
|
-
|
54
|
+
|
64
55
|
def has_add_permission(self, request):
|
65
56
|
return False
|
66
|
-
|
57
|
+
|
67
58
|
def has_change_permission(self, request, obj=None):
|
68
59
|
return True
|
69
|
-
|
60
|
+
|
70
61
|
def has_delete_permission(self, request, obj=None):
|
71
62
|
return False
|
72
|
-
|
63
|
+
|
73
64
|
def get_changelist(self, request, **kwargs):
|
74
65
|
return TaskQueueChangeList
|
75
|
-
|
66
|
+
|
76
67
|
def changelist_view(self, request, extra_context=None):
|
77
68
|
"""Enhanced changelist with queue statistics."""
|
78
69
|
extra_context = extra_context or {}
|
79
|
-
|
70
|
+
|
80
71
|
try:
|
81
72
|
tasks_service = DjangoTasks()
|
82
|
-
|
73
|
+
|
83
74
|
# Queue statistics
|
84
75
|
total_tasks = Task.objects.count()
|
85
76
|
pending_tasks = Task.objects.filter(status='pending').count()
|
86
77
|
running_tasks = Task.objects.filter(status='running').count()
|
87
78
|
failed_tasks = Task.objects.filter(status='failed').count()
|
88
79
|
completed_tasks = Task.objects.filter(status='done').count()
|
89
|
-
|
80
|
+
|
90
81
|
# Queue status
|
91
82
|
queue_stats = tasks_service.get_queue_stats()
|
92
|
-
|
83
|
+
|
93
84
|
extra_context.update({
|
94
85
|
'queue_statistics': {
|
95
86
|
'total_tasks': total_tasks,
|
@@ -101,12 +92,12 @@ if DRAMATIQ_AVAILABLE:
|
|
101
92
|
'queue_status': queue_stats,
|
102
93
|
'workers_running': tasks_service.are_workers_running(),
|
103
94
|
})
|
104
|
-
|
95
|
+
|
105
96
|
except Exception as e:
|
106
97
|
extra_context['queue_error'] = str(e)
|
107
|
-
|
98
|
+
|
108
99
|
return super().changelist_view(request, extra_context)
|
109
|
-
|
100
|
+
|
110
101
|
@display(description="Queue Status")
|
111
102
|
def queue_status_display(self, obj):
|
112
103
|
"""Display queue status with badge."""
|
@@ -115,7 +106,7 @@ if DRAMATIQ_AVAILABLE:
|
|
115
106
|
variant="success",
|
116
107
|
icon=Icons.PLAY_ARROW
|
117
108
|
)
|
118
|
-
|
109
|
+
|
119
110
|
@display(description="Worker Status")
|
120
111
|
def worker_status_display(self, obj):
|
121
112
|
"""Display worker status."""
|
@@ -124,14 +115,14 @@ if DRAMATIQ_AVAILABLE:
|
|
124
115
|
variant="info",
|
125
116
|
icon=Icons.SETTINGS
|
126
117
|
)
|
127
|
-
|
118
|
+
|
128
119
|
@display(description="Task Statistics")
|
129
120
|
def task_stats_display(self, obj):
|
130
121
|
"""Display task statistics."""
|
131
122
|
total = Task.objects.count()
|
132
123
|
pending = Task.objects.filter(status='pending').count()
|
133
124
|
return f"Total: {total}, Pending: {pending}"
|
134
|
-
|
125
|
+
|
135
126
|
@standalone_action(
|
136
127
|
description="Start Workers",
|
137
128
|
icon=Icons.PLAY_ARROW,
|
@@ -149,7 +140,7 @@ if DRAMATIQ_AVAILABLE:
|
|
149
140
|
except Exception as e:
|
150
141
|
logging.error(f"Failed to start workers: {e}")
|
151
142
|
return False
|
152
|
-
|
143
|
+
|
153
144
|
@standalone_action(
|
154
145
|
description="Clear Queues",
|
155
146
|
icon=Icons.CLEAR_ALL,
|
@@ -167,7 +158,7 @@ if DRAMATIQ_AVAILABLE:
|
|
167
158
|
except Exception as e:
|
168
159
|
logging.error(f"Failed to clear queues: {e}")
|
169
160
|
return False
|
170
|
-
|
161
|
+
|
171
162
|
@standalone_action(
|
172
163
|
description="Refresh Status",
|
173
164
|
icon=Icons.REFRESH,
|
@@ -189,26 +180,26 @@ if DRAMATIQ_AVAILABLE:
|
|
189
180
|
@admin.register(Task)
|
190
181
|
class TaskAdmin(TaskQueueAdminMixin, ModelAdmin):
|
191
182
|
"""Enhanced admin for Dramatiq Task model with queue management functionality."""
|
192
|
-
|
183
|
+
|
193
184
|
list_display = [
|
194
|
-
'id_display', 'actor_name_display', 'status_display',
|
185
|
+
'id_display', 'actor_name_display', 'status_display',
|
195
186
|
'queue_name_display', 'created_at_display'
|
196
187
|
]
|
197
|
-
|
188
|
+
|
198
189
|
list_filter = [
|
199
|
-
'status', 'queue_name', 'actor_name',
|
190
|
+
'status', 'queue_name', 'actor_name',
|
200
191
|
'created_at', 'updated_at'
|
201
192
|
]
|
202
|
-
|
193
|
+
|
203
194
|
search_fields = ['actor_name', 'queue_name', 'message_id']
|
204
|
-
|
195
|
+
|
205
196
|
readonly_fields = [
|
206
197
|
'id_display', 'actor_name', 'queue_name',
|
207
198
|
'args_preview', 'kwargs_preview', 'result_preview',
|
208
199
|
'created_at_display', 'started_at_display', 'finished_at_display',
|
209
200
|
'duration_display', 'retries_display', 'error_message_display'
|
210
201
|
]
|
211
|
-
|
202
|
+
|
212
203
|
fieldsets = (
|
213
204
|
('Task Information', {
|
214
205
|
'fields': ('id_display', 'status', 'actor_name', 'queue_name')
|
@@ -223,30 +214,30 @@ if DRAMATIQ_AVAILABLE:
|
|
223
214
|
'fields': ('retries_display',)
|
224
215
|
}),
|
225
216
|
)
|
226
|
-
|
217
|
+
|
227
218
|
actions = ['retry_failed_tasks', 'cancel_pending_tasks']
|
228
|
-
|
219
|
+
|
229
220
|
def changelist_view(self, request, extra_context=None):
|
230
221
|
"""Enhanced changelist with task statistics."""
|
231
222
|
extra_context = extra_context or {}
|
232
|
-
|
223
|
+
|
233
224
|
try:
|
234
225
|
# Task statistics
|
235
226
|
total_tasks = self.get_queryset(request).count()
|
236
227
|
status_stats = self.get_queryset(request).values('status').annotate(
|
237
228
|
count=Count('id')
|
238
229
|
).order_by('status')
|
239
|
-
|
230
|
+
|
240
231
|
# Actor statistics
|
241
232
|
actor_stats = self.get_queryset(request).values('actor_name').annotate(
|
242
233
|
count=Count('id')
|
243
234
|
).order_by('-count')[:10]
|
244
|
-
|
235
|
+
|
245
236
|
# Queue statistics
|
246
237
|
queue_stats = self.get_queryset(request).values('queue_name').annotate(
|
247
238
|
count=Count('id')
|
248
239
|
).order_by('-count')
|
249
|
-
|
240
|
+
|
250
241
|
extra_context.update({
|
251
242
|
'task_statistics': {
|
252
243
|
'total_tasks': total_tasks,
|
@@ -255,12 +246,12 @@ if DRAMATIQ_AVAILABLE:
|
|
255
246
|
'queue_distribution': list(queue_stats),
|
256
247
|
}
|
257
248
|
})
|
258
|
-
|
249
|
+
|
259
250
|
except Exception as e:
|
260
251
|
extra_context['task_error'] = str(e)
|
261
|
-
|
252
|
+
|
262
253
|
return super().changelist_view(request, extra_context)
|
263
|
-
|
254
|
+
|
264
255
|
@display(description="Task ID")
|
265
256
|
def id_display(self, obj):
|
266
257
|
"""Display task ID with icon."""
|
@@ -269,7 +260,7 @@ if DRAMATIQ_AVAILABLE:
|
|
269
260
|
variant="info",
|
270
261
|
icon=Icons.TAG
|
271
262
|
)
|
272
|
-
|
263
|
+
|
273
264
|
@display(description="Actor")
|
274
265
|
def actor_name_display(self, obj):
|
275
266
|
"""Display actor name with icon."""
|
@@ -278,18 +269,18 @@ if DRAMATIQ_AVAILABLE:
|
|
278
269
|
variant="default",
|
279
270
|
icon=Icons.FUNCTIONS
|
280
271
|
)
|
281
|
-
|
272
|
+
|
282
273
|
@display(description="Status")
|
283
274
|
def status_display(self, obj):
|
284
275
|
"""Display task status with appropriate badge."""
|
285
276
|
status_variants = {
|
286
277
|
'pending': 'warning',
|
287
|
-
'running': 'info',
|
278
|
+
'running': 'info',
|
288
279
|
'done': 'success',
|
289
280
|
'failed': 'danger',
|
290
281
|
'cancelled': 'secondary'
|
291
282
|
}
|
292
|
-
|
283
|
+
|
293
284
|
status_icons = {
|
294
285
|
'pending': Icons.SCHEDULE,
|
295
286
|
'running': Icons.PLAY_ARROW,
|
@@ -297,13 +288,13 @@ if DRAMATIQ_AVAILABLE:
|
|
297
288
|
'failed': Icons.ERROR,
|
298
289
|
'cancelled': Icons.CANCEL
|
299
290
|
}
|
300
|
-
|
291
|
+
|
301
292
|
return StatusBadge.create(
|
302
293
|
text=obj.status.title(),
|
303
294
|
variant=status_variants.get(obj.status, 'default'),
|
304
295
|
icon=status_icons.get(obj.status, Icons.HELP)
|
305
296
|
)
|
306
|
-
|
297
|
+
|
307
298
|
@display(description="Queue")
|
308
299
|
def queue_name_display(self, obj):
|
309
300
|
"""Display queue name."""
|
@@ -312,26 +303,26 @@ if DRAMATIQ_AVAILABLE:
|
|
312
303
|
variant="info",
|
313
304
|
icon=Icons.QUEUE
|
314
305
|
)
|
315
|
-
|
306
|
+
|
316
307
|
@display(description="Created")
|
317
308
|
def created_at_display(self, obj):
|
318
309
|
"""Display creation time."""
|
319
310
|
return self.display_datetime_relative(obj.created_at)
|
320
|
-
|
311
|
+
|
321
312
|
@display(description="Started")
|
322
313
|
def started_at_display(self, obj):
|
323
314
|
"""Display start time."""
|
324
315
|
if obj.started_at:
|
325
316
|
return self.display_datetime_relative(obj.started_at)
|
326
317
|
return "Not started"
|
327
|
-
|
318
|
+
|
328
319
|
@display(description="Finished")
|
329
320
|
def finished_at_display(self, obj):
|
330
321
|
"""Display finish time."""
|
331
322
|
if obj.finished_at:
|
332
323
|
return self.display_datetime_relative(obj.finished_at)
|
333
324
|
return "Not finished"
|
334
|
-
|
325
|
+
|
335
326
|
@display(description="Duration")
|
336
327
|
def duration_display(self, obj):
|
337
328
|
"""Display task duration."""
|
@@ -339,7 +330,7 @@ if DRAMATIQ_AVAILABLE:
|
|
339
330
|
duration = obj.finished_at - obj.started_at
|
340
331
|
return f"{duration.total_seconds():.2f}s"
|
341
332
|
return "N/A"
|
342
|
-
|
333
|
+
|
343
334
|
@display(description="Retries")
|
344
335
|
def retries_display(self, obj):
|
345
336
|
"""Display retry count."""
|
@@ -351,7 +342,7 @@ if DRAMATIQ_AVAILABLE:
|
|
351
342
|
icon=Icons.REFRESH
|
352
343
|
)
|
353
344
|
return "0"
|
354
|
-
|
345
|
+
|
355
346
|
@display(description="Error")
|
356
347
|
def error_message_display(self, obj):
|
357
348
|
"""Display error message preview."""
|
@@ -361,7 +352,7 @@ if DRAMATIQ_AVAILABLE:
|
|
361
352
|
error_text = error_text[:100] + "..."
|
362
353
|
return error_text
|
363
354
|
return "No error"
|
364
|
-
|
355
|
+
|
365
356
|
@display(description="Arguments")
|
366
357
|
def args_preview(self, obj):
|
367
358
|
"""Display task arguments preview."""
|
@@ -371,7 +362,7 @@ if DRAMATIQ_AVAILABLE:
|
|
371
362
|
args_text = args_text[:100] + "..."
|
372
363
|
return args_text
|
373
364
|
return "No arguments"
|
374
|
-
|
365
|
+
|
375
366
|
@display(description="Keyword Arguments")
|
376
367
|
def kwargs_preview(self, obj):
|
377
368
|
"""Display task keyword arguments preview."""
|
@@ -381,7 +372,7 @@ if DRAMATIQ_AVAILABLE:
|
|
381
372
|
kwargs_text = kwargs_text[:100] + "..."
|
382
373
|
return kwargs_text
|
383
374
|
return "No kwargs"
|
384
|
-
|
375
|
+
|
385
376
|
@display(description="Result")
|
386
377
|
def result_preview(self, obj):
|
387
378
|
"""Display task result preview."""
|
@@ -391,25 +382,25 @@ if DRAMATIQ_AVAILABLE:
|
|
391
382
|
result_text = result_text[:100] + "..."
|
392
383
|
return result_text
|
393
384
|
return "No result"
|
394
|
-
|
385
|
+
|
395
386
|
@action(description="Retry Failed Tasks", variant=ActionVariant.WARNING)
|
396
387
|
def retry_failed_tasks(self, request, queryset):
|
397
388
|
"""Retry selected failed tasks."""
|
398
389
|
failed_tasks = queryset.filter(status='failed')
|
399
390
|
count = failed_tasks.count()
|
400
|
-
|
391
|
+
|
401
392
|
if count > 0:
|
402
393
|
# Here you would implement the retry logic
|
403
394
|
messages.success(request, f"Queued {count} tasks for retry.")
|
404
395
|
else:
|
405
396
|
messages.warning(request, "No failed tasks selected.")
|
406
|
-
|
397
|
+
|
407
398
|
@action(description="Cancel Pending Tasks", variant=ActionVariant.DANGER)
|
408
399
|
def cancel_pending_tasks(self, request, queryset):
|
409
400
|
"""Cancel selected pending tasks."""
|
410
401
|
pending_tasks = queryset.filter(status='pending')
|
411
402
|
count = pending_tasks.count()
|
412
|
-
|
403
|
+
|
413
404
|
if count > 0:
|
414
405
|
pending_tasks.update(status='cancelled')
|
415
406
|
messages.success(request, f"Cancelled {count} pending tasks.")
|
@@ -424,7 +415,7 @@ else:
|
|
424
415
|
class TaskQueueAdmin:
|
425
416
|
"""Placeholder when django-dramatiq is not available."""
|
426
417
|
pass
|
427
|
-
|
418
|
+
|
428
419
|
class TaskAdmin:
|
429
420
|
"""Placeholder when django-dramatiq is not available."""
|
430
|
-
pass
|
421
|
+
pass
|
django_cfg/apps/tasks/apps.py
CHANGED
@@ -7,11 +7,11 @@ from django.apps import AppConfig
|
|
7
7
|
|
8
8
|
class TasksConfig(AppConfig):
|
9
9
|
"""Configuration for Django CFG Tasks app."""
|
10
|
-
|
10
|
+
|
11
11
|
default_auto_field = 'django.db.models.BigAutoField'
|
12
12
|
name = 'django_cfg.apps.tasks'
|
13
13
|
verbose_name = 'Background Tasks'
|
14
|
-
|
14
|
+
|
15
15
|
def ready(self):
|
16
16
|
"""Initialize app when Django starts."""
|
17
17
|
pass
|
@@ -4,13 +4,13 @@ Serializers for Django CFG Tasks app.
|
|
4
4
|
Provides DRF serializers for task management API endpoints.
|
5
5
|
"""
|
6
6
|
|
7
|
+
|
7
8
|
from rest_framework import serializers
|
8
|
-
from typing import Dict, Any
|
9
9
|
|
10
10
|
|
11
11
|
class QueueStatusSerializer(serializers.Serializer):
|
12
12
|
"""Serializer for queue status data."""
|
13
|
-
|
13
|
+
|
14
14
|
queues = serializers.DictField(
|
15
15
|
child=serializers.DictField(
|
16
16
|
child=serializers.IntegerField()
|
@@ -25,7 +25,7 @@ class QueueStatusSerializer(serializers.Serializer):
|
|
25
25
|
|
26
26
|
class TaskStatisticsSerializer(serializers.Serializer):
|
27
27
|
"""Serializer for task statistics data."""
|
28
|
-
|
28
|
+
|
29
29
|
statistics = serializers.DictField(
|
30
30
|
child=serializers.IntegerField(),
|
31
31
|
help_text="Task count statistics"
|
@@ -40,7 +40,7 @@ class TaskStatisticsSerializer(serializers.Serializer):
|
|
40
40
|
|
41
41
|
class WorkerActionSerializer(serializers.Serializer):
|
42
42
|
"""Serializer for worker management actions."""
|
43
|
-
|
43
|
+
|
44
44
|
action = serializers.ChoiceField(
|
45
45
|
choices=['start', 'stop', 'restart'],
|
46
46
|
help_text="Action to perform on workers"
|
@@ -61,7 +61,7 @@ class WorkerActionSerializer(serializers.Serializer):
|
|
61
61
|
|
62
62
|
class QueueActionSerializer(serializers.Serializer):
|
63
63
|
"""Serializer for queue management actions."""
|
64
|
-
|
64
|
+
|
65
65
|
action = serializers.ChoiceField(
|
66
66
|
choices=['clear', 'clear_all', 'purge', 'purge_failed', 'flush'],
|
67
67
|
help_text="Action to perform on queues"
|
@@ -75,7 +75,7 @@ class QueueActionSerializer(serializers.Serializer):
|
|
75
75
|
|
76
76
|
class APIResponseSerializer(serializers.Serializer):
|
77
77
|
"""Standard API response serializer."""
|
78
|
-
|
78
|
+
|
79
79
|
success = serializers.BooleanField(help_text="Operation success status")
|
80
80
|
message = serializers.CharField(required=False, help_text="Success message")
|
81
81
|
error = serializers.CharField(required=False, help_text="Error message")
|