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,15 +5,14 @@ Section-based architecture for dashboard rendering.
|
|
5
5
|
Inspired by Unfold's clean component approach.
|
6
6
|
"""
|
7
7
|
|
8
|
+
# Import components to register them with Unfold
|
9
|
+
# The @register_component decorator runs on import
|
10
|
+
from . import components # noqa: F401
|
8
11
|
from .sections.base import DashboardSection
|
12
|
+
from .sections.commands import CommandsSection
|
9
13
|
from .sections.overview import OverviewSection
|
10
14
|
from .sections.stats import StatsSection
|
11
15
|
from .sections.system import SystemSection
|
12
|
-
from .sections.commands import CommandsSection
|
13
|
-
|
14
|
-
# Import components to register them with Unfold
|
15
|
-
# The @register_component decorator runs on import
|
16
|
-
from . import components # noqa: F401
|
17
16
|
|
18
17
|
__all__ = [
|
19
18
|
'DashboardSection',
|
@@ -5,7 +5,8 @@ Uses Unfold's Component Class system for data preprocessing.
|
|
5
5
|
Separates business logic from presentation templates.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Dict
|
9
|
+
|
9
10
|
from unfold.components import BaseComponent, register_component
|
10
11
|
|
11
12
|
|
@@ -27,10 +28,11 @@ class SystemMetricsComponent(BaseComponent):
|
|
27
28
|
|
28
29
|
def get_system_metrics(self) -> Dict[str, Any]:
|
29
30
|
"""Fetch system health metrics."""
|
30
|
-
from django.db import connection
|
31
|
-
from django.core.cache import cache
|
32
31
|
import shutil
|
33
32
|
|
33
|
+
from django.core.cache import cache
|
34
|
+
from django.db import connection
|
35
|
+
|
34
36
|
metrics = {}
|
35
37
|
|
36
38
|
# Database Health
|
@@ -100,7 +102,7 @@ class SystemMetricsComponent(BaseComponent):
|
|
100
102
|
"title": "REST API",
|
101
103
|
"description": f"{len(url_patterns)} URL patterns",
|
102
104
|
}
|
103
|
-
except Exception
|
105
|
+
except Exception:
|
104
106
|
metrics["api"] = {
|
105
107
|
"value": 50,
|
106
108
|
"title": "REST API",
|
@@ -170,10 +172,11 @@ class ChartsComponent(BaseComponent):
|
|
170
172
|
# Get time range from kwargs (default: 7 days)
|
171
173
|
days = kwargs.get('days', 7)
|
172
174
|
|
173
|
-
|
175
|
+
import json
|
174
176
|
from datetime import datetime, timedelta
|
177
|
+
|
178
|
+
from django.contrib.auth import get_user_model
|
175
179
|
from django.utils import timezone
|
176
|
-
import json
|
177
180
|
|
178
181
|
User = get_user_model()
|
179
182
|
|
@@ -251,8 +254,9 @@ class ActivityTrackerComponent(BaseComponent):
|
|
251
254
|
"""Prepare activity tracker data."""
|
252
255
|
context = super().get_context_data(**kwargs)
|
253
256
|
|
254
|
-
from django.contrib.auth import get_user_model
|
255
257
|
from datetime import timedelta
|
258
|
+
|
259
|
+
from django.contrib.auth import get_user_model
|
256
260
|
from django.utils import timezone
|
257
261
|
|
258
262
|
User = get_user_model()
|
@@ -4,12 +4,10 @@ Debug utilities for dashboard rendering.
|
|
4
4
|
Saves rendered HTML to disk for inspection and comparison.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import os
|
8
7
|
import json
|
9
8
|
from datetime import datetime
|
10
9
|
from pathlib import Path
|
11
|
-
from typing import
|
12
|
-
from django.conf import settings
|
10
|
+
from typing import Any, Dict, Optional
|
13
11
|
|
14
12
|
|
15
13
|
class DashboardDebugger:
|
@@ -4,15 +4,15 @@ Management command to debug dashboard rendering.
|
|
4
4
|
Renders all dashboard sections and saves them for inspection.
|
5
5
|
"""
|
6
6
|
|
7
|
+
from django.contrib.auth import get_user_model
|
7
8
|
from django.core.management.base import BaseCommand
|
8
9
|
from django.test import RequestFactory
|
9
|
-
from django.contrib.auth import get_user_model
|
10
10
|
|
11
|
+
from django_cfg.modules.django_dashboard.debug import get_debugger
|
12
|
+
from django_cfg.modules.django_dashboard.sections.commands import CommandsSection
|
11
13
|
from django_cfg.modules.django_dashboard.sections.overview import OverviewSection
|
12
14
|
from django_cfg.modules.django_dashboard.sections.stats import StatsSection
|
13
15
|
from django_cfg.modules.django_dashboard.sections.system import SystemSection
|
14
|
-
from django_cfg.modules.django_dashboard.sections.commands import CommandsSection
|
15
|
-
from django_cfg.modules.django_dashboard.debug import get_debugger
|
16
16
|
|
17
17
|
|
18
18
|
class Command(BaseCommand):
|
@@ -4,7 +4,8 @@ Base dashboard section classes.
|
|
4
4
|
Provides foundation for dashboard sections following Unfold's pattern.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
7
|
+
from typing import Any, Dict, Optional
|
8
|
+
|
8
9
|
from django.http import HttpRequest
|
9
10
|
from django.template.loader import render_to_string
|
10
11
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Commands section for dashboard."""
|
2
2
|
|
3
|
-
from typing import
|
3
|
+
from typing import Any, Dict
|
4
|
+
|
4
5
|
from .base import DataSection
|
5
6
|
|
6
7
|
|
@@ -17,7 +18,7 @@ class CommandsSection(DataSection):
|
|
17
18
|
"""Get commands data."""
|
18
19
|
from django_cfg.modules.django_unfold.callbacks.base import (
|
19
20
|
get_available_commands,
|
20
|
-
get_commands_by_category
|
21
|
+
get_commands_by_category,
|
21
22
|
)
|
22
23
|
|
23
24
|
commands = get_available_commands()
|
@@ -1,10 +1,12 @@
|
|
1
1
|
"""Documentation section for dashboard."""
|
2
2
|
|
3
|
-
import os
|
4
3
|
import inspect
|
4
|
+
import os
|
5
5
|
from pathlib import Path
|
6
|
-
from typing import
|
6
|
+
from typing import Any, Dict, List
|
7
|
+
|
7
8
|
from django.core.management import get_commands, load_command_class
|
9
|
+
|
8
10
|
from .base import DataSection
|
9
11
|
|
10
12
|
|
@@ -45,7 +47,7 @@ class DocumentationSection(DataSection):
|
|
45
47
|
for readme_path in possible_paths:
|
46
48
|
if readme_path.exists():
|
47
49
|
logger.info(f"Found module README at: {readme_path}")
|
48
|
-
with open(readme_path,
|
50
|
+
with open(readme_path, encoding='utf-8') as f:
|
49
51
|
return f.read()
|
50
52
|
except Exception as e:
|
51
53
|
logger.debug(f"Could not find README for module {module_name}: {e}")
|
@@ -142,7 +144,7 @@ class DocumentationSection(DataSection):
|
|
142
144
|
|
143
145
|
if main_readme_path.exists():
|
144
146
|
logger.info("Found main management README.md, using it as primary documentation")
|
145
|
-
with open(main_readme_path,
|
147
|
+
with open(main_readme_path, encoding='utf-8') as f:
|
146
148
|
return f.read() # Use existing README if it exists
|
147
149
|
except Exception as e:
|
148
150
|
logger.debug(f"No main README found, continuing with auto-generation: {e}")
|
@@ -352,7 +354,7 @@ class DocumentationSection(DataSection):
|
|
352
354
|
try:
|
353
355
|
if readme_path and readme_path.exists():
|
354
356
|
logger.info(f"Reading README from: {readme_path}")
|
355
|
-
with open(readme_path,
|
357
|
+
with open(readme_path, encoding='utf-8') as f:
|
356
358
|
readme_content = f.read()
|
357
359
|
logger.info(f"README content loaded: {len(readme_content)} characters")
|
358
360
|
|
@@ -377,7 +379,7 @@ class DocumentationSection(DataSection):
|
|
377
379
|
readme_exists = True
|
378
380
|
else:
|
379
381
|
logger.error(f"README.md not found at: {readme_path}")
|
380
|
-
readme_content =
|
382
|
+
readme_content = "README.md not found. Searched paths:\n" + "\n".join(str(p) for p in possible_paths)
|
381
383
|
|
382
384
|
except Exception as e:
|
383
385
|
logger.error(f"Error loading documentation: {e}", exc_info=True)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Overview section for dashboard."""
|
2
2
|
|
3
|
-
from typing import
|
3
|
+
from typing import Any, Dict, List
|
4
|
+
|
4
5
|
from .base import DataSection
|
5
6
|
|
6
7
|
|
@@ -28,6 +29,7 @@ class OverviewSection(DataSection):
|
|
28
29
|
def get_context_data(self, **kwargs) -> Dict[str, Any]:
|
29
30
|
"""Add additional context for includes."""
|
30
31
|
import json
|
32
|
+
|
31
33
|
from django.utils.safestring import mark_safe
|
32
34
|
|
33
35
|
context = super().get_context_data(**kwargs)
|
@@ -79,6 +81,7 @@ class OverviewSection(DataSection):
|
|
79
81
|
def get_system_health(self) -> Dict[str, Any]:
|
80
82
|
"""Get system health metrics."""
|
81
83
|
import sys
|
84
|
+
|
82
85
|
import psutil
|
83
86
|
|
84
87
|
return {
|
@@ -95,8 +98,8 @@ class OverviewSection(DataSection):
|
|
95
98
|
|
96
99
|
def get_system_metrics(self) -> Dict[str, Any]:
|
97
100
|
"""Get system metrics for progress bars."""
|
98
|
-
from django.db import connection
|
99
101
|
from django.core.cache import cache
|
102
|
+
from django.db import connection
|
100
103
|
|
101
104
|
metrics = {}
|
102
105
|
|
@@ -185,7 +188,7 @@ class OverviewSection(DataSection):
|
|
185
188
|
"health_percentage": 100,
|
186
189
|
"description": f"{len(url_patterns)} URL patterns",
|
187
190
|
}
|
188
|
-
except Exception
|
191
|
+
except Exception:
|
189
192
|
metrics["api"] = {
|
190
193
|
"status": "warning",
|
191
194
|
"type": "REST API",
|
@@ -240,8 +243,9 @@ class OverviewSection(DataSection):
|
|
240
243
|
|
241
244
|
Returns list of dicts with date and count for last 365 days.
|
242
245
|
"""
|
246
|
+
from datetime import timedelta
|
247
|
+
|
243
248
|
from django.contrib.auth import get_user_model
|
244
|
-
from datetime import datetime, timedelta
|
245
249
|
from django.utils import timezone
|
246
250
|
|
247
251
|
User = get_user_model()
|
@@ -277,7 +281,7 @@ class OverviewSection(DataSection):
|
|
277
281
|
|
278
282
|
return activity_data
|
279
283
|
|
280
|
-
except Exception
|
284
|
+
except Exception:
|
281
285
|
# Return empty on error
|
282
286
|
return []
|
283
287
|
|
@@ -308,11 +312,11 @@ class OverviewSection(DataSection):
|
|
308
312
|
Args:
|
309
313
|
days: Number of days to include in charts (default: 7)
|
310
314
|
"""
|
311
|
-
|
315
|
+
import json
|
312
316
|
from datetime import datetime, timedelta
|
317
|
+
|
318
|
+
from django.contrib.auth import get_user_model
|
313
319
|
from django.utils import timezone
|
314
|
-
from django.utils.safestring import mark_safe
|
315
|
-
import json
|
316
320
|
|
317
321
|
User = get_user_model()
|
318
322
|
|
@@ -389,6 +393,6 @@ class OverviewSection(DataSection):
|
|
389
393
|
# JSON string for Unfold chart component (NO mark_safe - let Django escape quotes)
|
390
394
|
'user_activity_json': json.dumps(user_activity_data),
|
391
395
|
}
|
392
|
-
except Exception
|
396
|
+
except Exception:
|
393
397
|
# Return empty chart data
|
394
398
|
return {}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Statistics section for dashboard."""
|
2
2
|
|
3
|
-
from typing import
|
3
|
+
from typing import Any, Dict, List
|
4
|
+
|
4
5
|
from .base import DataSection
|
5
6
|
|
6
7
|
|
@@ -23,7 +24,6 @@ class StatsSection(DataSection):
|
|
23
24
|
def get_app_stats(self) -> List[Dict[str, Any]]:
|
24
25
|
"""Get per-app statistics."""
|
25
26
|
from django.apps import apps
|
26
|
-
from django.contrib.contenttypes.models import ContentType
|
27
27
|
|
28
28
|
stats = []
|
29
29
|
|
@@ -12,10 +12,18 @@ register = template.Library()
|
|
12
12
|
|
13
13
|
@register.simple_tag
|
14
14
|
def tailwind_css():
|
15
|
-
"""Load Tailwind CSS from CDN."""
|
16
|
-
return mark_safe(
|
17
|
-
|
18
|
-
|
15
|
+
"""Load Tailwind CSS from CDN with dark mode configuration."""
|
16
|
+
return mark_safe('''
|
17
|
+
<script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio,container-queries"></script>
|
18
|
+
<script>
|
19
|
+
tailwind.config = {
|
20
|
+
darkMode: 'class',
|
21
|
+
theme: {
|
22
|
+
extend: {}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
</script>
|
26
|
+
''')
|
19
27
|
|
20
28
|
|
21
29
|
@register.filter
|
@@ -4,8 +4,9 @@ Test Email Command
|
|
4
4
|
Tests email sending functionality using django_cfg configuration.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.core.management.base import BaseCommand
|
8
7
|
from django.contrib.auth import get_user_model
|
8
|
+
from django.core.management.base import BaseCommand
|
9
|
+
|
9
10
|
from django_cfg.modules.django_logging import get_logger
|
10
11
|
|
11
12
|
User = get_user_model()
|
@@ -61,14 +62,14 @@ class Command(BaseCommand):
|
|
61
62
|
try:
|
62
63
|
from django_cfg.modules.django_email import DjangoEmailService
|
63
64
|
email_service = DjangoEmailService()
|
64
|
-
|
65
|
+
|
65
66
|
# Показать информацию о backend
|
66
67
|
backend_info = email_service.get_backend_info()
|
67
68
|
self.stdout.write(f"\n📧 Backend: {backend_info['backend']}")
|
68
69
|
self.stdout.write(f"📧 Configured: {backend_info['configured']}")
|
69
|
-
|
70
|
+
|
70
71
|
self.stdout.write("\n📧 Sending test email with HTML template...")
|
71
|
-
|
72
|
+
|
72
73
|
# Отправить письмо с HTML шаблоном
|
73
74
|
result = email_service.send_template(
|
74
75
|
subject=subject,
|
@@ -86,8 +87,8 @@ class Command(BaseCommand):
|
|
86
87
|
},
|
87
88
|
recipient_list=[email]
|
88
89
|
)
|
89
|
-
|
90
|
+
|
90
91
|
self.stdout.write(self.style.SUCCESS(f"✅ Email sent successfully! Result: {result}"))
|
91
|
-
|
92
|
+
|
92
93
|
except Exception as e:
|
93
|
-
self.stdout.write(self.style.ERROR(f"❌ Failed to send email: {e}"))
|
94
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to send email: {e}"))
|
@@ -5,14 +5,15 @@ This email service automatically configures itself based on the DjangoConfig ins
|
|
5
5
|
without requiring manual parameter passing.
|
6
6
|
"""
|
7
7
|
|
8
|
-
|
8
|
+
import logging
|
9
9
|
import socket
|
10
10
|
from smtplib import SMTPException
|
11
|
-
import
|
12
|
-
|
11
|
+
from typing import Any, Dict, List, Optional
|
12
|
+
|
13
|
+
from django.conf import settings
|
14
|
+
from django.core.mail import EmailMultiAlternatives, send_mail
|
13
15
|
from django.template.loader import render_to_string
|
14
16
|
from django.utils.html import strip_tags
|
15
|
-
from django.conf import settings
|
16
17
|
|
17
18
|
from ..base import BaseCfgModule
|
18
19
|
|
@@ -4,16 +4,17 @@ Health Check Views for Django Config Toolkit
|
|
4
4
|
Provides health check endpoints for monitoring system status.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Dict, Any
|
8
|
-
from django.http import JsonResponse
|
9
|
-
from django.views import View
|
10
|
-
from django.db import connections
|
11
|
-
from django.core.cache import cache
|
12
|
-
from django.conf import settings
|
13
|
-
import time
|
14
|
-
import psutil
|
15
7
|
import os
|
8
|
+
import time
|
16
9
|
from datetime import datetime
|
10
|
+
from typing import Any, Dict
|
11
|
+
|
12
|
+
import psutil
|
13
|
+
from django.conf import settings
|
14
|
+
from django.core.cache import cache
|
15
|
+
from django.db import connections
|
16
|
+
from django.http import JsonResponse
|
17
|
+
from django.views import View
|
17
18
|
|
18
19
|
|
19
20
|
class HealthCheckView(View):
|
@@ -26,7 +27,7 @@ class HealthCheckView(View):
|
|
26
27
|
- System resources
|
27
28
|
- Configuration status
|
28
29
|
"""
|
29
|
-
|
30
|
+
|
30
31
|
def get(self, request):
|
31
32
|
"""Return comprehensive health check data."""
|
32
33
|
health_data = {
|
@@ -34,7 +35,7 @@ class HealthCheckView(View):
|
|
34
35
|
"timestamp": datetime.now().isoformat(),
|
35
36
|
"checks": {}
|
36
37
|
}
|
37
|
-
|
38
|
+
|
38
39
|
# Database check
|
39
40
|
try:
|
40
41
|
db_status = self._check_databases()
|
@@ -45,17 +46,17 @@ class HealthCheckView(View):
|
|
45
46
|
"error": str(e)
|
46
47
|
}
|
47
48
|
health_data["status"] = "unhealthy"
|
48
|
-
|
49
|
+
|
49
50
|
# Cache check
|
50
51
|
try:
|
51
52
|
cache_status = self._check_cache()
|
52
53
|
health_data["checks"]["cache"] = cache_status
|
53
54
|
except Exception as e:
|
54
55
|
health_data["checks"]["cache"] = {
|
55
|
-
"status": "error",
|
56
|
+
"status": "error",
|
56
57
|
"error": str(e)
|
57
58
|
}
|
58
|
-
|
59
|
+
|
59
60
|
# System resources
|
60
61
|
try:
|
61
62
|
system_status = self._check_system_resources()
|
@@ -65,69 +66,69 @@ class HealthCheckView(View):
|
|
65
66
|
"status": "warning",
|
66
67
|
"error": str(e)
|
67
68
|
}
|
68
|
-
|
69
|
+
|
69
70
|
# Configuration check
|
70
71
|
config_status = self._check_configuration()
|
71
72
|
health_data["checks"]["configuration"] = config_status
|
72
|
-
|
73
|
+
|
73
74
|
# Overall status
|
74
75
|
if any(check.get("status") == "error" for check in health_data["checks"].values()):
|
75
76
|
health_data["status"] = "unhealthy"
|
76
77
|
elif any(check.get("status") == "warning" for check in health_data["checks"].values()):
|
77
78
|
health_data["status"] = "degraded"
|
78
|
-
|
79
|
+
|
79
80
|
return JsonResponse(health_data)
|
80
|
-
|
81
|
+
|
81
82
|
def _check_databases(self) -> Dict[str, Any]:
|
82
83
|
"""Check database connectivity."""
|
83
84
|
db_status = {
|
84
85
|
"status": "healthy",
|
85
86
|
"databases": {}
|
86
87
|
}
|
87
|
-
|
88
|
+
|
88
89
|
for db_name in connections:
|
89
90
|
try:
|
90
91
|
start_time = time.time()
|
91
92
|
connection = connections[db_name]
|
92
|
-
|
93
|
+
|
93
94
|
# Test connection
|
94
95
|
with connection.cursor() as cursor:
|
95
96
|
cursor.execute("SELECT 1")
|
96
97
|
cursor.fetchone()
|
97
|
-
|
98
|
+
|
98
99
|
response_time = (time.time() - start_time) * 1000
|
99
|
-
|
100
|
+
|
100
101
|
db_status["databases"][db_name] = {
|
101
102
|
"status": "healthy",
|
102
103
|
"response_time_ms": round(response_time, 2),
|
103
104
|
"engine": connection.settings_dict.get('ENGINE', 'unknown')
|
104
105
|
}
|
105
|
-
|
106
|
+
|
106
107
|
except Exception as e:
|
107
108
|
db_status["databases"][db_name] = {
|
108
109
|
"status": "error",
|
109
110
|
"error": str(e)
|
110
111
|
}
|
111
112
|
db_status["status"] = "error"
|
112
|
-
|
113
|
+
|
113
114
|
return db_status
|
114
|
-
|
115
|
+
|
115
116
|
def _check_cache(self) -> Dict[str, Any]:
|
116
117
|
"""Check cache availability."""
|
117
118
|
cache_status = {
|
118
119
|
"status": "healthy"
|
119
120
|
}
|
120
|
-
|
121
|
+
|
121
122
|
try:
|
122
123
|
# Test cache write/read
|
123
124
|
test_key = "health_check"
|
124
125
|
test_value = "ok"
|
125
|
-
|
126
|
+
|
126
127
|
start_time = time.time()
|
127
128
|
cache.set(test_key, test_value, 30)
|
128
129
|
retrieved_value = cache.get(test_key)
|
129
130
|
response_time = (time.time() - start_time) * 1000
|
130
|
-
|
131
|
+
|
131
132
|
if retrieved_value == test_value:
|
132
133
|
cache_status.update({
|
133
134
|
"status": "healthy",
|
@@ -139,35 +140,35 @@ class HealthCheckView(View):
|
|
139
140
|
"status": "error",
|
140
141
|
"error": "Cache read/write test failed"
|
141
142
|
}
|
142
|
-
|
143
|
+
|
143
144
|
except Exception as e:
|
144
145
|
cache_status = {
|
145
146
|
"status": "error",
|
146
147
|
"error": str(e)
|
147
148
|
}
|
148
|
-
|
149
|
+
|
149
150
|
return cache_status
|
150
|
-
|
151
|
+
|
151
152
|
def _check_system_resources(self) -> Dict[str, Any]:
|
152
153
|
"""Check system resource usage."""
|
153
154
|
try:
|
154
155
|
# CPU usage
|
155
156
|
cpu_percent = psutil.cpu_percent(interval=1)
|
156
|
-
|
157
|
+
|
157
158
|
# Memory usage
|
158
159
|
memory = psutil.virtual_memory()
|
159
160
|
memory_percent = memory.percent
|
160
|
-
|
161
|
+
|
161
162
|
# Disk usage
|
162
163
|
disk = psutil.disk_usage('/')
|
163
164
|
disk_percent = (disk.used / disk.total) * 100
|
164
|
-
|
165
|
+
|
165
166
|
# Load average (Unix-like systems)
|
166
167
|
try:
|
167
168
|
load_avg = os.getloadavg()
|
168
169
|
except (AttributeError, OSError):
|
169
170
|
load_avg = None
|
170
|
-
|
171
|
+
|
171
172
|
system_status = {
|
172
173
|
"status": "healthy",
|
173
174
|
"cpu": {
|
@@ -187,32 +188,33 @@ class HealthCheckView(View):
|
|
187
188
|
"status": "warning" if disk_percent > 80 else "healthy"
|
188
189
|
}
|
189
190
|
}
|
190
|
-
|
191
|
+
|
191
192
|
if load_avg:
|
192
193
|
system_status["load_average"] = {
|
193
194
|
"1min": load_avg[0],
|
194
|
-
"5min": load_avg[1],
|
195
|
+
"5min": load_avg[1],
|
195
196
|
"15min": load_avg[2]
|
196
197
|
}
|
197
|
-
|
198
|
+
|
198
199
|
# Overall system status
|
199
200
|
if (cpu_percent > 90 or memory_percent > 90 or disk_percent > 90):
|
200
201
|
system_status["status"] = "warning"
|
201
|
-
|
202
|
+
|
202
203
|
return system_status
|
203
|
-
|
204
|
+
|
204
205
|
except Exception as e:
|
205
206
|
return {
|
206
207
|
"status": "error",
|
207
208
|
"error": f"Failed to get system resources: {str(e)}"
|
208
209
|
}
|
209
|
-
|
210
|
+
|
210
211
|
def _check_configuration(self) -> Dict[str, Any]:
|
211
212
|
"""Check Django-CFG configuration."""
|
212
213
|
try:
|
213
|
-
from django_cfg.core.state import get_current_config
|
214
214
|
from django.conf import settings
|
215
215
|
|
216
|
+
from django_cfg.core.state import get_current_config
|
217
|
+
|
216
218
|
config = get_current_config()
|
217
219
|
|
218
220
|
config_status = {
|
@@ -239,7 +241,7 @@ class HealthCheckView(View):
|
|
239
241
|
config_status["warnings"] = ["Secret key is too short or not set"]
|
240
242
|
|
241
243
|
return config_status
|
242
|
-
|
244
|
+
|
243
245
|
except Exception as e:
|
244
246
|
return {
|
245
247
|
"status": "error",
|
@@ -249,7 +251,7 @@ class HealthCheckView(View):
|
|
249
251
|
|
250
252
|
class SimpleHealthView(View):
|
251
253
|
"""Simple health check endpoint that just returns OK."""
|
252
|
-
|
254
|
+
|
253
255
|
def get(self, request):
|
254
256
|
"""Return simple OK response."""
|
255
257
|
return JsonResponse({
|
@@ -262,7 +264,7 @@ class SimpleHealthView(View):
|
|
262
264
|
def get_health_urls():
|
263
265
|
"""Get URL patterns for health check endpoints."""
|
264
266
|
from django.urls import path
|
265
|
-
|
267
|
+
|
266
268
|
return [
|
267
269
|
path('health/', HealthCheckView.as_view(), name='health-check'),
|
268
270
|
path('health/simple/', SimpleHealthView.as_view(), name='simple-health'),
|
@@ -6,10 +6,14 @@ Provides seamless integration without unnecessary wrappers.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
# Re-export original classes through django-cfg registry
|
9
|
-
from import_export.admin import
|
9
|
+
from import_export.admin import ExportMixin as BaseExportMixin
|
10
|
+
from import_export.admin import ImportExportMixin as BaseImportExportMixin
|
11
|
+
from import_export.admin import ImportExportModelAdmin as BaseImportExportModelAdmin
|
12
|
+
from import_export.admin import ImportMixin as BaseImportMixin
|
10
13
|
from import_export.resources import ModelResource as BaseResource
|
14
|
+
|
11
15
|
# Use Unfold styled forms instead of default ones
|
12
|
-
from unfold.contrib.import_export.forms import
|
16
|
+
from unfold.contrib.import_export.forms import ExportForm, ImportForm, SelectableFieldsExportForm
|
13
17
|
|
14
18
|
|
15
19
|
class ImportExportMixin(BaseImportExportMixin):
|
@@ -47,4 +51,4 @@ __all__ = [
|
|
47
51
|
'ImportForm',
|
48
52
|
'ExportForm',
|
49
53
|
'SelectableFieldsExportForm',
|
50
|
-
]
|
54
|
+
]
|