django-cfg 1.4.21__py3-none-any.whl → 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -3,11 +3,12 @@ Django ORM toolset for database operations.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import logging
|
6
|
-
from typing import
|
7
|
-
|
8
|
-
from pydantic_ai import RunContext
|
9
|
-
from django.db import models
|
6
|
+
from typing import Any, Dict, List, Optional, Union
|
7
|
+
|
10
8
|
from django.apps import apps
|
9
|
+
from django.db import models
|
10
|
+
from pydantic_ai import RunContext
|
11
|
+
from pydantic_ai.toolsets import AbstractToolset
|
11
12
|
|
12
13
|
from ..core.dependencies import DjangoDeps
|
13
14
|
|
@@ -24,7 +25,7 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
24
25
|
- Relationship traversal
|
25
26
|
- Safe filtering
|
26
27
|
"""
|
27
|
-
|
28
|
+
|
28
29
|
def __init__(self, read_only: bool = True, allowed_models: Optional[List[str]] = None):
|
29
30
|
"""
|
30
31
|
Initialize ORM toolset.
|
@@ -35,68 +36,68 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
35
36
|
"""
|
36
37
|
self.read_only = read_only
|
37
38
|
self.allowed_models = set(allowed_models) if allowed_models else None
|
38
|
-
|
39
|
+
|
39
40
|
@property
|
40
41
|
def id(self) -> str:
|
41
42
|
return "django_orm"
|
42
|
-
|
43
|
+
|
43
44
|
def _check_model_access(self, app_label: str, model_name: str) -> bool:
|
44
45
|
"""Check if model access is allowed."""
|
45
46
|
if self.allowed_models is None:
|
46
47
|
return True
|
47
|
-
|
48
|
+
|
48
49
|
model_key = f"{app_label}.{model_name}"
|
49
50
|
return model_key in self.allowed_models
|
50
|
-
|
51
|
+
|
51
52
|
def _get_model(self, app_label: str, model_name: str) -> models.Model:
|
52
53
|
"""Get Django model class with access check."""
|
53
54
|
if not self._check_model_access(app_label, model_name):
|
54
55
|
raise PermissionError(f"Access to model '{app_label}.{model_name}' not allowed")
|
55
|
-
|
56
|
+
|
56
57
|
try:
|
57
58
|
return apps.get_model(app_label, model_name)
|
58
59
|
except LookupError:
|
59
60
|
raise ValueError(f"Model '{app_label}.{model_name}' not found")
|
60
|
-
|
61
|
+
|
61
62
|
async def count_objects(
|
62
|
-
self,
|
63
|
-
ctx: RunContext[DjangoDeps],
|
64
|
-
app_label: str,
|
63
|
+
self,
|
64
|
+
ctx: RunContext[DjangoDeps],
|
65
|
+
app_label: str,
|
65
66
|
model_name: str,
|
66
67
|
filters: Optional[Dict[str, Any]] = None
|
67
68
|
) -> int:
|
68
69
|
"""Count objects in model with optional filters."""
|
69
70
|
model = self._get_model(app_label, model_name)
|
70
|
-
|
71
|
+
|
71
72
|
queryset = model.objects.all()
|
72
|
-
|
73
|
+
|
73
74
|
if filters:
|
74
75
|
# Apply safe filters
|
75
76
|
safe_filters = self._sanitize_filters(filters)
|
76
77
|
queryset = queryset.filter(**safe_filters)
|
77
|
-
|
78
|
+
|
78
79
|
return await queryset.acount()
|
79
|
-
|
80
|
+
|
80
81
|
async def get_object(
|
81
|
-
self,
|
82
|
-
ctx: RunContext[DjangoDeps],
|
83
|
-
app_label: str,
|
82
|
+
self,
|
83
|
+
ctx: RunContext[DjangoDeps],
|
84
|
+
app_label: str,
|
84
85
|
model_name: str,
|
85
86
|
object_id: Union[int, str]
|
86
87
|
) -> Optional[Dict[str, Any]]:
|
87
88
|
"""Get single object by ID."""
|
88
89
|
model = self._get_model(app_label, model_name)
|
89
|
-
|
90
|
+
|
90
91
|
try:
|
91
92
|
obj = await model.objects.aget(pk=object_id)
|
92
93
|
return self._serialize_object(obj)
|
93
94
|
except model.DoesNotExist:
|
94
95
|
return None
|
95
|
-
|
96
|
+
|
96
97
|
async def list_objects(
|
97
|
-
self,
|
98
|
-
ctx: RunContext[DjangoDeps],
|
99
|
-
app_label: str,
|
98
|
+
self,
|
99
|
+
ctx: RunContext[DjangoDeps],
|
100
|
+
app_label: str,
|
100
101
|
model_name: str,
|
101
102
|
filters: Optional[Dict[str, Any]] = None,
|
102
103
|
limit: int = 10,
|
@@ -105,32 +106,32 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
105
106
|
) -> Dict[str, Any]:
|
106
107
|
"""List objects with pagination and filtering."""
|
107
108
|
model = self._get_model(app_label, model_name)
|
108
|
-
|
109
|
+
|
109
110
|
queryset = model.objects.all()
|
110
|
-
|
111
|
+
|
111
112
|
# Apply filters
|
112
113
|
if filters:
|
113
114
|
safe_filters = self._sanitize_filters(filters)
|
114
115
|
queryset = queryset.filter(**safe_filters)
|
115
|
-
|
116
|
+
|
116
117
|
# Apply ordering
|
117
118
|
if order_by:
|
118
119
|
# Sanitize order_by field
|
119
120
|
order_field = order_by.lstrip('-')
|
120
121
|
if hasattr(model, order_field):
|
121
122
|
queryset = queryset.order_by(order_by)
|
122
|
-
|
123
|
+
|
123
124
|
# Get total count
|
124
125
|
total_count = await queryset.acount()
|
125
|
-
|
126
|
+
|
126
127
|
# Apply pagination
|
127
128
|
queryset = queryset[offset:offset + limit]
|
128
|
-
|
129
|
+
|
129
130
|
# Serialize objects
|
130
131
|
objects = []
|
131
132
|
async for obj in queryset:
|
132
133
|
objects.append(self._serialize_object(obj))
|
133
|
-
|
134
|
+
|
134
135
|
return {
|
135
136
|
'objects': objects,
|
136
137
|
'total_count': total_count,
|
@@ -139,28 +140,28 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
139
140
|
'has_next': offset + limit < total_count,
|
140
141
|
'has_previous': offset > 0,
|
141
142
|
}
|
142
|
-
|
143
|
+
|
143
144
|
async def aggregate_data(
|
144
|
-
self,
|
145
|
-
ctx: RunContext[DjangoDeps],
|
146
|
-
app_label: str,
|
145
|
+
self,
|
146
|
+
ctx: RunContext[DjangoDeps],
|
147
|
+
app_label: str,
|
147
148
|
model_name: str,
|
148
149
|
aggregations: Dict[str, str],
|
149
150
|
filters: Optional[Dict[str, Any]] = None,
|
150
151
|
group_by: Optional[str] = None
|
151
152
|
) -> Dict[str, Any]:
|
152
153
|
"""Perform aggregations on model data."""
|
153
|
-
from django.db.models import
|
154
|
-
|
154
|
+
from django.db.models import Avg, Count, Max, Min, Sum
|
155
|
+
|
155
156
|
model = self._get_model(app_label, model_name)
|
156
|
-
|
157
|
+
|
157
158
|
queryset = model.objects.all()
|
158
|
-
|
159
|
+
|
159
160
|
# Apply filters
|
160
161
|
if filters:
|
161
162
|
safe_filters = self._sanitize_filters(filters)
|
162
163
|
queryset = queryset.filter(**safe_filters)
|
163
|
-
|
164
|
+
|
164
165
|
# Prepare aggregation functions
|
165
166
|
agg_functions = {
|
166
167
|
'count': Count,
|
@@ -169,7 +170,7 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
169
170
|
'max': Max,
|
170
171
|
'min': Min,
|
171
172
|
}
|
172
|
-
|
173
|
+
|
173
174
|
agg_kwargs = {}
|
174
175
|
for alias, agg_spec in aggregations.items():
|
175
176
|
if ':' in agg_spec:
|
@@ -177,14 +178,14 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
177
178
|
else:
|
178
179
|
func_name = agg_spec
|
179
180
|
field_name = 'id' # Default field
|
180
|
-
|
181
|
+
|
181
182
|
if func_name.lower() in agg_functions:
|
182
183
|
agg_func = agg_functions[func_name.lower()]
|
183
184
|
if func_name.lower() == 'count':
|
184
185
|
agg_kwargs[alias] = agg_func(field_name)
|
185
186
|
else:
|
186
187
|
agg_kwargs[alias] = agg_func(field_name)
|
187
|
-
|
188
|
+
|
188
189
|
# Perform aggregation
|
189
190
|
if group_by and hasattr(model, group_by):
|
190
191
|
# Group by field
|
@@ -196,11 +197,11 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
196
197
|
# Simple aggregation
|
197
198
|
result = await queryset.aaggregate(**agg_kwargs)
|
198
199
|
return result
|
199
|
-
|
200
|
+
|
200
201
|
async def search_objects(
|
201
|
-
self,
|
202
|
-
ctx: RunContext[DjangoDeps],
|
203
|
-
app_label: str,
|
202
|
+
self,
|
203
|
+
ctx: RunContext[DjangoDeps],
|
204
|
+
app_label: str,
|
204
205
|
model_name: str,
|
205
206
|
search_fields: List[str],
|
206
207
|
query: str,
|
@@ -208,31 +209,31 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
208
209
|
) -> List[Dict[str, Any]]:
|
209
210
|
"""Search objects using icontains on specified fields."""
|
210
211
|
from django.db.models import Q
|
211
|
-
|
212
|
+
|
212
213
|
model = self._get_model(app_label, model_name)
|
213
|
-
|
214
|
+
|
214
215
|
# Build search query
|
215
216
|
search_q = Q()
|
216
217
|
for field in search_fields:
|
217
218
|
if hasattr(model, field):
|
218
219
|
search_q |= Q(**{f"{field}__icontains": query})
|
219
|
-
|
220
|
+
|
220
221
|
if not search_q:
|
221
222
|
return []
|
222
|
-
|
223
|
+
|
223
224
|
# Execute search
|
224
225
|
queryset = model.objects.filter(search_q)[:limit]
|
225
|
-
|
226
|
+
|
226
227
|
results = []
|
227
228
|
async for obj in queryset:
|
228
229
|
results.append(self._serialize_object(obj))
|
229
|
-
|
230
|
+
|
230
231
|
return results
|
231
|
-
|
232
|
+
|
232
233
|
async def get_related_objects(
|
233
|
-
self,
|
234
|
-
ctx: RunContext[DjangoDeps],
|
235
|
-
app_label: str,
|
234
|
+
self,
|
235
|
+
ctx: RunContext[DjangoDeps],
|
236
|
+
app_label: str,
|
236
237
|
model_name: str,
|
237
238
|
object_id: Union[int, str],
|
238
239
|
relation_name: str,
|
@@ -240,18 +241,18 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
240
241
|
) -> List[Dict[str, Any]]:
|
241
242
|
"""Get related objects through foreign key or many-to-many."""
|
242
243
|
model = self._get_model(app_label, model_name)
|
243
|
-
|
244
|
+
|
244
245
|
try:
|
245
246
|
obj = await model.objects.aget(pk=object_id)
|
246
247
|
except model.DoesNotExist:
|
247
248
|
return []
|
248
|
-
|
249
|
+
|
249
250
|
# Check if relation exists
|
250
251
|
if not hasattr(obj, relation_name):
|
251
252
|
return []
|
252
|
-
|
253
|
+
|
253
254
|
relation = getattr(obj, relation_name)
|
254
|
-
|
255
|
+
|
255
256
|
# Handle different relation types
|
256
257
|
if hasattr(relation, 'all'):
|
257
258
|
# Many-to-many or reverse foreign key
|
@@ -262,24 +263,24 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
262
263
|
return [self._serialize_object(relation)]
|
263
264
|
else:
|
264
265
|
return []
|
265
|
-
|
266
|
+
|
266
267
|
results = []
|
267
268
|
async for related_obj in related_objects:
|
268
269
|
results.append(self._serialize_object(related_obj))
|
269
|
-
|
270
|
+
|
270
271
|
return results
|
271
|
-
|
272
|
+
|
272
273
|
def _sanitize_filters(self, filters: Dict[str, Any]) -> Dict[str, Any]:
|
273
274
|
"""Sanitize filters to prevent dangerous operations."""
|
274
275
|
safe_filters = {}
|
275
|
-
|
276
|
+
|
276
277
|
# Allowed lookup types
|
277
278
|
allowed_lookups = {
|
278
279
|
'exact', 'iexact', 'contains', 'icontains', 'startswith', 'istartswith',
|
279
280
|
'endswith', 'iendswith', 'gt', 'gte', 'lt', 'lte', 'in', 'isnull',
|
280
281
|
'date', 'year', 'month', 'day', 'week_day', 'hour', 'minute', 'second'
|
281
282
|
}
|
282
|
-
|
283
|
+
|
283
284
|
for key, value in filters.items():
|
284
285
|
# Check for dangerous operations
|
285
286
|
if '__' in key:
|
@@ -289,16 +290,16 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
289
290
|
else:
|
290
291
|
# Direct field lookup (exact)
|
291
292
|
safe_filters[key] = value
|
292
|
-
|
293
|
+
|
293
294
|
return safe_filters
|
294
|
-
|
295
|
+
|
295
296
|
def _serialize_object(self, obj: models.Model) -> Dict[str, Any]:
|
296
297
|
"""Serialize Django model object to dictionary."""
|
297
298
|
data = {}
|
298
|
-
|
299
|
+
|
299
300
|
for field in obj._meta.fields:
|
300
301
|
value = getattr(obj, field.name)
|
301
|
-
|
302
|
+
|
302
303
|
# Handle special field types
|
303
304
|
if hasattr(value, 'isoformat'):
|
304
305
|
# DateTime fields
|
@@ -311,9 +312,9 @@ class ORMToolset(AbstractToolset[DjangoDeps]):
|
|
311
312
|
}
|
312
313
|
else:
|
313
314
|
data[field.name] = value
|
314
|
-
|
315
|
+
|
315
316
|
# Add primary key and string representation
|
316
317
|
data['pk'] = obj.pk
|
317
318
|
data['str'] = str(obj)
|
318
|
-
|
319
|
+
|
319
320
|
return data
|
django_cfg/apps/agents/urls.py
CHANGED
@@ -4,7 +4,7 @@ Django Orchestrator URLs.
|
|
4
4
|
Provides API endpoints for agent management and execution.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.urls import
|
7
|
+
from django.urls import include, path
|
8
8
|
from rest_framework.routers import DefaultRouter
|
9
9
|
|
10
10
|
# Import views when they're created
|
@@ -23,7 +23,7 @@ router = DefaultRouter()
|
|
23
23
|
urlpatterns = [
|
24
24
|
# API endpoints
|
25
25
|
path('api/', include(router.urls)),
|
26
|
-
|
26
|
+
|
27
27
|
# Health check endpoint
|
28
28
|
path('health/', lambda request: JsonResponse({'status': 'ok', 'service': 'django-orchestrator'}), name='health'),
|
29
29
|
]
|
@@ -31,6 +31,7 @@ urlpatterns = [
|
|
31
31
|
# For now, create a simple health endpoint
|
32
32
|
from django.http import JsonResponse
|
33
33
|
|
34
|
+
|
34
35
|
def health_check(request):
|
35
36
|
"""Health check endpoint for Django Orchestrator."""
|
36
37
|
return JsonResponse({
|
@@ -5,18 +5,15 @@ Web interface for executing Django management commands.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import json
|
8
|
-
import subprocess
|
9
|
-
import threading
|
10
|
-
import time
|
11
8
|
import logging
|
12
|
-
|
9
|
+
import time
|
10
|
+
|
11
|
+
from django.contrib.auth.decorators import user_passes_test
|
12
|
+
from django.core.management import call_command, get_commands
|
13
13
|
from django.http import JsonResponse, StreamingHttpResponse
|
14
|
+
from django.utils import timezone
|
14
15
|
from django.views.decorators.csrf import csrf_exempt
|
15
16
|
from django.views.decorators.http import require_http_methods
|
16
|
-
from django.contrib.auth.decorators import user_passes_test
|
17
|
-
from django.core.management import get_commands, call_command
|
18
|
-
from django.conf import settings
|
19
|
-
from django.utils import timezone
|
20
17
|
|
21
18
|
logger = logging.getLogger(__name__)
|
22
19
|
|
@@ -38,7 +35,7 @@ def list_commands_view(request):
|
|
38
35
|
try:
|
39
36
|
# Get all available commands
|
40
37
|
commands_dict = get_commands()
|
41
|
-
|
38
|
+
|
42
39
|
# Categorize commands
|
43
40
|
categorized_commands = {
|
44
41
|
"django_cfg": [],
|
@@ -46,14 +43,14 @@ def list_commands_view(request):
|
|
46
43
|
"third_party": [],
|
47
44
|
"project": [],
|
48
45
|
}
|
49
|
-
|
46
|
+
|
50
47
|
for command_name, app_name in commands_dict.items():
|
51
48
|
command_info = {
|
52
49
|
"name": command_name,
|
53
50
|
"app": app_name,
|
54
51
|
"description": _get_command_description(command_name),
|
55
52
|
}
|
56
|
-
|
53
|
+
|
57
54
|
if app_name == "django_cfg":
|
58
55
|
categorized_commands["django_cfg"].append(command_info)
|
59
56
|
elif app_name.startswith("django."):
|
@@ -62,14 +59,14 @@ def list_commands_view(request):
|
|
62
59
|
categorized_commands["project"].append(command_info)
|
63
60
|
else:
|
64
61
|
categorized_commands["third_party"].append(command_info)
|
65
|
-
|
62
|
+
|
66
63
|
return JsonResponse({
|
67
64
|
"status": "success",
|
68
65
|
"commands": categorized_commands,
|
69
66
|
"total_commands": len(commands_dict),
|
70
67
|
"timestamp": timezone.now().isoformat(),
|
71
68
|
})
|
72
|
-
|
69
|
+
|
73
70
|
except Exception as e:
|
74
71
|
logger.error(f"Error listing commands: {e}")
|
75
72
|
return JsonResponse({
|
@@ -102,13 +99,13 @@ def execute_command_view(request):
|
|
102
99
|
command_name = data.get("command")
|
103
100
|
args = data.get("args", [])
|
104
101
|
options = data.get("options", {})
|
105
|
-
|
102
|
+
|
106
103
|
if not command_name:
|
107
104
|
return JsonResponse({
|
108
105
|
"status": "error",
|
109
106
|
"error": "Command name is required",
|
110
107
|
}, status=400)
|
111
|
-
|
108
|
+
|
112
109
|
# Validate command exists
|
113
110
|
available_commands = get_commands()
|
114
111
|
if command_name not in available_commands:
|
@@ -128,7 +125,7 @@ def execute_command_view(request):
|
|
128
125
|
"error": f"Command '{command_name}' is not allowed via web interface for security reasons",
|
129
126
|
"suggestion": "Only safe django_cfg commands and whitelisted utilities can be executed via web.",
|
130
127
|
}, status=403)
|
131
|
-
|
128
|
+
|
132
129
|
# Create streaming response generator
|
133
130
|
def stream_command_execution():
|
134
131
|
"""Generator that yields command output in SSE format."""
|
@@ -139,8 +136,8 @@ def execute_command_view(request):
|
|
139
136
|
|
140
137
|
try:
|
141
138
|
# Capture command output using StringIO
|
142
|
-
from io import StringIO
|
143
139
|
import sys
|
140
|
+
from io import StringIO
|
144
141
|
|
145
142
|
# Create output buffer
|
146
143
|
output_buffer = StringIO()
|
@@ -200,7 +197,7 @@ def execute_command_view(request):
|
|
200
197
|
|
201
198
|
# Send error event
|
202
199
|
yield f"data: {json.dumps({'type': 'error', 'message': str(cmd_error), 'execution_time': round(execution_time, 2)})}\n\n"
|
203
|
-
|
200
|
+
|
204
201
|
# Return streaming response
|
205
202
|
response = StreamingHttpResponse(
|
206
203
|
stream_command_execution(),
|
@@ -208,9 +205,9 @@ def execute_command_view(request):
|
|
208
205
|
)
|
209
206
|
response['Cache-Control'] = 'no-cache'
|
210
207
|
response['X-Accel-Buffering'] = 'no' # Disable nginx buffering
|
211
|
-
|
208
|
+
|
212
209
|
return response
|
213
|
-
|
210
|
+
|
214
211
|
except json.JSONDecodeError:
|
215
212
|
return JsonResponse({
|
216
213
|
"status": "error",
|
@@ -236,16 +233,16 @@ def command_help_view(request, command_name):
|
|
236
233
|
"""
|
237
234
|
try:
|
238
235
|
available_commands = get_commands()
|
239
|
-
|
236
|
+
|
240
237
|
if command_name not in available_commands:
|
241
238
|
return JsonResponse({
|
242
239
|
"status": "error",
|
243
240
|
"error": f"Command '{command_name}' not found",
|
244
241
|
}, status=404)
|
245
|
-
|
242
|
+
|
246
243
|
# Get command help
|
247
244
|
help_text = _get_command_help(command_name)
|
248
|
-
|
245
|
+
|
249
246
|
return JsonResponse({
|
250
247
|
"status": "success",
|
251
248
|
"command": command_name,
|
@@ -253,7 +250,7 @@ def command_help_view(request, command_name):
|
|
253
250
|
"help": help_text,
|
254
251
|
"timestamp": timezone.now().isoformat(),
|
255
252
|
})
|
256
|
-
|
253
|
+
|
257
254
|
except Exception as e:
|
258
255
|
logger.error(f"Error getting help for command {command_name}: {e}")
|
259
256
|
return JsonResponse({
|
@@ -278,11 +275,11 @@ def _get_command_help(command_name: str) -> str:
|
|
278
275
|
try:
|
279
276
|
from django.core.management import load_command_class
|
280
277
|
command_class = load_command_class(get_commands()[command_name], command_name)
|
281
|
-
|
278
|
+
|
282
279
|
# Create command instance to get help
|
283
280
|
command_instance = command_class()
|
284
281
|
parser = command_instance.create_parser('manage.py', command_name)
|
285
|
-
|
282
|
+
|
286
283
|
return parser.format_help()
|
287
284
|
except Exception as e:
|
288
285
|
return f"Could not retrieve help for command '{command_name}': {str(e)}"
|
@@ -4,14 +4,15 @@ Endpoints Status Checker
|
|
4
4
|
Utility for checking all registered Django URL endpoints.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import time
|
8
7
|
import re
|
8
|
+
import time
|
9
9
|
import uuid
|
10
|
-
from typing import
|
11
|
-
|
10
|
+
from typing import Any, Dict, List, Optional
|
11
|
+
|
12
|
+
from django.contrib.auth import get_user_model
|
12
13
|
from django.test import Client
|
14
|
+
from django.urls import URLPattern, URLResolver, get_resolver
|
13
15
|
from django.utils import timezone
|
14
|
-
from django.contrib.auth import get_user_model
|
15
16
|
|
16
17
|
|
17
18
|
def get_url_group(url_pattern: str, depth: int = 3) -> str:
|
@@ -4,10 +4,10 @@ Django CFG Endpoints Status DRF Views
|
|
4
4
|
DRF browsable API views with Tailwind theme support.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from rest_framework.views import APIView
|
8
|
-
from rest_framework.response import Response
|
9
7
|
from rest_framework import status
|
10
8
|
from rest_framework.permissions import AllowAny
|
9
|
+
from rest_framework.response import Response
|
10
|
+
from rest_framework.views import APIView
|
11
11
|
|
12
12
|
from .checker import check_all_endpoints
|
13
13
|
from .serializers import EndpointsStatusSerializer
|
@@ -2,16 +2,17 @@
|
|
2
2
|
Tests for Django CFG Endpoints Status API
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.test import TestCase, Client
|
6
|
-
from django.urls import reverse, path
|
7
5
|
from django.http import JsonResponse
|
6
|
+
from django.test import Client, TestCase
|
7
|
+
from django.urls import path, reverse
|
8
8
|
from django.views import View
|
9
|
+
|
9
10
|
from .checker import (
|
11
|
+
check_all_endpoints,
|
12
|
+
check_endpoint,
|
13
|
+
collect_endpoints,
|
10
14
|
get_url_group,
|
11
15
|
should_check_endpoint,
|
12
|
-
collect_endpoints,
|
13
|
-
check_endpoint,
|
14
|
-
check_all_endpoints,
|
15
16
|
)
|
16
17
|
|
17
18
|
|
@@ -6,21 +6,21 @@ DRF browsable API views with Tailwind theme support.
|
|
6
6
|
|
7
7
|
import os
|
8
8
|
import time
|
9
|
-
import psutil
|
10
9
|
from datetime import datetime
|
11
|
-
from typing import
|
10
|
+
from typing import Any, Dict
|
12
11
|
|
12
|
+
import psutil
|
13
13
|
from django.conf import settings
|
14
|
-
from django.db import connections
|
15
14
|
from django.core.cache import cache
|
15
|
+
from django.db import connections
|
16
16
|
from django.utils import timezone
|
17
|
-
|
18
|
-
from rest_framework.views import APIView
|
19
|
-
from rest_framework.response import Response
|
20
17
|
from rest_framework import status
|
21
18
|
from rest_framework.permissions import AllowAny
|
19
|
+
from rest_framework.response import Response
|
20
|
+
from rest_framework.views import APIView
|
22
21
|
|
23
22
|
from django_cfg.core.integration import get_current_version
|
23
|
+
|
24
24
|
from .serializers import HealthCheckSerializer, QuickHealthSerializer
|
25
25
|
|
26
26
|
|