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
@@ -2,15 +2,16 @@
|
|
2
2
|
External Data processing tasks with Dramatiq.
|
3
3
|
"""
|
4
4
|
|
5
|
-
import dramatiq
|
6
5
|
import logging
|
7
6
|
import time
|
8
|
-
from typing import Dict, List,
|
7
|
+
from typing import Any, Dict, List, Optional
|
8
|
+
|
9
|
+
import dramatiq
|
9
10
|
from django.db import transaction
|
10
11
|
from django.utils import timezone
|
11
12
|
|
12
|
-
from ..models.external_data import ExternalData, ExternalDataChunk, ExternalDataStatus
|
13
13
|
from ..mixins.service import ExternalDataService
|
14
|
+
from ..models.external_data import ExternalData, ExternalDataStatus
|
14
15
|
|
15
16
|
logger = logging.getLogger(__name__)
|
16
17
|
|
@@ -37,12 +38,12 @@ def process_external_data_async(
|
|
37
38
|
Processing results with statistics
|
38
39
|
"""
|
39
40
|
start_time = time.time()
|
40
|
-
|
41
|
+
|
41
42
|
try:
|
42
43
|
with transaction.atomic():
|
43
44
|
# Get external data instance
|
44
45
|
external_data = ExternalData.objects.select_for_update().get(id=external_data_id)
|
45
|
-
|
46
|
+
|
46
47
|
# Check if already processing
|
47
48
|
if external_data.status == ExternalDataStatus.PROCESSING:
|
48
49
|
logger.warning(f"External data {external_data_id} is already being processed")
|
@@ -51,7 +52,7 @@ def process_external_data_async(
|
|
51
52
|
'error': 'Already processing',
|
52
53
|
'external_data_id': external_data_id
|
53
54
|
}
|
54
|
-
|
55
|
+
|
55
56
|
# Check if already completed and not forcing reprocess
|
56
57
|
if external_data.status == ExternalDataStatus.COMPLETED and not force_reprocess:
|
57
58
|
logger.info(f"External data {external_data_id} already completed, skipping")
|
@@ -63,7 +64,7 @@ def process_external_data_async(
|
|
63
64
|
'total_tokens': external_data.total_tokens,
|
64
65
|
'processing_cost': external_data.processing_cost
|
65
66
|
}
|
66
|
-
|
67
|
+
|
67
68
|
# Check if has content
|
68
69
|
if not external_data.content or not external_data.content.strip():
|
69
70
|
logger.warning(f"External data {external_data_id} has no content to process")
|
@@ -73,7 +74,7 @@ def process_external_data_async(
|
|
73
74
|
external_data.total_tokens = 0
|
74
75
|
external_data.processing_cost = 0.0
|
75
76
|
external_data.save(update_fields=[
|
76
|
-
'status', 'processed_at', 'total_chunks',
|
77
|
+
'status', 'processed_at', 'total_chunks',
|
77
78
|
'total_tokens', 'processing_cost'
|
78
79
|
])
|
79
80
|
return {
|
@@ -84,30 +85,30 @@ def process_external_data_async(
|
|
84
85
|
'processing_cost': 0.0,
|
85
86
|
'processing_time': time.time() - start_time
|
86
87
|
}
|
87
|
-
|
88
|
+
|
88
89
|
logger.info(f"🚀 Starting external data processing: {external_data.title} (ID: {external_data_id})")
|
89
|
-
|
90
|
+
|
90
91
|
# Update status to processing
|
91
92
|
external_data.status = ExternalDataStatus.PROCESSING
|
92
93
|
external_data.processing_error = ""
|
93
94
|
external_data.save(update_fields=['status', 'processing_error'])
|
94
|
-
|
95
|
+
|
95
96
|
# Process external data using service (outside transaction for long-running operations)
|
96
97
|
service = ExternalDataService(external_data.user)
|
97
98
|
success = service.vectorize_external_data(external_data)
|
98
|
-
|
99
|
+
|
99
100
|
# Refresh from database to get updated statistics
|
100
101
|
external_data.refresh_from_db()
|
101
|
-
|
102
|
+
|
102
103
|
processing_time = time.time() - start_time
|
103
|
-
|
104
|
+
|
104
105
|
if success:
|
105
106
|
logger.info(
|
106
107
|
f"✅ External data processing completed: {external_data.title} "
|
107
108
|
f"({external_data.total_chunks} chunks, {external_data.total_tokens} tokens, "
|
108
109
|
f"${external_data.processing_cost:.6f}, {processing_time:.2f}s)"
|
109
110
|
)
|
110
|
-
|
111
|
+
|
111
112
|
return {
|
112
113
|
'success': True,
|
113
114
|
'external_data_id': external_data_id,
|
@@ -125,7 +126,7 @@ def process_external_data_async(
|
|
125
126
|
'error': external_data.processing_error or 'Unknown processing error',
|
126
127
|
'processing_time': processing_time
|
127
128
|
}
|
128
|
-
|
129
|
+
|
129
130
|
except ExternalData.DoesNotExist:
|
130
131
|
error_msg = f"External data {external_data_id} not found"
|
131
132
|
logger.error(f"❌ {error_msg}")
|
@@ -134,12 +135,12 @@ def process_external_data_async(
|
|
134
135
|
'error': error_msg,
|
135
136
|
'external_data_id': external_data_id
|
136
137
|
}
|
137
|
-
|
138
|
+
|
138
139
|
except Exception as e:
|
139
140
|
processing_time = time.time() - start_time
|
140
141
|
error_msg = f"Unexpected error processing external data {external_data_id}: {e}"
|
141
142
|
logger.error(f"❌ {error_msg}", exc_info=True)
|
142
|
-
|
143
|
+
|
143
144
|
# Try to update status to failed
|
144
145
|
try:
|
145
146
|
external_data = ExternalData.objects.get(id=external_data_id)
|
@@ -148,7 +149,7 @@ def process_external_data_async(
|
|
148
149
|
external_data.save(update_fields=['status', 'processing_error'])
|
149
150
|
except Exception as save_error:
|
150
151
|
logger.error(f"❌ Failed to update external data status: {save_error}")
|
151
|
-
|
152
|
+
|
152
153
|
return {
|
153
154
|
'success': False,
|
154
155
|
'error': error_msg,
|
@@ -181,12 +182,12 @@ def bulk_process_external_data_async(
|
|
181
182
|
Bulk processing results with statistics
|
182
183
|
"""
|
183
184
|
start_time = time.time()
|
184
|
-
|
185
|
+
|
185
186
|
try:
|
186
187
|
from django.contrib.auth import get_user_model
|
187
188
|
User = get_user_model()
|
188
189
|
user = User.objects.get(id=user_id)
|
189
|
-
|
190
|
+
|
190
191
|
# Get external data to process
|
191
192
|
if external_data_ids:
|
192
193
|
external_data_queryset = ExternalData.objects.filter(
|
@@ -199,10 +200,10 @@ def bulk_process_external_data_async(
|
|
199
200
|
user=user,
|
200
201
|
status=ExternalDataStatus.PENDING
|
201
202
|
)
|
202
|
-
|
203
|
+
|
203
204
|
external_data_list = list(external_data_queryset)
|
204
205
|
total_count = len(external_data_list)
|
205
|
-
|
206
|
+
|
206
207
|
if total_count == 0:
|
207
208
|
logger.info(f"No external data to process for user {user_id}")
|
208
209
|
return {
|
@@ -214,22 +215,22 @@ def bulk_process_external_data_async(
|
|
214
215
|
'skipped_count': 0,
|
215
216
|
'processing_time': time.time() - start_time
|
216
217
|
}
|
217
|
-
|
218
|
+
|
218
219
|
logger.info(f"🚀 Starting bulk external data processing for user {user_id}: {total_count} items")
|
219
|
-
|
220
|
+
|
220
221
|
# Process each external data
|
221
222
|
processed_count = 0
|
222
223
|
failed_count = 0
|
223
224
|
skipped_count = 0
|
224
225
|
results = []
|
225
|
-
|
226
|
+
|
226
227
|
for external_data in external_data_list:
|
227
228
|
try:
|
228
229
|
result = process_external_data_async.send(
|
229
230
|
str(external_data.id),
|
230
231
|
force_reprocess=force_reprocess
|
231
232
|
)
|
232
|
-
|
233
|
+
|
233
234
|
if result.get('success'):
|
234
235
|
if result.get('skipped'):
|
235
236
|
skipped_count += 1
|
@@ -237,9 +238,9 @@ def bulk_process_external_data_async(
|
|
237
238
|
processed_count += 1
|
238
239
|
else:
|
239
240
|
failed_count += 1
|
240
|
-
|
241
|
+
|
241
242
|
results.append(result)
|
242
|
-
|
243
|
+
|
243
244
|
except Exception as e:
|
244
245
|
logger.error(f"❌ Failed to queue external data {external_data.id}: {e}")
|
245
246
|
failed_count += 1
|
@@ -248,15 +249,15 @@ def bulk_process_external_data_async(
|
|
248
249
|
'external_data_id': str(external_data.id),
|
249
250
|
'error': f'Failed to queue: {e}'
|
250
251
|
})
|
251
|
-
|
252
|
+
|
252
253
|
processing_time = time.time() - start_time
|
253
|
-
|
254
|
+
|
254
255
|
logger.info(
|
255
256
|
f"✅ Bulk external data processing queued for user {user_id}: "
|
256
257
|
f"{processed_count} processed, {failed_count} failed, "
|
257
258
|
f"{skipped_count} skipped out of {total_count} total ({processing_time:.2f}s)"
|
258
259
|
)
|
259
|
-
|
260
|
+
|
260
261
|
return {
|
261
262
|
'success': True,
|
262
263
|
'user_id': user_id,
|
@@ -267,12 +268,12 @@ def bulk_process_external_data_async(
|
|
267
268
|
'processing_time': processing_time,
|
268
269
|
'results': results
|
269
270
|
}
|
270
|
-
|
271
|
+
|
271
272
|
except Exception as e:
|
272
273
|
processing_time = time.time() - start_time
|
273
274
|
error_msg = f"Unexpected error in bulk external data processing for user {user_id}: {e}"
|
274
275
|
logger.error(f"❌ {error_msg}", exc_info=True)
|
275
|
-
|
276
|
+
|
276
277
|
return {
|
277
278
|
'success': False,
|
278
279
|
'error': error_msg,
|
@@ -297,21 +298,22 @@ def cleanup_failed_external_data_async(older_than_days: int = 7) -> Dict[str, An
|
|
297
298
|
Cleanup results
|
298
299
|
"""
|
299
300
|
start_time = time.time()
|
300
|
-
|
301
|
+
|
301
302
|
try:
|
302
|
-
from django.utils import timezone
|
303
303
|
from datetime import timedelta
|
304
|
-
|
304
|
+
|
305
|
+
from django.utils import timezone
|
306
|
+
|
305
307
|
cutoff_date = timezone.now() - timedelta(days=older_than_days)
|
306
|
-
|
308
|
+
|
307
309
|
# Find failed external data older than cutoff
|
308
310
|
failed_external_data = ExternalData.objects.filter(
|
309
311
|
status=ExternalDataStatus.FAILED,
|
310
312
|
updated_at__lt=cutoff_date
|
311
313
|
)
|
312
|
-
|
314
|
+
|
313
315
|
count = failed_external_data.count()
|
314
|
-
|
316
|
+
|
315
317
|
if count > 0:
|
316
318
|
logger.info(f"🧹 Cleaning up {count} failed external data older than {older_than_days} days")
|
317
319
|
deleted_count, _ = failed_external_data.delete()
|
@@ -319,21 +321,21 @@ def cleanup_failed_external_data_async(older_than_days: int = 7) -> Dict[str, An
|
|
319
321
|
else:
|
320
322
|
logger.info(f"No failed external data older than {older_than_days} days found")
|
321
323
|
deleted_count = 0
|
322
|
-
|
324
|
+
|
323
325
|
processing_time = time.time() - start_time
|
324
|
-
|
326
|
+
|
325
327
|
return {
|
326
328
|
'success': True,
|
327
329
|
'deleted_count': deleted_count,
|
328
330
|
'older_than_days': older_than_days,
|
329
331
|
'processing_time': processing_time
|
330
332
|
}
|
331
|
-
|
333
|
+
|
332
334
|
except Exception as e:
|
333
335
|
processing_time = time.time() - start_time
|
334
336
|
error_msg = f"Error cleaning up failed external data: {e}"
|
335
337
|
logger.error(f"❌ {error_msg}", exc_info=True)
|
336
|
-
|
338
|
+
|
337
339
|
return {
|
338
340
|
'success': False,
|
339
341
|
'error': error_msg,
|
@@ -2,15 +2,17 @@
|
|
2
2
|
Maintenance and cleanup tasks.
|
3
3
|
"""
|
4
4
|
|
5
|
-
import dramatiq
|
6
5
|
import logging
|
7
|
-
from
|
6
|
+
from datetime import timedelta
|
7
|
+
from typing import Any, Dict
|
8
|
+
|
9
|
+
import dramatiq
|
10
|
+
from django.conf import settings
|
11
|
+
from django.core.cache import cache
|
8
12
|
from django.db import connection
|
9
13
|
from django.utils import timezone
|
10
|
-
|
14
|
+
|
11
15
|
from django_cfg.modules.django_llm.llm.client import LLMClient
|
12
|
-
from django.core.cache import cache
|
13
|
-
from django.conf import settings
|
14
16
|
|
15
17
|
from ..models import Document, DocumentChunk, ProcessingStatus
|
16
18
|
|
@@ -34,14 +36,14 @@ def cleanup_old_embeddings(days_old: int = 90) -> Dict[str, Any]:
|
|
34
36
|
"""
|
35
37
|
try:
|
36
38
|
cutoff_date = timezone.now() - timedelta(days=days_old)
|
37
|
-
|
39
|
+
|
38
40
|
# Find orphaned chunks (documents deleted but chunks remain)
|
39
41
|
orphaned_chunks = DocumentChunk.objects.filter(
|
40
42
|
document__isnull=True
|
41
43
|
)
|
42
44
|
orphaned_count = orphaned_chunks.count()
|
43
45
|
orphaned_chunks.delete()
|
44
|
-
|
46
|
+
|
45
47
|
# Find very old, unused chunks
|
46
48
|
old_chunks = DocumentChunk.objects.filter(
|
47
49
|
created_at__lt=cutoff_date,
|
@@ -49,12 +51,12 @@ def cleanup_old_embeddings(days_old: int = 90) -> Dict[str, Any]:
|
|
49
51
|
)
|
50
52
|
old_count = old_chunks.count()
|
51
53
|
old_chunks.delete()
|
52
|
-
|
54
|
+
|
53
55
|
# Vacuum and analyze tables
|
54
56
|
with connection.cursor() as cursor:
|
55
57
|
cursor.execute("VACUUM ANALYZE django_cfg_knowbase_document_chunks;")
|
56
58
|
cursor.execute("VACUUM ANALYZE django_cfg_knowbase_documents;")
|
57
|
-
|
59
|
+
|
58
60
|
result = {
|
59
61
|
"orphaned_chunks_deleted": orphaned_count,
|
60
62
|
"old_chunks_deleted": old_count,
|
@@ -62,10 +64,10 @@ def cleanup_old_embeddings(days_old: int = 90) -> Dict[str, Any]:
|
|
62
64
|
"cutoff_date": cutoff_date.isoformat(),
|
63
65
|
"timestamp": timezone.now().isoformat()
|
64
66
|
}
|
65
|
-
|
67
|
+
|
66
68
|
logger.info(f"Cleanup completed: {result}")
|
67
69
|
return result
|
68
|
-
|
70
|
+
|
69
71
|
except Exception as exc:
|
70
72
|
logger.error(f"Cleanup failed: {exc}")
|
71
73
|
raise
|
@@ -87,10 +89,10 @@ def optimize_vector_indexes() -> Dict[str, Any]:
|
|
87
89
|
with connection.cursor() as cursor:
|
88
90
|
# Reindex vector indexes (match model definition)
|
89
91
|
cursor.execute("REINDEX INDEX CONCURRENTLY embedding_cosine_idx;")
|
90
|
-
|
92
|
+
|
91
93
|
# Update table statistics
|
92
94
|
cursor.execute("ANALYZE django_cfg_knowbase_document_chunks;")
|
93
|
-
|
95
|
+
|
94
96
|
# Get index usage statistics
|
95
97
|
cursor.execute("""
|
96
98
|
SELECT
|
@@ -102,17 +104,17 @@ def optimize_vector_indexes() -> Dict[str, Any]:
|
|
102
104
|
FROM pg_stat_user_indexes
|
103
105
|
WHERE tablename = 'django_cfg_knowbase_document_chunks';
|
104
106
|
""")
|
105
|
-
|
107
|
+
|
106
108
|
index_stats = cursor.fetchall()
|
107
|
-
|
109
|
+
|
108
110
|
logger.info("Vector indexes optimized successfully")
|
109
|
-
|
111
|
+
|
110
112
|
return {
|
111
113
|
"status": "optimized",
|
112
114
|
"index_stats": index_stats,
|
113
115
|
"timestamp": timezone.now().isoformat()
|
114
116
|
}
|
115
|
-
|
117
|
+
|
116
118
|
except Exception as exc:
|
117
119
|
logger.error(f"Index optimization failed: {exc}")
|
118
120
|
raise
|
@@ -139,18 +141,18 @@ def health_check_knowledge_base() -> Dict[str, Any]:
|
|
139
141
|
"redis_cache": "unknown",
|
140
142
|
"statistics": {}
|
141
143
|
}
|
142
|
-
|
144
|
+
|
143
145
|
# Check database connectivity
|
144
146
|
try:
|
145
147
|
total_docs = Document.objects.count()
|
146
148
|
total_chunks = DocumentChunk.objects.count()
|
147
|
-
|
149
|
+
|
148
150
|
health_status["database"] = "healthy"
|
149
151
|
health_status["statistics"]["total_documents"] = total_docs
|
150
152
|
health_status["statistics"]["total_chunks"] = total_chunks
|
151
153
|
except Exception:
|
152
154
|
health_status["database"] = "unhealthy"
|
153
|
-
|
155
|
+
|
154
156
|
# Check LLM service
|
155
157
|
try:
|
156
158
|
llm_service = LLMClient(
|
@@ -165,7 +167,7 @@ def health_check_knowledge_base() -> Dict[str, Any]:
|
|
165
167
|
health_status["llm_service"] = "not_configured"
|
166
168
|
except Exception:
|
167
169
|
health_status["llm_service"] = "unhealthy"
|
168
|
-
|
170
|
+
|
169
171
|
# Check Redis cache
|
170
172
|
try:
|
171
173
|
cache.set("health_check", "ok", 10)
|
@@ -175,7 +177,7 @@ def health_check_knowledge_base() -> Dict[str, Any]:
|
|
175
177
|
health_status["redis_cache"] = "unhealthy"
|
176
178
|
except Exception:
|
177
179
|
health_status["redis_cache"] = "unhealthy"
|
178
|
-
|
180
|
+
|
179
181
|
# Overall health
|
180
182
|
health_status["overall"] = (
|
181
183
|
"healthy" if all(
|
@@ -186,10 +188,10 @@ def health_check_knowledge_base() -> Dict[str, Any]:
|
|
186
188
|
]
|
187
189
|
) else "degraded"
|
188
190
|
)
|
189
|
-
|
191
|
+
|
190
192
|
logger.info(f"Health check completed: {health_status['overall']}")
|
191
193
|
return health_status
|
192
|
-
|
194
|
+
|
193
195
|
except Exception as exc:
|
194
196
|
logger.error(f"Health check failed: {exc}")
|
195
197
|
raise
|
django_cfg/apps/knowbase/urls.py
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
Knowledge Base URL Configuration
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.urls import
|
5
|
+
from django.urls import include, path
|
6
6
|
from rest_framework.routers import DefaultRouter
|
7
|
-
|
7
|
+
|
8
|
+
from .views.public_views import PublicCategoryViewSet, PublicDocumentViewSet
|
8
9
|
|
9
10
|
# Public router for client access
|
10
11
|
public_router = DefaultRouter()
|
@@ -2,10 +2,13 @@
|
|
2
2
|
Knowledge Base URL Configuration
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.urls import
|
5
|
+
from django.urls import include, path
|
6
6
|
from rest_framework.routers import DefaultRouter
|
7
|
+
|
7
8
|
from .views import (
|
8
|
-
|
9
|
+
ChatSessionViewSet,
|
10
|
+
ChatViewSet,
|
11
|
+
DocumentViewSet,
|
9
12
|
)
|
10
13
|
|
11
14
|
# Create router and register viewsets
|
@@ -20,4 +23,4 @@ urlpatterns = [
|
|
20
23
|
path('', include(router.urls)),
|
21
24
|
]
|
22
25
|
|
23
|
-
app_name = 'cfg_knowbase_admin'
|
26
|
+
app_name = 'cfg_knowbase_admin'
|
@@ -2,11 +2,10 @@
|
|
2
2
|
Knowledge Base URL Configuration
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.urls import
|
5
|
+
from django.urls import include, path
|
6
6
|
from rest_framework.routers import DefaultRouter
|
7
|
-
|
8
|
-
|
9
|
-
)
|
7
|
+
|
8
|
+
from .views import ArchiveItemChunkViewSet, ArchiveItemViewSet, DocumentArchiveViewSet
|
10
9
|
|
11
10
|
# Archive router for authenticated users
|
12
11
|
archive_router = DefaultRouter()
|
@@ -19,7 +18,7 @@ urlpatterns = [
|
|
19
18
|
|
20
19
|
# Archive API endpoints (require authentication)
|
21
20
|
path('', include(archive_router.urls)),
|
22
|
-
|
21
|
+
|
23
22
|
]
|
24
23
|
|
25
24
|
# Add app name for namespacing
|
@@ -6,8 +6,10 @@ settings with type safety and validation.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import logging
|
9
|
-
from typing import
|
9
|
+
from typing import Any, Dict
|
10
|
+
|
10
11
|
from pydantic import BaseModel, Field, validator
|
12
|
+
|
11
13
|
from ..config.constance_settings import ConstanceSettings
|
12
14
|
|
13
15
|
logger = logging.getLogger(__name__)
|
@@ -15,29 +17,29 @@ logger = logging.getLogger(__name__)
|
|
15
17
|
|
16
18
|
class ChunkSettings(BaseModel):
|
17
19
|
"""Pydantic model for chunk processing settings."""
|
18
|
-
|
20
|
+
|
19
21
|
chunk_size: int = Field(
|
20
22
|
ge=100,
|
21
23
|
le=8000,
|
22
24
|
description="Size of each chunk in characters"
|
23
25
|
)
|
24
|
-
|
26
|
+
|
25
27
|
chunk_overlap: int = Field(
|
26
28
|
ge=0,
|
27
29
|
description="Overlap between chunks in characters"
|
28
30
|
)
|
29
|
-
|
31
|
+
|
30
32
|
embedding_batch_size: int = Field(
|
31
33
|
ge=1,
|
32
34
|
le=100,
|
33
35
|
description="Number of chunks to process in one embedding batch"
|
34
36
|
)
|
35
|
-
|
37
|
+
|
36
38
|
embedding_model: str = Field(
|
37
39
|
min_length=1,
|
38
40
|
description="OpenAI embedding model name"
|
39
41
|
)
|
40
|
-
|
42
|
+
|
41
43
|
@validator('chunk_overlap')
|
42
44
|
def validate_overlap(cls, v, values):
|
43
45
|
"""Ensure overlap is less than chunk_size."""
|
@@ -45,7 +47,7 @@ class ChunkSettings(BaseModel):
|
|
45
47
|
if chunk_size and v >= chunk_size:
|
46
48
|
raise ValueError(f"Chunk overlap ({v}) must be less than chunk size ({chunk_size})")
|
47
49
|
return v
|
48
|
-
|
50
|
+
|
49
51
|
class Config:
|
50
52
|
"""Pydantic configuration."""
|
51
53
|
validate_assignment = True
|
@@ -53,7 +55,7 @@ class ChunkSettings(BaseModel):
|
|
53
55
|
|
54
56
|
class ChunkSettingsManager:
|
55
57
|
"""Manager for dynamic chunk settings using Pydantic configuration."""
|
56
|
-
|
58
|
+
|
57
59
|
@classmethod
|
58
60
|
def get_document_settings(cls) -> ChunkSettings:
|
59
61
|
"""Get chunk settings for document processing."""
|
@@ -65,7 +67,7 @@ class ChunkSettingsManager:
|
|
65
67
|
embedding_batch_size=ConstanceSettings.get_embedding_batch_size(),
|
66
68
|
embedding_model=ConstanceSettings.get_embedding_model()
|
67
69
|
)
|
68
|
-
|
70
|
+
|
69
71
|
@classmethod
|
70
72
|
def get_archive_settings(cls) -> ChunkSettings:
|
71
73
|
"""Get chunk settings for archive processing."""
|
@@ -77,7 +79,7 @@ class ChunkSettingsManager:
|
|
77
79
|
embedding_batch_size=ConstanceSettings.get_embedding_batch_size(),
|
78
80
|
embedding_model=ConstanceSettings.get_embedding_model()
|
79
81
|
)
|
80
|
-
|
82
|
+
|
81
83
|
@classmethod
|
82
84
|
def get_settings_for_type(cls, content_type: str) -> ChunkSettings:
|
83
85
|
"""
|
@@ -96,7 +98,7 @@ class ChunkSettingsManager:
|
|
96
98
|
else:
|
97
99
|
logger.warning(f"Unknown content type: {content_type}, using document settings")
|
98
100
|
return cls.get_document_settings()
|
99
|
-
|
101
|
+
|
100
102
|
@classmethod
|
101
103
|
def get_all_settings(cls) -> Dict[str, ChunkSettings]:
|
102
104
|
"""Get all chunk settings as dictionary."""
|
@@ -104,7 +106,7 @@ class ChunkSettingsManager:
|
|
104
106
|
'document': cls.get_document_settings(),
|
105
107
|
'archive': cls.get_archive_settings()
|
106
108
|
}
|
107
|
-
|
109
|
+
|
108
110
|
@classmethod
|
109
111
|
def validate_settings(cls, settings: ChunkSettings) -> bool:
|
110
112
|
"""
|
@@ -119,37 +121,37 @@ class ChunkSettingsManager:
|
|
119
121
|
if settings.chunk_size <= 0:
|
120
122
|
logger.error(f"Invalid chunk_size: {settings.chunk_size}")
|
121
123
|
return False
|
122
|
-
|
124
|
+
|
123
125
|
if settings.chunk_overlap < 0:
|
124
126
|
logger.error(f"Invalid chunk_overlap: {settings.chunk_overlap}")
|
125
127
|
return False
|
126
|
-
|
128
|
+
|
127
129
|
if settings.chunk_overlap >= settings.chunk_size:
|
128
130
|
logger.error(f"Chunk overlap ({settings.chunk_overlap}) must be less than chunk size ({settings.chunk_size})")
|
129
131
|
return False
|
130
|
-
|
132
|
+
|
131
133
|
if settings.embedding_batch_size <= 0 or settings.embedding_batch_size > 2048:
|
132
134
|
logger.error(f"Invalid embedding_batch_size: {settings.embedding_batch_size} (must be 1-2048)")
|
133
135
|
return False
|
134
|
-
|
136
|
+
|
135
137
|
if not settings.embedding_model or not settings.embedding_model.strip():
|
136
138
|
logger.error("Embedding model cannot be empty")
|
137
139
|
return False
|
138
|
-
|
140
|
+
|
139
141
|
return True
|
140
|
-
|
142
|
+
|
141
143
|
@classmethod
|
142
144
|
def log_current_settings(cls) -> None:
|
143
145
|
"""Log current settings for debugging."""
|
144
146
|
try:
|
145
147
|
doc_settings = cls.get_document_settings()
|
146
148
|
archive_settings = cls.get_archive_settings()
|
147
|
-
|
149
|
+
|
148
150
|
logger.info("📊 Current Chunk Settings:")
|
149
151
|
logger.info(f" 📄 Documents: size={doc_settings.chunk_size}, overlap={doc_settings.chunk_overlap}")
|
150
152
|
logger.info(f" 📦 Archives: size={archive_settings.chunk_size}, overlap={archive_settings.chunk_overlap}")
|
151
153
|
logger.info(f" 🔮 Embedding: batch_size={doc_settings.embedding_batch_size}, model={doc_settings.embedding_model}")
|
152
|
-
|
154
|
+
|
153
155
|
except Exception as e:
|
154
156
|
logger.error(f"Failed to log current settings: {e}")
|
155
157
|
|