django-cfg 1.4.21__py3-none-any.whl → 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -2,23 +2,24 @@
|
|
2
2
|
RAG-powered chat service.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from typing import
|
6
|
-
|
5
|
+
from typing import Any, Dict, List
|
6
|
+
|
7
7
|
from django_cfg.modules.django_llm.llm.models import ChatCompletionResponse
|
8
|
-
|
8
|
+
|
9
|
+
from ..models import ChatMessage, ChatSession
|
9
10
|
from ..utils.validation import clean_search_results, safe_float
|
10
11
|
from .base import BaseService
|
11
|
-
from .search_service import SearchService
|
12
12
|
from .prompt_builder import SystemPromptBuilder
|
13
|
+
from .search_service import SearchService
|
13
14
|
|
14
15
|
|
15
16
|
class ChatService(BaseService):
|
16
17
|
"""RAG-powered chat service with context management."""
|
17
|
-
|
18
|
+
|
18
19
|
def __init__(self, user):
|
19
20
|
super().__init__(user)
|
20
21
|
self.search_service = SearchService(user)
|
21
|
-
|
22
|
+
|
22
23
|
def create_session(
|
23
24
|
self,
|
24
25
|
title: str = "",
|
@@ -27,7 +28,7 @@ class ChatService(BaseService):
|
|
27
28
|
max_context_chunks: int = 5
|
28
29
|
) -> ChatSession:
|
29
30
|
"""Create new chat session."""
|
30
|
-
|
31
|
+
|
31
32
|
session = ChatSession.objects.create(
|
32
33
|
user=self.user,
|
33
34
|
title=title or "New Chat Session",
|
@@ -36,9 +37,9 @@ class ChatService(BaseService):
|
|
36
37
|
max_context_chunks=max_context_chunks,
|
37
38
|
is_active=True
|
38
39
|
)
|
39
|
-
|
40
|
+
|
40
41
|
return session
|
41
|
-
|
42
|
+
|
42
43
|
def process_query(
|
43
44
|
self,
|
44
45
|
session_id: str,
|
@@ -48,14 +49,14 @@ class ChatService(BaseService):
|
|
48
49
|
enable_diagrams: bool = False
|
49
50
|
) -> Dict[str, Any]:
|
50
51
|
"""Process chat query with RAG context."""
|
51
|
-
|
52
|
+
|
52
53
|
# Get session
|
53
54
|
session = ChatSession.objects.get(
|
54
55
|
id=session_id,
|
55
56
|
user=self.user,
|
56
57
|
is_active=True
|
57
58
|
)
|
58
|
-
|
59
|
+
|
59
60
|
# Perform universal semantic search for context (documents + archives + external data)
|
60
61
|
# Using type-specific thresholds automatically
|
61
62
|
raw_search_results = self.search_service.semantic_search_universal(
|
@@ -66,10 +67,10 @@ class ChatService(BaseService):
|
|
66
67
|
include_archives=True,
|
67
68
|
include_external=True
|
68
69
|
)
|
69
|
-
|
70
|
+
|
70
71
|
# Clean search results to remove invalid similarity scores
|
71
72
|
search_results = clean_search_results(raw_search_results)
|
72
|
-
|
73
|
+
|
73
74
|
# Build context messages
|
74
75
|
context_messages = self._build_context_messages(
|
75
76
|
session=session,
|
@@ -77,7 +78,7 @@ class ChatService(BaseService):
|
|
77
78
|
search_results=search_results,
|
78
79
|
enable_diagrams=enable_diagrams
|
79
80
|
)
|
80
|
-
|
81
|
+
|
81
82
|
# Generate LLM response (now returns ChatCompletionResponse Pydantic model)
|
82
83
|
response: ChatCompletionResponse = self.llm_client.chat_completion(
|
83
84
|
messages=context_messages,
|
@@ -85,7 +86,7 @@ class ChatService(BaseService):
|
|
85
86
|
temperature=session.temperature,
|
86
87
|
max_tokens=max_tokens
|
87
88
|
)
|
88
|
-
|
89
|
+
|
89
90
|
# Save user message
|
90
91
|
context_chunk_ids = []
|
91
92
|
for result in search_results:
|
@@ -95,7 +96,7 @@ class ChatService(BaseService):
|
|
95
96
|
context_chunk_ids.append(f"archive:{result['chunk'].id}")
|
96
97
|
elif result['type'] == 'external_data':
|
97
98
|
context_chunk_ids.append(f"external:{result['chunk'].id}")
|
98
|
-
|
99
|
+
|
99
100
|
user_message = ChatMessage.objects.create(
|
100
101
|
session=session,
|
101
102
|
user=self.user,
|
@@ -103,7 +104,7 @@ class ChatService(BaseService):
|
|
103
104
|
content=query,
|
104
105
|
context_chunks=context_chunk_ids
|
105
106
|
)
|
106
|
-
|
107
|
+
|
107
108
|
# Save assistant response
|
108
109
|
assistant_message = ChatMessage.objects.create(
|
109
110
|
session=session,
|
@@ -116,17 +117,17 @@ class ChatService(BaseService):
|
|
116
117
|
model_name=session.model_name,
|
117
118
|
finish_reason=response.finish_reason
|
118
119
|
)
|
119
|
-
|
120
|
+
|
120
121
|
# Update session statistics (messages_count is handled by signals)
|
121
122
|
session.total_tokens_used += response.tokens_used
|
122
123
|
session.total_cost_usd = safe_float(session.total_cost_usd, 0.0) + safe_float(response.cost_usd, 0.0)
|
123
124
|
session.save()
|
124
|
-
|
125
|
+
|
125
126
|
# Auto-generate session title if empty
|
126
127
|
if not session.title or session.title == "New Chat Session":
|
127
128
|
session.title = query[:50] + "..." if len(query) > 50 else query
|
128
129
|
session.save()
|
129
|
-
|
130
|
+
|
130
131
|
result = {
|
131
132
|
'message_id': str(assistant_message.id),
|
132
133
|
'content': response.content,
|
@@ -135,7 +136,7 @@ class ChatService(BaseService):
|
|
135
136
|
'processing_time_ms': int(response.processing_time * 1000),
|
136
137
|
'model_used': session.model_name
|
137
138
|
}
|
138
|
-
|
139
|
+
|
139
140
|
if include_sources:
|
140
141
|
# Search results are already cleaned by clean_search_results()
|
141
142
|
result['sources'] = [
|
@@ -148,9 +149,9 @@ class ChatService(BaseService):
|
|
148
149
|
}
|
149
150
|
for search_result in search_results
|
150
151
|
]
|
151
|
-
|
152
|
+
|
152
153
|
return result
|
153
|
-
|
154
|
+
|
154
155
|
def _build_context_messages(
|
155
156
|
self,
|
156
157
|
session: ChatSession,
|
@@ -159,9 +160,9 @@ class ChatService(BaseService):
|
|
159
160
|
enable_diagrams: bool = False
|
160
161
|
) -> List[Dict[str, str]]:
|
161
162
|
"""Build context messages for LLM."""
|
162
|
-
|
163
|
+
|
163
164
|
messages = []
|
164
|
-
|
165
|
+
|
165
166
|
# Build system message using SystemPromptBuilder
|
166
167
|
if enable_diagrams:
|
167
168
|
system_message = SystemPromptBuilder.build_diagram_enhanced_prompt(
|
@@ -171,61 +172,61 @@ class ChatService(BaseService):
|
|
171
172
|
system_message = SystemPromptBuilder.build_conversation_prompt(
|
172
173
|
search_results=search_results if search_results else None
|
173
174
|
)
|
174
|
-
|
175
|
+
|
175
176
|
messages.append({
|
176
177
|
"role": "system",
|
177
178
|
"content": system_message
|
178
179
|
})
|
179
|
-
|
180
|
+
|
180
181
|
# Add recent conversation history (last 5 messages)
|
181
182
|
recent_messages = list(ChatMessage.objects.filter(
|
182
183
|
session=session
|
183
184
|
).order_by('-created_at')[:5])
|
184
|
-
|
185
|
+
|
185
186
|
# Reverse to get chronological order
|
186
187
|
for message in reversed(recent_messages):
|
187
188
|
messages.append({
|
188
189
|
"role": message.role,
|
189
190
|
"content": message.content
|
190
191
|
})
|
191
|
-
|
192
|
+
|
192
193
|
# Add current query
|
193
194
|
messages.append({
|
194
195
|
"role": "user",
|
195
196
|
"content": query
|
196
197
|
})
|
197
|
-
|
198
|
+
|
198
199
|
return messages
|
199
|
-
|
200
|
+
|
200
201
|
def get_session_history(
|
201
202
|
self,
|
202
203
|
session_id: str,
|
203
204
|
limit: int = 50
|
204
205
|
) -> List[ChatMessage]:
|
205
206
|
"""Get chat session message history."""
|
206
|
-
|
207
|
+
|
207
208
|
# Verify session access
|
208
209
|
session = ChatSession.objects.get(
|
209
210
|
id=session_id,
|
210
211
|
user=self.user
|
211
212
|
)
|
212
|
-
|
213
|
+
|
213
214
|
messages = ChatMessage.objects.filter(
|
214
215
|
session=session
|
215
216
|
).order_by('created_at')[:limit]
|
216
|
-
|
217
|
+
|
217
218
|
return list(messages)
|
218
|
-
|
219
|
+
|
219
220
|
def list_sessions(self, active_only: bool = True) -> List[ChatSession]:
|
220
221
|
"""List user chat sessions."""
|
221
|
-
|
222
|
+
|
222
223
|
queryset = ChatSession.objects.filter(user=self.user)
|
223
|
-
|
224
|
+
|
224
225
|
if active_only:
|
225
226
|
queryset = queryset.filter(is_active=True)
|
226
|
-
|
227
|
+
|
227
228
|
return list(queryset.order_by('-created_at'))
|
228
|
-
|
229
|
+
|
229
230
|
def delete_session(self, session_id: str) -> bool:
|
230
231
|
"""Delete chat session and all messages."""
|
231
232
|
try:
|
@@ -2,16 +2,17 @@
|
|
2
2
|
Document management service.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from typing import
|
6
|
-
|
7
|
-
from django.
|
5
|
+
from typing import Any, Dict, List, Optional
|
6
|
+
|
7
|
+
from django.db import models, transaction
|
8
|
+
|
8
9
|
from ..models import Document, DocumentChunk, ProcessingStatus
|
9
10
|
from .base import BaseService
|
10
11
|
|
11
12
|
|
12
13
|
class DocumentService(BaseService):
|
13
14
|
"""Service for document management and processing."""
|
14
|
-
|
15
|
+
|
15
16
|
def create_document(
|
16
17
|
self,
|
17
18
|
title: str,
|
@@ -20,19 +21,19 @@ class DocumentService(BaseService):
|
|
20
21
|
metadata: Optional[Dict[str, Any]] = None
|
21
22
|
) -> Document:
|
22
23
|
"""Create document and trigger async processing."""
|
23
|
-
|
24
|
+
|
24
25
|
# Generate content hash for duplicate detection
|
25
26
|
content_hash = self._generate_content_hash(content)
|
26
|
-
|
27
|
+
|
27
28
|
# Check for duplicates
|
28
29
|
existing = Document.objects.filter(
|
29
30
|
user=self.user,
|
30
31
|
content_hash=content_hash
|
31
32
|
).first()
|
32
|
-
|
33
|
+
|
33
34
|
if existing:
|
34
35
|
raise ValueError(f"Document with same content already exists: {existing.title}")
|
35
|
-
|
36
|
+
|
36
37
|
# Create document (async processing will be triggered by post_save signal)
|
37
38
|
document = Document.objects.create(
|
38
39
|
user=self.user,
|
@@ -44,9 +45,9 @@ class DocumentService(BaseService):
|
|
44
45
|
metadata=metadata or {},
|
45
46
|
processing_status=ProcessingStatus.PENDING
|
46
47
|
)
|
47
|
-
|
48
|
+
|
48
49
|
return document
|
49
|
-
|
50
|
+
|
50
51
|
def get_document(self, document_id: str) -> Optional[Document]:
|
51
52
|
"""Get document by ID with user access check."""
|
52
53
|
try:
|
@@ -57,16 +58,16 @@ class DocumentService(BaseService):
|
|
57
58
|
return document
|
58
59
|
except Document.DoesNotExist:
|
59
60
|
return None
|
60
|
-
|
61
|
+
|
61
62
|
def get_user_documents(self, status: Optional[str] = None):
|
62
63
|
"""Get user documents queryset with filtering."""
|
63
64
|
queryset = Document.objects.filter(user=self.user)
|
64
|
-
|
65
|
+
|
65
66
|
if status:
|
66
67
|
queryset = queryset.filter(processing_status=status)
|
67
|
-
|
68
|
+
|
68
69
|
return queryset.order_by('-created_at')
|
69
|
-
|
70
|
+
|
70
71
|
def list_documents(
|
71
72
|
self,
|
72
73
|
status: Optional[str] = None,
|
@@ -76,7 +77,7 @@ class DocumentService(BaseService):
|
|
76
77
|
"""List user documents with filtering."""
|
77
78
|
queryset = self.get_user_documents(status)
|
78
79
|
return list(queryset[offset:offset + limit])
|
79
|
-
|
80
|
+
|
80
81
|
def delete_document(self, document_id: str) -> bool:
|
81
82
|
"""Delete document and all associated chunks."""
|
82
83
|
try:
|
@@ -85,22 +86,22 @@ class DocumentService(BaseService):
|
|
85
86
|
id=document_id,
|
86
87
|
user=self.user
|
87
88
|
)
|
88
|
-
|
89
|
+
|
89
90
|
# Delete associated chunks first
|
90
91
|
DocumentChunk.objects.filter(document=document).delete()
|
91
|
-
|
92
|
+
|
92
93
|
# Delete document
|
93
94
|
document.delete()
|
94
|
-
|
95
|
+
|
95
96
|
return True
|
96
97
|
except Document.DoesNotExist:
|
97
98
|
return False
|
98
|
-
|
99
|
+
|
99
100
|
def get_processing_stats(self) -> Dict[str, Any]:
|
100
101
|
"""Get user's document processing statistics."""
|
101
|
-
|
102
|
-
from django.db.models import Count, Sum
|
103
|
-
|
102
|
+
|
103
|
+
from django.db.models import Count, Sum
|
104
|
+
|
104
105
|
stats = Document.objects.filter(user=self.user).aggregate(
|
105
106
|
total_documents=Count('id'),
|
106
107
|
completed_documents=Count('id', filter=models.Q(processing_status=ProcessingStatus.COMPLETED)),
|
@@ -108,7 +109,7 @@ class DocumentService(BaseService):
|
|
108
109
|
total_tokens=Sum('total_tokens'),
|
109
110
|
total_cost=Sum('total_cost_usd'),
|
110
111
|
)
|
111
|
-
|
112
|
+
|
112
113
|
return {
|
113
114
|
'total_documents': stats['total_documents'] or 0,
|
114
115
|
'completed_documents': stats['completed_documents'] or 0,
|
@@ -121,7 +122,7 @@ class DocumentService(BaseService):
|
|
121
122
|
'total_cost_usd': float(stats['total_cost'] or 0),
|
122
123
|
'avg_processing_time_seconds': 0.0 # Calculated separately if needed
|
123
124
|
}
|
124
|
-
|
125
|
+
|
125
126
|
def reprocess_document(self, document_id: str) -> bool:
|
126
127
|
"""Trigger document reprocessing."""
|
127
128
|
try:
|
@@ -129,16 +130,16 @@ class DocumentService(BaseService):
|
|
129
130
|
id=document_id,
|
130
131
|
user=self.user
|
131
132
|
)
|
132
|
-
|
133
|
+
|
133
134
|
# Reset processing status
|
134
135
|
document.processing_status = ProcessingStatus.PENDING
|
135
136
|
document.processing_error = ""
|
136
137
|
document.save()
|
137
|
-
|
138
|
+
|
138
139
|
# Trigger async reprocessing
|
139
140
|
from ..tasks import reprocess_document_chunks
|
140
141
|
reprocess_document_chunks.send(str(document.id))
|
141
|
-
|
142
|
+
|
142
143
|
return True
|
143
144
|
except Document.DoesNotExist:
|
144
145
|
return False
|
@@ -5,36 +5,36 @@ This package provides high-performance embedding generation services
|
|
5
5
|
for documents and archives with batch processing and async support.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from .models import ChunkData, EmbeddingResult, BatchProcessingResult, ProcessingConfig, ChunkType
|
9
|
-
from .processors import DocumentChunkProcessor, ArchiveChunkProcessor, ExternalDataChunkProcessor
|
10
|
-
from .batch_processor import OptimizedEmbeddingProcessor
|
11
8
|
from .async_processor import AsyncOptimizedEmbeddingProcessor
|
9
|
+
from .batch_processor import OptimizedEmbeddingProcessor
|
12
10
|
from .batch_result import BatchResultBuilder
|
11
|
+
from .models import BatchProcessingResult, ChunkData, ChunkType, EmbeddingResult, ProcessingConfig
|
12
|
+
from .processors import ArchiveChunkProcessor, DocumentChunkProcessor, ExternalDataChunkProcessor
|
13
13
|
from .utils import (
|
14
|
-
process_document_chunks_optimized,
|
15
14
|
process_archive_chunks_optimized,
|
16
|
-
process_external_data_chunks_optimized,
|
17
15
|
process_chunks_context_aware,
|
16
|
+
process_document_chunks_optimized,
|
17
|
+
process_external_data_chunks_optimized,
|
18
18
|
)
|
19
19
|
|
20
20
|
__all__ = [
|
21
21
|
# Data models
|
22
22
|
"ChunkData",
|
23
|
-
"EmbeddingResult",
|
23
|
+
"EmbeddingResult",
|
24
24
|
"BatchProcessingResult",
|
25
25
|
"ProcessingConfig",
|
26
26
|
"ChunkType",
|
27
|
-
|
27
|
+
|
28
28
|
# Processors
|
29
29
|
"DocumentChunkProcessor",
|
30
30
|
"ArchiveChunkProcessor",
|
31
31
|
"ExternalDataChunkProcessor",
|
32
32
|
"OptimizedEmbeddingProcessor",
|
33
33
|
"AsyncOptimizedEmbeddingProcessor",
|
34
|
-
|
34
|
+
|
35
35
|
# Utilities
|
36
36
|
"BatchResultBuilder",
|
37
|
-
|
37
|
+
|
38
38
|
# Convenience functions
|
39
39
|
"process_document_chunks_optimized",
|
40
40
|
"process_archive_chunks_optimized",
|
@@ -6,18 +6,16 @@ following Django 5.2 async best practices.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import asyncio
|
9
|
-
import time
|
10
9
|
import logging
|
11
|
-
|
10
|
+
import time
|
11
|
+
from typing import Any, Dict, List, Optional
|
12
12
|
|
13
|
-
from asgiref.sync import
|
14
|
-
from django.db import transaction
|
13
|
+
from asgiref.sync import async_to_sync
|
15
14
|
|
16
|
-
from django_cfg.apps.knowbase.models import
|
17
|
-
from django_cfg.apps.knowbase.utils.chunk_settings import get_embedding_batch_size, get_embedding_model
|
15
|
+
from django_cfg.apps.knowbase.models import ArchiveItemChunk, DocumentChunk
|
18
16
|
|
19
|
-
from .models import ChunkData, BatchProcessingResult, EmbeddingResult
|
20
17
|
from .batch_processor import OptimizedEmbeddingProcessor
|
18
|
+
from .models import BatchProcessingResult, ChunkData, EmbeddingResult
|
21
19
|
|
22
20
|
logger = logging.getLogger(__name__)
|
23
21
|
|
@@ -40,12 +38,12 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
40
38
|
- Proper async/sync method selection
|
41
39
|
- Compatible with both WSGI and ASGI
|
42
40
|
"""
|
43
|
-
|
41
|
+
|
44
42
|
def __init__(self, batch_size: Optional[int] = None, embedding_model: Optional[str] = None):
|
45
43
|
"""Initialize async-compatible processor."""
|
46
44
|
super().__init__(batch_size, embedding_model)
|
47
45
|
logger.info(f"🚀 AsyncOptimizedEmbeddingProcessor initialized: async_context={is_async_context()}")
|
48
|
-
|
46
|
+
|
49
47
|
async def aprocess_chunks_batch(self, chunks: List[ChunkData]) -> BatchProcessingResult:
|
50
48
|
"""
|
51
49
|
Async version of batch processing.
|
@@ -59,38 +57,38 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
59
57
|
total_tokens = 0
|
60
58
|
total_cost = 0.0
|
61
59
|
errors = []
|
62
|
-
|
60
|
+
|
63
61
|
logger.info(f"🔮 Starting async batch processing of {total_chunks} chunks")
|
64
|
-
|
62
|
+
|
65
63
|
# Process in batches
|
66
64
|
for i in range(0, total_chunks, self.batch_size):
|
67
65
|
batch = chunks[i:i + self.batch_size]
|
68
66
|
batch_num = (i // self.batch_size) + 1
|
69
67
|
total_batches = (total_chunks + self.batch_size - 1) // self.batch_size
|
70
|
-
|
68
|
+
|
71
69
|
logger.info(f"🔮 Processing async batch {batch_num}/{total_batches} ({len(batch)} chunks)")
|
72
|
-
|
70
|
+
|
73
71
|
try:
|
74
72
|
batch_result = await self._aprocess_single_batch(batch)
|
75
|
-
|
73
|
+
|
76
74
|
successful_chunks += batch_result['successful']
|
77
75
|
failed_chunks += batch_result['failed']
|
78
76
|
total_tokens += batch_result['tokens']
|
79
77
|
total_cost += batch_result['cost']
|
80
78
|
errors.extend(batch_result['errors'])
|
81
|
-
|
79
|
+
|
82
80
|
# Small async delay between batches
|
83
81
|
if i + self.batch_size < total_chunks:
|
84
82
|
await asyncio.sleep(0.5)
|
85
|
-
|
83
|
+
|
86
84
|
except Exception as e:
|
87
85
|
error_msg = f"Async batch {batch_num} failed: {str(e)}"
|
88
86
|
logger.error(f"❌ {error_msg}")
|
89
87
|
errors.append(error_msg)
|
90
88
|
failed_chunks += len(batch)
|
91
|
-
|
89
|
+
|
92
90
|
processing_time = time.time() - start_time
|
93
|
-
|
91
|
+
|
94
92
|
result = BatchProcessingResult(
|
95
93
|
total_chunks=total_chunks,
|
96
94
|
successful_chunks=successful_chunks,
|
@@ -100,27 +98,27 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
100
98
|
processing_time=processing_time,
|
101
99
|
errors=errors
|
102
100
|
)
|
103
|
-
|
101
|
+
|
104
102
|
logger.info(
|
105
103
|
f"🎉 Async batch processing completed: {successful_chunks}/{total_chunks} successful, "
|
106
104
|
f"{total_tokens} tokens, ${total_cost:.4f} cost, {processing_time:.2f}s"
|
107
105
|
)
|
108
|
-
|
106
|
+
|
109
107
|
return result
|
110
|
-
|
108
|
+
|
111
109
|
async def _aprocess_single_batch(self, batch: List[ChunkData]) -> Dict[str, Any]:
|
112
110
|
"""Async version of single batch processing."""
|
113
|
-
|
111
|
+
|
114
112
|
# Prepare content for all chunks (sync operation)
|
115
113
|
prepared_contents = []
|
116
114
|
chunk_mapping = {}
|
117
|
-
|
115
|
+
|
118
116
|
for idx, chunk in enumerate(batch):
|
119
117
|
processor = self.processors.get(chunk.parent_type)
|
120
118
|
if not processor:
|
121
119
|
logger.warning(f"⚠️ Unknown chunk type: {chunk.parent_type}")
|
122
120
|
continue
|
123
|
-
|
121
|
+
|
124
122
|
try:
|
125
123
|
content = processor.prepare_content_for_embedding(chunk)
|
126
124
|
if content and content.strip():
|
@@ -130,7 +128,7 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
130
128
|
logger.warning(f"⚠️ Empty content for chunk {chunk.id}")
|
131
129
|
except Exception as e:
|
132
130
|
logger.error(f"❌ Failed to prepare content for chunk {chunk.id}: {e}")
|
133
|
-
|
131
|
+
|
134
132
|
if not prepared_contents:
|
135
133
|
return {
|
136
134
|
'successful': 0,
|
@@ -139,24 +137,24 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
139
137
|
'cost': 0.0,
|
140
138
|
'errors': ['No valid content to process']
|
141
139
|
}
|
142
|
-
|
140
|
+
|
143
141
|
# Generate embeddings (sync operation - OpenAI client is sync)
|
144
142
|
try:
|
145
143
|
embedding_results = self._generate_batch_embeddings(prepared_contents)
|
146
|
-
|
144
|
+
|
147
145
|
# Save results using async database operations
|
148
146
|
successful = 0
|
149
147
|
failed = 0
|
150
148
|
total_tokens = 0
|
151
149
|
total_cost = 0.0
|
152
150
|
errors = []
|
153
|
-
|
151
|
+
|
154
152
|
for idx, embedding_result in enumerate(embedding_results):
|
155
153
|
if idx not in chunk_mapping:
|
156
154
|
continue
|
157
|
-
|
155
|
+
|
158
156
|
chunk = chunk_mapping[idx]
|
159
|
-
|
157
|
+
|
160
158
|
if embedding_result.success:
|
161
159
|
try:
|
162
160
|
await self._asave_embedding_result(chunk, embedding_result)
|
@@ -171,7 +169,7 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
171
169
|
else:
|
172
170
|
errors.append(embedding_result.error or f"Failed to generate embedding for chunk {chunk.id}")
|
173
171
|
failed += 1
|
174
|
-
|
172
|
+
|
175
173
|
return {
|
176
174
|
'successful': successful,
|
177
175
|
'failed': failed,
|
@@ -179,7 +177,7 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
179
177
|
'cost': total_cost,
|
180
178
|
'errors': errors
|
181
179
|
}
|
182
|
-
|
180
|
+
|
183
181
|
except Exception as e:
|
184
182
|
error_msg = f"Async batch embedding generation failed: {e}"
|
185
183
|
logger.error(f"❌ {error_msg}")
|
@@ -190,10 +188,10 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
190
188
|
'cost': 0.0,
|
191
189
|
'errors': [error_msg]
|
192
190
|
}
|
193
|
-
|
191
|
+
|
194
192
|
async def _asave_embedding_result(self, chunk: ChunkData, result: EmbeddingResult) -> None:
|
195
193
|
"""Save embedding result using async database operations."""
|
196
|
-
|
194
|
+
|
197
195
|
try:
|
198
196
|
if chunk.parent_type == "document":
|
199
197
|
# Use Django 5.2 async ORM methods
|
@@ -202,9 +200,9 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
202
200
|
chunk_obj.token_count = result.tokens
|
203
201
|
chunk_obj.embedding_cost = result.cost
|
204
202
|
await chunk_obj.asave(update_fields=['embedding', 'token_count', 'embedding_cost'])
|
205
|
-
|
203
|
+
|
206
204
|
logger.debug(f"✅ Async document chunk {chunk.id} embedding saved: {result.tokens} tokens, ${result.cost:.4f}")
|
207
|
-
|
205
|
+
|
208
206
|
elif chunk.parent_type == "archive":
|
209
207
|
# Use async ORM with select_related
|
210
208
|
chunk_obj = await ArchiveItemChunk.objects.select_related('item').aget(id=chunk.id)
|
@@ -212,21 +210,21 @@ class AsyncOptimizedEmbeddingProcessor(OptimizedEmbeddingProcessor):
|
|
212
210
|
chunk_obj.token_count = result.tokens
|
213
211
|
chunk_obj.embedding_cost = result.cost
|
214
212
|
await chunk_obj.asave(update_fields=['embedding', 'token_count', 'embedding_cost'])
|
215
|
-
|
213
|
+
|
216
214
|
# Update parent item statistics
|
217
215
|
item = chunk_obj.item
|
218
216
|
item.total_tokens += result.tokens
|
219
217
|
item.processing_cost += result.cost
|
220
218
|
await item.asave(update_fields=['total_tokens', 'processing_cost'])
|
221
|
-
|
219
|
+
|
222
220
|
logger.debug(f"✅ Async archive chunk {chunk.id} embedding saved: {result.tokens} tokens, ${result.cost:.4f}")
|
223
221
|
else:
|
224
222
|
raise ValueError(f"Unknown chunk type: {chunk.parent_type}")
|
225
|
-
|
223
|
+
|
226
224
|
except Exception as e:
|
227
225
|
logger.error(f"❌ Failed to save async embedding for chunk {chunk.id}: {e}")
|
228
226
|
raise
|
229
|
-
|
227
|
+
|
230
228
|
def process_chunks_batch_context_aware(self, chunks: List[ChunkData]) -> BatchProcessingResult:
|
231
229
|
"""
|
232
230
|
Context-aware processing that works in both sync and async contexts.
|