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
@@ -5,23 +5,25 @@ Provides DRF ViewSets for task management with nested router structure.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Dict
|
9
9
|
|
10
|
-
from
|
11
|
-
from rest_framework
|
12
|
-
from rest_framework.
|
13
|
-
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
|
10
|
+
from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema
|
11
|
+
from rest_framework import status, viewsets
|
12
|
+
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
|
14
13
|
from rest_framework.decorators import action
|
15
|
-
from
|
14
|
+
from rest_framework.permissions import IsAdminUser
|
15
|
+
from rest_framework.response import Response
|
16
16
|
|
17
17
|
from django_cfg.modules.django_tasks import DjangoTasks
|
18
|
+
|
18
19
|
from ..serializers import (
|
20
|
+
APIResponseSerializer,
|
21
|
+
QueueActionSerializer,
|
19
22
|
QueueStatusSerializer,
|
20
23
|
TaskStatisticsSerializer,
|
21
24
|
WorkerActionSerializer,
|
22
|
-
QueueActionSerializer,
|
23
|
-
APIResponseSerializer
|
24
25
|
)
|
26
|
+
|
25
27
|
logger = logging.getLogger(__name__)
|
26
28
|
|
27
29
|
|
@@ -31,11 +33,11 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
31
33
|
|
32
34
|
Provides all task-related operations in a single ViewSet with nested actions.
|
33
35
|
"""
|
34
|
-
|
36
|
+
|
35
37
|
authentication_classes = [SessionAuthentication, BasicAuthentication]
|
36
38
|
permission_classes = [IsAdminUser]
|
37
39
|
serializer_class = APIResponseSerializer # Default serializer for the viewset
|
38
|
-
|
40
|
+
|
39
41
|
def get_serializer_class(self):
|
40
42
|
"""Return the appropriate serializer class based on the action."""
|
41
43
|
if self.action == 'queue_status':
|
@@ -47,7 +49,7 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
47
49
|
elif self.action == 'task_statistics':
|
48
50
|
return TaskStatisticsSerializer
|
49
51
|
return APIResponseSerializer
|
50
|
-
|
52
|
+
|
51
53
|
@action(detail=False, methods=['get'], url_path='queues/status')
|
52
54
|
@extend_schema(
|
53
55
|
summary="Get queue status",
|
@@ -64,19 +66,19 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
64
66
|
from ..utils.simulator import TaskSimulator
|
65
67
|
simulator = TaskSimulator()
|
66
68
|
status_data = simulator.get_current_queue_status()
|
67
|
-
|
69
|
+
|
68
70
|
return Response({
|
69
71
|
'success': True,
|
70
72
|
'data': status_data
|
71
73
|
})
|
72
|
-
|
74
|
+
|
73
75
|
except Exception as e:
|
74
76
|
logger.error(f"Queue status API error: {e}")
|
75
77
|
return Response({
|
76
78
|
'success': False,
|
77
79
|
'error': str(e)
|
78
80
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
79
|
-
|
81
|
+
|
80
82
|
@action(detail=False, methods=['post'], url_path='queues/manage')
|
81
83
|
@extend_schema(
|
82
84
|
summary="Manage queues",
|
@@ -99,12 +101,12 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
99
101
|
'error': 'Invalid request data',
|
100
102
|
'details': serializer.errors
|
101
103
|
}, status=status.HTTP_400_BAD_REQUEST)
|
102
|
-
|
104
|
+
|
103
105
|
action_type = serializer.validated_data['action']
|
104
106
|
queue_name = serializer.validated_data.get('queue_name')
|
105
|
-
|
107
|
+
|
106
108
|
tasks_service = DjangoTasks()
|
107
|
-
|
109
|
+
|
108
110
|
if action_type == 'clear_all':
|
109
111
|
result = self._clear_all_queues(tasks_service)
|
110
112
|
elif action_type == 'clear_queue' and queue_name:
|
@@ -116,19 +118,19 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
116
118
|
'success': False,
|
117
119
|
'error': 'Invalid action or missing queue_name'
|
118
120
|
}, status=status.HTTP_400_BAD_REQUEST)
|
119
|
-
|
121
|
+
|
120
122
|
return Response({
|
121
123
|
'success': True,
|
122
124
|
'data': result
|
123
125
|
})
|
124
|
-
|
126
|
+
|
125
127
|
except Exception as e:
|
126
128
|
logger.error(f"Queue management API error: {e}")
|
127
129
|
return Response({
|
128
130
|
'success': False,
|
129
131
|
'error': str(e)
|
130
132
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
131
|
-
|
133
|
+
|
132
134
|
@action(detail=False, methods=['get'], url_path='tasks/stats')
|
133
135
|
@extend_schema(
|
134
136
|
summary="Get task statistics",
|
@@ -145,19 +147,19 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
145
147
|
from ..utils.simulator import TaskSimulator
|
146
148
|
simulator = TaskSimulator()
|
147
149
|
stats_data = simulator.get_current_task_statistics()
|
148
|
-
|
150
|
+
|
149
151
|
return Response({
|
150
152
|
'success': True,
|
151
153
|
'data': stats_data
|
152
154
|
})
|
153
|
-
|
155
|
+
|
154
156
|
except Exception as e:
|
155
157
|
logger.error(f"Task statistics API error: {e}")
|
156
158
|
return Response({
|
157
159
|
'success': False,
|
158
160
|
'error': str(e)
|
159
161
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
160
|
-
|
162
|
+
|
161
163
|
@action(detail=False, methods=['get'], url_path='tasks/list')
|
162
164
|
@extend_schema(
|
163
165
|
summary="Get task list",
|
@@ -179,7 +181,7 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
179
181
|
try:
|
180
182
|
from ..utils.simulator import TaskSimulator
|
181
183
|
simulator = TaskSimulator()
|
182
|
-
|
184
|
+
|
183
185
|
# For now, return mock task data since we don't have real task list in simulator
|
184
186
|
# This could be enhanced later to support real task data
|
185
187
|
mock_data = {
|
@@ -231,19 +233,19 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
231
233
|
},
|
232
234
|
'simulated': True
|
233
235
|
}
|
234
|
-
|
236
|
+
|
235
237
|
return Response({
|
236
238
|
'success': True,
|
237
239
|
'data': mock_data
|
238
240
|
})
|
239
|
-
|
241
|
+
|
240
242
|
except Exception as e:
|
241
243
|
logger.error(f"Task list API error: {e}")
|
242
244
|
return Response({
|
243
245
|
'success': False,
|
244
246
|
'error': str(e)
|
245
247
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
246
|
-
|
248
|
+
|
247
249
|
@action(detail=False, methods=['get'], url_path='workers/list')
|
248
250
|
@extend_schema(
|
249
251
|
summary="Get workers list",
|
@@ -260,12 +262,12 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
260
262
|
from ..utils.simulator import TaskSimulator
|
261
263
|
simulator = TaskSimulator()
|
262
264
|
workers_data = simulator.get_current_workers_list()
|
263
|
-
|
265
|
+
|
264
266
|
return Response({
|
265
267
|
'success': True,
|
266
268
|
'data': workers_data
|
267
269
|
})
|
268
|
-
|
270
|
+
|
269
271
|
except Exception as e:
|
270
272
|
logger.error(f"Workers list API error: {e}")
|
271
273
|
return Response({
|
@@ -295,10 +297,10 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
295
297
|
'error': 'Invalid request data',
|
296
298
|
'details': serializer.errors
|
297
299
|
}, status=status.HTTP_400_BAD_REQUEST)
|
298
|
-
|
300
|
+
|
299
301
|
action_type = serializer.validated_data['action']
|
300
302
|
worker_id = serializer.validated_data.get('worker_id')
|
301
|
-
|
303
|
+
|
302
304
|
# Worker management operations would go here
|
303
305
|
# For now, return a placeholder response
|
304
306
|
return Response({
|
@@ -309,14 +311,14 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
309
311
|
'action': action_type
|
310
312
|
}
|
311
313
|
})
|
312
|
-
|
314
|
+
|
313
315
|
except Exception as e:
|
314
316
|
logger.error(f"Worker management API error: {e}")
|
315
317
|
return Response({
|
316
318
|
'success': False,
|
317
319
|
'error': str(e)
|
318
320
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
319
|
-
|
321
|
+
|
320
322
|
@action(detail=False, methods=['post'], url_path='simulate')
|
321
323
|
@extend_schema(
|
322
324
|
summary="Simulate test data",
|
@@ -332,10 +334,10 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
332
334
|
"""Simulate test data for dashboard testing."""
|
333
335
|
try:
|
334
336
|
from ..utils.simulator import TaskSimulator
|
335
|
-
|
337
|
+
|
336
338
|
simulator = TaskSimulator()
|
337
339
|
result = simulator.run_simulation(workers=3, clear_first=True)
|
338
|
-
|
340
|
+
|
339
341
|
return Response({
|
340
342
|
'success': True,
|
341
343
|
'data': {
|
@@ -343,14 +345,14 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
343
345
|
'details': result
|
344
346
|
}
|
345
347
|
})
|
346
|
-
|
348
|
+
|
347
349
|
except Exception as e:
|
348
350
|
logger.error(f"Simulation API error: {e}")
|
349
351
|
return Response({
|
350
352
|
'success': False,
|
351
353
|
'error': str(e)
|
352
354
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
353
|
-
|
355
|
+
|
354
356
|
@action(detail=False, methods=['post'], url_path='clear')
|
355
357
|
@extend_schema(
|
356
358
|
summary="Clear test data",
|
@@ -366,24 +368,24 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
366
368
|
"""Clear all test data from Redis."""
|
367
369
|
try:
|
368
370
|
from ..utils.simulator import TaskSimulator
|
369
|
-
|
371
|
+
|
370
372
|
simulator = TaskSimulator()
|
371
373
|
simulator.clear_all_data()
|
372
|
-
|
374
|
+
|
373
375
|
return Response({
|
374
376
|
'success': True,
|
375
377
|
'data': {
|
376
378
|
'message': 'All test data cleared successfully'
|
377
379
|
}
|
378
380
|
})
|
379
|
-
|
381
|
+
|
380
382
|
except Exception as e:
|
381
383
|
logger.error(f"Clear data API error: {e}")
|
382
384
|
return Response({
|
383
385
|
'success': False,
|
384
386
|
'error': str(e)
|
385
387
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
386
|
-
|
388
|
+
|
387
389
|
@action(detail=False, methods=['post'], url_path='clear-queues')
|
388
390
|
@extend_schema(
|
389
391
|
summary="Clear all queues",
|
@@ -399,50 +401,50 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
399
401
|
"""Clear all tasks from all Dramatiq queues."""
|
400
402
|
try:
|
401
403
|
from django_cfg.modules.django_tasks import DjangoTasks
|
402
|
-
|
404
|
+
|
403
405
|
tasks_service = DjangoTasks()
|
404
406
|
redis_client = tasks_service.get_redis_client()
|
405
|
-
|
407
|
+
|
406
408
|
if not redis_client:
|
407
409
|
return Response({
|
408
410
|
'success': False,
|
409
411
|
'error': 'Redis connection not available'
|
410
412
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
411
|
-
|
413
|
+
|
412
414
|
# Get all Dramatiq queue keys
|
413
415
|
queue_keys = redis_client.keys('dramatiq:*.msgs') # Main queues
|
414
416
|
failed_keys = redis_client.keys('dramatiq:*.DQ') # Failed queues
|
415
417
|
ack_keys = redis_client.keys('dramatiq:__acks__*') # Acknowledgments
|
416
|
-
|
418
|
+
|
417
419
|
cleared_count = 0
|
418
|
-
|
420
|
+
|
419
421
|
# Clear main queues
|
420
422
|
for key in queue_keys:
|
421
423
|
redis_client.delete(key)
|
422
424
|
cleared_count += 1
|
423
|
-
|
424
|
-
# Clear failed queues
|
425
|
+
|
426
|
+
# Clear failed queues
|
425
427
|
for key in failed_keys:
|
426
428
|
redis_client.delete(key)
|
427
429
|
cleared_count += 1
|
428
|
-
|
430
|
+
|
429
431
|
# Clear acknowledgments
|
430
432
|
for key in ack_keys:
|
431
433
|
redis_client.delete(key)
|
432
434
|
cleared_count += 1
|
433
|
-
|
435
|
+
|
434
436
|
return Response({
|
435
437
|
'success': True,
|
436
438
|
'message': f'Cleared {cleared_count} Dramatiq keys from Redis'
|
437
439
|
})
|
438
|
-
|
440
|
+
|
439
441
|
except Exception as e:
|
440
442
|
logger.error(f"Clear queues API error: {e}")
|
441
443
|
return Response({
|
442
444
|
'success': False,
|
443
445
|
'error': str(e)
|
444
446
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
445
|
-
|
447
|
+
|
446
448
|
@action(detail=False, methods=['post'], url_path='purge-failed')
|
447
449
|
@extend_schema(
|
448
450
|
summary="Purge failed tasks",
|
@@ -458,40 +460,40 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
458
460
|
"""Purge all failed tasks from queues."""
|
459
461
|
try:
|
460
462
|
from django_cfg.modules.django_tasks import DjangoTasks
|
461
|
-
|
463
|
+
|
462
464
|
tasks_service = DjangoTasks()
|
463
465
|
redis_client = tasks_service.get_redis_client()
|
464
|
-
|
466
|
+
|
465
467
|
if not redis_client:
|
466
468
|
return Response({
|
467
469
|
'success': False,
|
468
470
|
'error': 'Redis connection not available'
|
469
471
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
470
|
-
|
472
|
+
|
471
473
|
# Get only failed queue keys (DQ = Dead Queue)
|
472
474
|
failed_keys = redis_client.keys('dramatiq:*.DQ')
|
473
|
-
|
475
|
+
|
474
476
|
cleared_count = 0
|
475
|
-
|
477
|
+
|
476
478
|
# Clear only failed queues
|
477
479
|
for key in failed_keys:
|
478
480
|
failed_count = redis_client.llen(key)
|
479
481
|
if failed_count > 0:
|
480
482
|
redis_client.delete(key)
|
481
483
|
cleared_count += failed_count
|
482
|
-
|
484
|
+
|
483
485
|
return Response({
|
484
486
|
'success': True,
|
485
487
|
'message': f'Purged {cleared_count} failed tasks from queues'
|
486
488
|
})
|
487
|
-
|
489
|
+
|
488
490
|
except Exception as e:
|
489
491
|
logger.error(f"Purge failed tasks API error: {e}")
|
490
492
|
return Response({
|
491
493
|
'success': False,
|
492
494
|
'error': str(e)
|
493
495
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
494
|
-
|
496
|
+
|
495
497
|
# Helper methods
|
496
498
|
def _clear_all_queues(self, tasks_service: DjangoTasks) -> Dict[str, Any]:
|
497
499
|
"""Clear all queues."""
|
@@ -499,49 +501,49 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
499
501
|
redis_client = tasks_service.get_redis_client()
|
500
502
|
if not redis_client:
|
501
503
|
return {'error': 'Redis connection not available'}
|
502
|
-
|
504
|
+
|
503
505
|
# Get all queue keys and clear them
|
504
506
|
queue_keys = redis_client.keys("dramatiq:queue:*")
|
505
507
|
cleared_count = 0
|
506
|
-
|
508
|
+
|
507
509
|
for key in queue_keys:
|
508
510
|
redis_client.delete(key)
|
509
511
|
cleared_count += 1
|
510
|
-
|
512
|
+
|
511
513
|
return {
|
512
514
|
'message': f'Cleared {cleared_count} queues',
|
513
515
|
'cleared_count': cleared_count
|
514
516
|
}
|
515
|
-
|
517
|
+
|
516
518
|
except Exception as e:
|
517
519
|
return {'error': str(e)}
|
518
|
-
|
520
|
+
|
519
521
|
def _clear_queue(self, tasks_service: DjangoTasks, queue_name: str) -> Dict[str, Any]:
|
520
522
|
"""Clear specific queue."""
|
521
523
|
try:
|
522
524
|
redis_client = tasks_service.get_redis_client()
|
523
525
|
if not redis_client:
|
524
526
|
return {'error': 'Redis connection not available'}
|
525
|
-
|
527
|
+
|
526
528
|
queue_key = f"dramatiq:queue:{queue_name}"
|
527
529
|
cleared_count = redis_client.delete(queue_key)
|
528
|
-
|
530
|
+
|
529
531
|
return {
|
530
532
|
'message': f'Cleared queue {queue_name}',
|
531
533
|
'queue_name': queue_name,
|
532
534
|
'cleared': cleared_count > 0
|
533
535
|
}
|
534
|
-
|
536
|
+
|
535
537
|
except Exception as e:
|
536
538
|
return {'error': str(e)}
|
537
|
-
|
539
|
+
|
538
540
|
def _purge_failed_tasks(self, tasks_service: DjangoTasks, queue_name: str = None) -> Dict[str, Any]:
|
539
541
|
"""Purge failed tasks."""
|
540
542
|
try:
|
541
543
|
redis_client = tasks_service.get_redis_client()
|
542
544
|
if not redis_client:
|
543
545
|
return {'error': 'Redis connection not available'}
|
544
|
-
|
546
|
+
|
545
547
|
if queue_name:
|
546
548
|
# Clear specific queue's failed tasks
|
547
549
|
failed_key = f"dramatiq:queue:{queue_name}.DLQ"
|
@@ -555,15 +557,15 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
555
557
|
# Clear all failed task queues
|
556
558
|
failed_keys = redis_client.keys("dramatiq:queue:*.DLQ")
|
557
559
|
cleared_count = 0
|
558
|
-
|
560
|
+
|
559
561
|
for key in failed_keys:
|
560
562
|
redis_client.delete(key)
|
561
563
|
cleared_count += 1
|
562
|
-
|
564
|
+
|
563
565
|
return {
|
564
566
|
'message': f'Purged failed tasks from {cleared_count} queues',
|
565
567
|
'cleared_count': cleared_count
|
566
568
|
}
|
567
|
-
|
569
|
+
|
568
570
|
except Exception as e:
|
569
571
|
return {'error': str(e)}
|
@@ -5,8 +5,9 @@ Provides template-based dashboard views for task monitoring.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
|
8
|
+
|
9
9
|
from django.contrib.admin.views.decorators import staff_member_required
|
10
|
+
from django.shortcuts import render
|
10
11
|
|
11
12
|
logger = logging.getLogger(__name__)
|
12
13
|
|
@@ -26,7 +27,7 @@ def dashboard_view(request):
|
|
26
27
|
# Use simulator to get data
|
27
28
|
from ..utils.simulator import TaskSimulator
|
28
29
|
simulator = TaskSimulator()
|
29
|
-
|
30
|
+
|
30
31
|
# Build navigation items for navbar
|
31
32
|
tasks_nav_items = [
|
32
33
|
{
|
@@ -49,10 +50,10 @@ def dashboard_view(request):
|
|
49
50
|
}
|
50
51
|
|
51
52
|
return render(request, 'tasks/pages/dashboard.html', context)
|
52
|
-
|
53
|
+
|
53
54
|
except Exception as e:
|
54
55
|
logger.error(f"Dashboard view error: {e}")
|
55
|
-
|
56
|
+
|
56
57
|
# Build navigation items for navbar
|
57
58
|
tasks_nav_items = [
|
58
59
|
{
|
django_cfg/apps/urls.py
CHANGED
@@ -4,9 +4,10 @@ Django CFG API URLs
|
|
4
4
|
Built-in API endpoints for django_cfg functionality.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.urls import path, include
|
8
7
|
from typing import List
|
9
8
|
|
9
|
+
from django.urls import include, path
|
10
|
+
|
10
11
|
|
11
12
|
def get_enabled_cfg_apps() -> List[str]:
|
12
13
|
"""
|
@@ -16,34 +17,37 @@ def get_enabled_cfg_apps() -> List[str]:
|
|
16
17
|
List of enabled app paths (e.g., ['django_cfg.apps.accounts', ...])
|
17
18
|
"""
|
18
19
|
from django_cfg.modules.base import BaseCfgModule
|
19
|
-
|
20
|
+
|
20
21
|
base_module = BaseCfgModule()
|
21
22
|
enabled_apps = []
|
22
|
-
|
23
|
+
|
23
24
|
if base_module.is_accounts_enabled():
|
24
25
|
enabled_apps.append("django_cfg.apps.accounts")
|
25
26
|
|
26
27
|
if base_module.is_knowbase_enabled():
|
27
28
|
enabled_apps.append("django_cfg.apps.knowbase")
|
28
|
-
|
29
|
+
|
29
30
|
if base_module.is_support_enabled():
|
30
31
|
enabled_apps.append("django_cfg.apps.support")
|
31
|
-
|
32
|
+
|
32
33
|
if base_module.is_newsletter_enabled():
|
33
34
|
enabled_apps.append("django_cfg.apps.newsletter")
|
34
|
-
|
35
|
+
|
35
36
|
if base_module.is_leads_enabled():
|
36
37
|
enabled_apps.append("django_cfg.apps.leads")
|
37
|
-
|
38
|
+
|
38
39
|
if base_module.is_agents_enabled():
|
39
40
|
enabled_apps.append("django_cfg.apps.agents")
|
40
|
-
|
41
|
+
|
41
42
|
if base_module.should_enable_tasks():
|
42
43
|
enabled_apps.append("django_cfg.apps.tasks")
|
43
|
-
|
44
|
+
|
44
45
|
if base_module.is_payments_enabled():
|
45
46
|
enabled_apps.append("django_cfg.apps.payments")
|
46
|
-
|
47
|
+
|
48
|
+
if base_module.is_rpc_enabled():
|
49
|
+
enabled_apps.append("django_cfg.apps.ipc")
|
50
|
+
|
47
51
|
return enabled_apps
|
48
52
|
|
49
53
|
|
@@ -70,7 +74,7 @@ def get_default_cfg_group():
|
|
70
74
|
OpenAPIGroupConfig with enabled django-cfg apps
|
71
75
|
"""
|
72
76
|
from django_cfg.modules.django_client.core.config import OpenAPIGroupConfig
|
73
|
-
|
77
|
+
|
74
78
|
return OpenAPIGroupConfig(
|
75
79
|
name="cfg",
|
76
80
|
apps=get_enabled_cfg_apps(),
|
@@ -128,6 +132,10 @@ APP_URL_MAP = {
|
|
128
132
|
("cfg/payments/", "django_cfg.apps.payments.urls"),
|
129
133
|
("cfg/payments/admin/", "django_cfg.apps.payments.urls_admin"),
|
130
134
|
],
|
135
|
+
"django_cfg.apps.ipc": [
|
136
|
+
("cfg/ipc/", "django_cfg.apps.ipc.urls"),
|
137
|
+
("cfg/ipc/admin/", "django_cfg.apps.ipc.urls_admin"),
|
138
|
+
],
|
131
139
|
}
|
132
140
|
|
133
141
|
# Register URLs for enabled apps only
|
@@ -141,6 +149,7 @@ for app_path in enabled_apps:
|
|
141
149
|
|
142
150
|
# Maintenance (special case - admin only)
|
143
151
|
from django_cfg.modules.base import BaseCfgModule
|
152
|
+
|
144
153
|
if BaseCfgModule().is_maintenance_enabled():
|
145
154
|
cfg_app_urls.append(_safe_include('admin/django_cfg_maintenance/', 'django_cfg.apps.maintenance.urls_admin'))
|
146
155
|
|
django_cfg/apps.py
CHANGED
@@ -8,6 +8,7 @@ from django.apps import AppConfig
|
|
8
8
|
from django.conf import settings
|
9
9
|
from django.contrib import admin
|
10
10
|
|
11
|
+
|
11
12
|
class DjangoCfgConfig(AppConfig):
|
12
13
|
"""Configuration for django_cfg app."""
|
13
14
|
|
@@ -18,15 +19,15 @@ class DjangoCfgConfig(AppConfig):
|
|
18
19
|
def ready(self):
|
19
20
|
"""Called when Django is ready - register integrations."""
|
20
21
|
self._register_constance_admin()
|
21
|
-
|
22
|
+
|
22
23
|
def _register_constance_admin(self):
|
23
24
|
"""Register Constance admin with Unfold integration."""
|
24
25
|
try:
|
25
|
-
|
26
|
+
|
26
27
|
# Check if Constance is configured
|
27
28
|
if not (hasattr(settings, 'CONSTANCE_CONFIG') and settings.CONSTANCE_CONFIG):
|
28
29
|
return
|
29
|
-
|
30
|
+
|
30
31
|
# Import required modules
|
31
32
|
from constance.admin import Config, ConstanceAdmin
|
32
33
|
from unfold.admin import ModelAdmin
|
@@ -35,10 +36,10 @@ class DjangoCfgConfig(AppConfig):
|
|
35
36
|
class ConstanceConfigAdmin(ConstanceAdmin, ModelAdmin):
|
36
37
|
"""Constance admin with Unfold integration."""
|
37
38
|
pass
|
38
|
-
|
39
|
+
|
39
40
|
# Directly override the registry entry to replace default admin
|
40
41
|
admin.site._registry[Config] = ConstanceConfigAdmin(Config, admin.site)
|
41
|
-
|
42
|
+
|
42
43
|
except ImportError:
|
43
44
|
# Constance not available - skip registration
|
44
45
|
pass
|
@@ -4,12 +4,13 @@ Django CFG Create Project Command
|
|
4
4
|
Creates a new Django project by downloading from GitHub.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import click
|
8
7
|
import shutil
|
9
|
-
import urllib.request
|
10
|
-
from pathlib import Path
|
11
8
|
import tempfile
|
9
|
+
import urllib.request
|
12
10
|
import zipfile
|
11
|
+
from pathlib import Path
|
12
|
+
|
13
|
+
import click
|
13
14
|
|
14
15
|
# GitHub template URL
|
15
16
|
TEMPLATE_URL = "https://github.com/markolofsen/django-cfg/archive/refs/heads/main.zip"
|
@@ -109,7 +110,7 @@ def extract_template(archive_path: Path, target_path: Path) -> None:
|
|
109
110
|
click.echo(f"✅ Template extracted successfully ({extracted_files} files)")
|
110
111
|
|
111
112
|
except zipfile.BadZipFile:
|
112
|
-
raise ValueError(
|
113
|
+
raise ValueError("Invalid template archive")
|
113
114
|
except Exception as e:
|
114
115
|
raise RuntimeError(f"Failed to extract template: {e}")
|
115
116
|
|
@@ -164,7 +165,7 @@ def create_project(path: str, force: bool):
|
|
164
165
|
temp_archive = None
|
165
166
|
|
166
167
|
try:
|
167
|
-
click.echo(
|
168
|
+
click.echo("🚀 Creating Django project from GitHub")
|
168
169
|
click.echo(f"📁 Target location: {target_path}")
|
169
170
|
click.echo()
|
170
171
|
|
@@ -178,7 +179,7 @@ def create_project(path: str, force: bool):
|
|
178
179
|
extract_template(temp_archive, target_path)
|
179
180
|
|
180
181
|
click.echo()
|
181
|
-
click.echo(
|
182
|
+
click.echo("✅ Project created successfully!")
|
182
183
|
click.echo(f"📁 Location: {target_path}")
|
183
184
|
|
184
185
|
# Show next steps
|