django-cfg 1.4.20__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/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- 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 +35 -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 +36 -35
- 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 +12 -13
- 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.20.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.20.dist-info/RECORD +0 -1110
- /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.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -8,18 +8,18 @@ embedding processing operations.
|
|
8
8
|
import logging
|
9
9
|
from typing import List, Union
|
10
10
|
|
11
|
-
from django_cfg.apps.knowbase.models import
|
11
|
+
from django_cfg.apps.knowbase.models import ArchiveItemChunk, DocumentChunk, ExternalDataChunk
|
12
12
|
|
13
|
-
from .models import ChunkData, BatchProcessingResult, ChunkType
|
14
|
-
from .batch_processor import OptimizedEmbeddingProcessor
|
15
13
|
from .async_processor import AsyncOptimizedEmbeddingProcessor
|
14
|
+
from .batch_processor import OptimizedEmbeddingProcessor
|
15
|
+
from .models import BatchProcessingResult, ChunkData, ChunkType
|
16
16
|
|
17
17
|
logger = logging.getLogger(__name__)
|
18
18
|
|
19
19
|
|
20
20
|
def process_document_chunks_optimized(document_chunks: List[DocumentChunk]) -> BatchProcessingResult:
|
21
21
|
"""Process document chunks with optimized batch operations."""
|
22
|
-
|
22
|
+
|
23
23
|
chunk_data = [
|
24
24
|
ChunkData(
|
25
25
|
id=str(chunk.id),
|
@@ -30,14 +30,14 @@ def process_document_chunks_optimized(document_chunks: List[DocumentChunk]) -> B
|
|
30
30
|
for chunk in document_chunks
|
31
31
|
if chunk.content and chunk.content.strip()
|
32
32
|
]
|
33
|
-
|
33
|
+
|
34
34
|
processor = OptimizedEmbeddingProcessor()
|
35
35
|
return processor.process_chunks_batch(chunk_data)
|
36
36
|
|
37
37
|
|
38
38
|
def process_archive_chunks_optimized(archive_chunks: List[ArchiveItemChunk]) -> BatchProcessingResult:
|
39
39
|
"""Process archive chunks with optimized batch operations."""
|
40
|
-
|
40
|
+
|
41
41
|
chunk_data = [
|
42
42
|
ChunkData(
|
43
43
|
id=str(chunk.id),
|
@@ -49,14 +49,14 @@ def process_archive_chunks_optimized(archive_chunks: List[ArchiveItemChunk]) ->
|
|
49
49
|
for chunk in archive_chunks
|
50
50
|
if chunk.content and chunk.content.strip()
|
51
51
|
]
|
52
|
-
|
52
|
+
|
53
53
|
processor = OptimizedEmbeddingProcessor()
|
54
54
|
return processor.process_chunks_batch(chunk_data)
|
55
55
|
|
56
56
|
|
57
57
|
async def aprocess_document_chunks_optimized(document_chunks: List[DocumentChunk]) -> BatchProcessingResult:
|
58
58
|
"""Async version of document chunk processing."""
|
59
|
-
|
59
|
+
|
60
60
|
chunk_data = [
|
61
61
|
ChunkData(
|
62
62
|
id=str(chunk.id),
|
@@ -67,14 +67,14 @@ async def aprocess_document_chunks_optimized(document_chunks: List[DocumentChunk
|
|
67
67
|
for chunk in document_chunks
|
68
68
|
if chunk.content and chunk.content.strip()
|
69
69
|
]
|
70
|
-
|
70
|
+
|
71
71
|
processor = AsyncOptimizedEmbeddingProcessor()
|
72
72
|
return await processor.aprocess_chunks_batch(chunk_data)
|
73
73
|
|
74
74
|
|
75
75
|
async def aprocess_archive_chunks_optimized(archive_chunks: List[ArchiveItemChunk]) -> BatchProcessingResult:
|
76
76
|
"""Async version of archive chunk processing."""
|
77
|
-
|
77
|
+
|
78
78
|
chunk_data = [
|
79
79
|
ChunkData(
|
80
80
|
id=str(chunk.id),
|
@@ -86,7 +86,7 @@ async def aprocess_archive_chunks_optimized(archive_chunks: List[ArchiveItemChun
|
|
86
86
|
for chunk in archive_chunks
|
87
87
|
if chunk.content and chunk.content.strip()
|
88
88
|
]
|
89
|
-
|
89
|
+
|
90
90
|
processor = AsyncOptimizedEmbeddingProcessor()
|
91
91
|
return await processor.aprocess_chunks_batch(chunk_data)
|
92
92
|
|
@@ -107,7 +107,7 @@ def process_chunks_context_aware(chunks: Union[List[DocumentChunk], List[Archive
|
|
107
107
|
processing_time=0.0,
|
108
108
|
errors=[]
|
109
109
|
)
|
110
|
-
|
110
|
+
|
111
111
|
# Determine chunk type
|
112
112
|
first_chunk = chunks[0]
|
113
113
|
if isinstance(first_chunk, DocumentChunk):
|
@@ -135,14 +135,14 @@ def process_chunks_context_aware(chunks: Union[List[DocumentChunk], List[Archive
|
|
135
135
|
]
|
136
136
|
else:
|
137
137
|
raise ValueError(f"Unsupported chunk type: {type(first_chunk)}")
|
138
|
-
|
138
|
+
|
139
139
|
processor = AsyncOptimizedEmbeddingProcessor()
|
140
140
|
return processor.process_chunks_batch_context_aware(chunk_data)
|
141
141
|
|
142
142
|
|
143
143
|
def process_external_data_chunks_optimized(external_data_chunks: List[ExternalDataChunk]) -> BatchProcessingResult:
|
144
144
|
"""Process external data chunks with optimized batch operations."""
|
145
|
-
|
145
|
+
|
146
146
|
chunk_data = [
|
147
147
|
ChunkData(
|
148
148
|
id=str(chunk.id),
|
@@ -153,14 +153,14 @@ def process_external_data_chunks_optimized(external_data_chunks: List[ExternalDa
|
|
153
153
|
)
|
154
154
|
for chunk in external_data_chunks
|
155
155
|
]
|
156
|
-
|
156
|
+
|
157
157
|
processor = OptimizedEmbeddingProcessor()
|
158
158
|
return processor.process_chunks_batch(chunk_data)
|
159
159
|
|
160
160
|
|
161
161
|
async def aprocess_external_data_chunks_optimized(external_data_chunks: List[ExternalDataChunk]) -> BatchProcessingResult:
|
162
162
|
"""Async version of external data chunk processing."""
|
163
|
-
|
163
|
+
|
164
164
|
chunk_data = [
|
165
165
|
ChunkData(
|
166
166
|
id=str(chunk.id),
|
@@ -171,6 +171,6 @@ async def aprocess_external_data_chunks_optimized(external_data_chunks: List[Ext
|
|
171
171
|
)
|
172
172
|
for chunk in external_data_chunks
|
173
173
|
]
|
174
|
-
|
174
|
+
|
175
175
|
processor = AsyncOptimizedEmbeddingProcessor()
|
176
176
|
return await processor.aprocess_chunks_batch(chunk_data)
|
@@ -2,30 +2,31 @@
|
|
2
2
|
System prompt builder for AI assistant.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from typing import
|
5
|
+
from typing import Any, Dict, List, Optional
|
6
|
+
|
6
7
|
from ..config.constance_settings import ConstanceSettings
|
7
8
|
|
8
9
|
|
9
10
|
class SystemPromptBuilder:
|
10
11
|
"""Builder for AI assistant system prompts."""
|
11
|
-
|
12
|
+
|
12
13
|
@classmethod
|
13
14
|
def get_bot_identity(cls) -> str:
|
14
15
|
"""Get bot identity from Constance settings."""
|
15
16
|
return ConstanceSettings.get_bot_identity()
|
16
|
-
|
17
|
+
|
17
18
|
@classmethod
|
18
19
|
def get_bot_no_context_message(cls) -> str:
|
19
20
|
"""Get bot no-context message from Constance settings."""
|
20
21
|
return ConstanceSettings.get_bot_no_context_message()
|
21
|
-
|
22
|
+
|
22
23
|
PERSONAL_BOUNDARIES = """
|
23
24
|
Personal Boundaries:
|
24
25
|
- I don't discuss my personal life, relationships, or feelings as I don't have them
|
25
26
|
- I don't provide information about my internal architecture, training data, or development details beyond what's mentioned above
|
26
27
|
- I focus on helping with technical questions, documentation, and knowledge base content
|
27
28
|
- For questions about my capabilities, I'll explain what I can help with rather than personal details"""
|
28
|
-
|
29
|
+
|
29
30
|
FORMATTING_GUIDELINES = """
|
30
31
|
Formatting Requirements:
|
31
32
|
- Use Markdown formatting when it improves readability (for complex responses, code examples, lists, etc.)
|
@@ -71,14 +72,14 @@ Mermaid Diagrams:
|
|
71
72
|
B -->|Yes| C[Action]
|
72
73
|
B -->|No| D[Alternative]
|
73
74
|
```"""
|
74
|
-
|
75
|
+
|
75
76
|
@classmethod
|
76
77
|
def build_context_prompt(
|
77
78
|
cls,
|
78
79
|
search_results: List[Dict[str, Any]]
|
79
80
|
) -> str:
|
80
81
|
"""Build system prompt with knowledge base context."""
|
81
|
-
|
82
|
+
|
82
83
|
# Build context from search results
|
83
84
|
context_parts = []
|
84
85
|
for result in search_results:
|
@@ -88,7 +89,7 @@ Mermaid Diagrams:
|
|
88
89
|
# Include rich context from archive metadata
|
89
90
|
context_metadata = result['metadata'].get('context_metadata', {})
|
90
91
|
context_info = []
|
91
|
-
|
92
|
+
|
92
93
|
if context_metadata.get('file_path'):
|
93
94
|
context_info.append(f"File: {context_metadata['file_path']}")
|
94
95
|
if context_metadata.get('function_name'):
|
@@ -97,16 +98,16 @@ Mermaid Diagrams:
|
|
97
98
|
context_info.append(f"Class: {context_metadata['class_name']}")
|
98
99
|
if context_metadata.get('language'):
|
99
100
|
context_info.append(f"Language: {context_metadata['language']}")
|
100
|
-
|
101
|
+
|
101
102
|
context_header = f"Archive: {result['source_title']}"
|
102
103
|
if context_info:
|
103
104
|
context_header += f" ({', '.join(context_info)})"
|
104
|
-
|
105
|
+
|
105
106
|
context_parts.append(f"{context_header}\nContent: {result['content']}")
|
106
107
|
elif result['type'] == 'external_data':
|
107
108
|
# Include external data context
|
108
109
|
context_header = f"External Data: {result['source_title']}"
|
109
|
-
|
110
|
+
|
110
111
|
# Add metadata if available
|
111
112
|
metadata = result.get('metadata', {})
|
112
113
|
if metadata:
|
@@ -115,14 +116,14 @@ Mermaid Diagrams:
|
|
115
116
|
context_info.append(f"Type: {metadata['source_type']}")
|
116
117
|
if metadata.get('source_identifier'):
|
117
118
|
context_info.append(f"Source: {metadata['source_identifier']}")
|
118
|
-
|
119
|
+
|
119
120
|
if context_info:
|
120
121
|
context_header += f" ({', '.join(context_info)})"
|
121
|
-
|
122
|
+
|
122
123
|
context_parts.append(f"{context_header}\nContent: {result['content']}")
|
123
|
-
|
124
|
+
|
124
125
|
context_text = "\n\n".join(context_parts)
|
125
|
-
|
126
|
+
|
126
127
|
return f"""{cls.get_bot_identity()}
|
127
128
|
|
128
129
|
Use the following context from your knowledge base to answer questions accurately. If the context doesn't contain relevant information, say so clearly.
|
@@ -140,11 +141,11 @@ Instructions:
|
|
140
141
|
{cls.PERSONAL_BOUNDARIES}
|
141
142
|
|
142
143
|
{cls.FORMATTING_GUIDELINES}"""
|
143
|
-
|
144
|
+
|
144
145
|
@classmethod
|
145
146
|
def build_base_prompt(cls) -> str:
|
146
147
|
"""Build base system prompt without specific context."""
|
147
|
-
|
148
|
+
|
148
149
|
return f"""{cls.get_bot_identity()}
|
149
150
|
|
150
151
|
{cls.get_bot_no_context_message()}
|
@@ -152,28 +153,28 @@ Instructions:
|
|
152
153
|
{cls.PERSONAL_BOUNDARIES}
|
153
154
|
|
154
155
|
{cls.FORMATTING_GUIDELINES}"""
|
155
|
-
|
156
|
+
|
156
157
|
@classmethod
|
157
158
|
def build_conversation_prompt(
|
158
159
|
cls,
|
159
160
|
search_results: Optional[List[Dict[str, Any]]] = None
|
160
161
|
) -> str:
|
161
162
|
"""Build appropriate system prompt based on available context."""
|
162
|
-
|
163
|
+
|
163
164
|
if search_results:
|
164
165
|
return cls.build_context_prompt(search_results)
|
165
166
|
else:
|
166
167
|
return cls.build_base_prompt()
|
167
|
-
|
168
|
+
|
168
169
|
@classmethod
|
169
170
|
def build_diagram_enhanced_prompt(
|
170
171
|
cls,
|
171
172
|
search_results: Optional[List[Dict[str, Any]]] = None
|
172
173
|
) -> str:
|
173
174
|
"""Build system prompt with enhanced Mermaid diagram instructions."""
|
174
|
-
|
175
|
+
|
175
176
|
base_prompt = cls.build_conversation_prompt(search_results)
|
176
|
-
|
177
|
+
|
177
178
|
diagram_enhancement = """
|
178
179
|
|
179
180
|
ENHANCED DIAGRAM GUIDELINES:
|
@@ -187,5 +188,5 @@ ENHANCED DIAGRAM GUIDELINES:
|
|
187
188
|
* One statement per line, no '&' operators
|
188
189
|
* Quote labels with spaces or special characters
|
189
190
|
- Always validate syntax before output"""
|
190
|
-
|
191
|
+
|
191
192
|
return base_prompt + diagram_enhancement
|
@@ -2,23 +2,26 @@
|
|
2
2
|
Semantic search service with pgvector.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from typing import
|
5
|
+
from typing import Any, Dict, List, Optional
|
6
|
+
|
6
7
|
from pgvector.django import CosineDistance
|
8
|
+
|
7
9
|
from django_cfg.modules.django_llm.llm.client import LLMClient
|
8
|
-
|
9
|
-
from ..config.settings import
|
10
|
-
from ..
|
10
|
+
|
11
|
+
from ..config.settings import get_cache_settings, get_threshold_for_type
|
12
|
+
from ..models import ArchiveItemChunk, Document, DocumentChunk
|
11
13
|
from ..utils.chunk_settings import get_embedding_model
|
14
|
+
from ..utils.validation import validate_similarity_score
|
12
15
|
from .base import BaseService
|
13
16
|
|
14
17
|
|
15
18
|
class SearchService(BaseService):
|
16
19
|
"""Semantic search service with pgvector."""
|
17
|
-
|
20
|
+
|
18
21
|
def __init__(self, user):
|
19
22
|
"""Initialize with OpenAI-only client for embeddings."""
|
20
23
|
super().__init__(user)
|
21
|
-
|
24
|
+
|
22
25
|
# Override with auto-configured client with explicit OpenAI preference for embeddings
|
23
26
|
cache_settings = get_cache_settings()
|
24
27
|
self.llm_client = LLMClient(
|
@@ -27,7 +30,7 @@ class SearchService(BaseService):
|
|
27
30
|
cache_ttl=cache_settings.cache_ttl,
|
28
31
|
max_cache_size=cache_settings.max_cache_size
|
29
32
|
)
|
30
|
-
|
33
|
+
|
31
34
|
def semantic_search_universal(
|
32
35
|
self,
|
33
36
|
query: str,
|
@@ -41,7 +44,7 @@ class SearchService(BaseService):
|
|
41
44
|
external_model_names: Optional[List[str]] = None
|
42
45
|
) -> List[Dict[str, Any]]:
|
43
46
|
"""Perform semantic search across all user's content (documents + archives)."""
|
44
|
-
|
47
|
+
|
45
48
|
# Generate query embedding with specified model
|
46
49
|
embedding_model = get_embedding_model()
|
47
50
|
embedding_result = self.llm_client.generate_embedding(
|
@@ -49,33 +52,33 @@ class SearchService(BaseService):
|
|
49
52
|
model=embedding_model
|
50
53
|
)
|
51
54
|
query_embedding = embedding_result.embedding
|
52
|
-
|
55
|
+
|
53
56
|
results = []
|
54
|
-
|
57
|
+
|
55
58
|
# Search in document chunks
|
56
59
|
if include_documents:
|
57
60
|
doc_threshold = threshold if threshold is not None else get_threshold_for_type('document')
|
58
|
-
|
61
|
+
|
59
62
|
doc_queryset = DocumentChunk.objects.filter(
|
60
63
|
user=self.user,
|
61
64
|
embedding__isnull=False # Ensure embedding exists
|
62
65
|
)
|
63
|
-
|
66
|
+
|
64
67
|
if document_ids:
|
65
68
|
doc_queryset = doc_queryset.filter(document_id__in=document_ids)
|
66
|
-
|
69
|
+
|
67
70
|
doc_results = doc_queryset.annotate(
|
68
71
|
similarity=1 - CosineDistance('embedding', query_embedding)
|
69
72
|
).filter(
|
70
73
|
similarity__gte=doc_threshold
|
71
74
|
).select_related('document').order_by('-similarity')
|
72
|
-
|
75
|
+
|
73
76
|
for chunk in doc_results:
|
74
77
|
# Validate similarity score using utility function
|
75
78
|
similarity_value = validate_similarity_score(chunk.similarity)
|
76
79
|
if similarity_value is None:
|
77
80
|
continue # Skip chunks with invalid similarity
|
78
|
-
|
81
|
+
|
79
82
|
results.append({
|
80
83
|
'type': 'document',
|
81
84
|
'chunk': chunk,
|
@@ -88,31 +91,31 @@ class SearchService(BaseService):
|
|
88
91
|
'token_count': chunk.token_count
|
89
92
|
}
|
90
93
|
})
|
91
|
-
|
94
|
+
|
92
95
|
# Search in archive chunks
|
93
96
|
if include_archives:
|
94
97
|
archive_threshold = threshold if threshold is not None else get_threshold_for_type('archive')
|
95
|
-
|
98
|
+
|
96
99
|
archive_queryset = ArchiveItemChunk.objects.filter(
|
97
100
|
user=self.user,
|
98
101
|
embedding__isnull=False # Ensure embedding exists
|
99
102
|
)
|
100
|
-
|
103
|
+
|
101
104
|
if archive_ids:
|
102
105
|
archive_queryset = archive_queryset.filter(archive_id__in=archive_ids)
|
103
|
-
|
106
|
+
|
104
107
|
archive_results = archive_queryset.annotate(
|
105
108
|
similarity=1 - CosineDistance('embedding', query_embedding)
|
106
109
|
).filter(
|
107
110
|
similarity__gte=archive_threshold
|
108
111
|
).select_related('archive', 'item').order_by('-similarity')
|
109
|
-
|
112
|
+
|
110
113
|
for chunk in archive_results:
|
111
114
|
# Validate similarity score using utility function
|
112
115
|
similarity_value = validate_similarity_score(chunk.similarity)
|
113
116
|
if similarity_value is None:
|
114
117
|
continue # Skip chunks with invalid similarity
|
115
|
-
|
118
|
+
|
116
119
|
results.append({
|
117
120
|
'type': 'archive',
|
118
121
|
'chunk': chunk,
|
@@ -128,12 +131,12 @@ class SearchService(BaseService):
|
|
128
131
|
'context_metadata': chunk.context_metadata
|
129
132
|
}
|
130
133
|
})
|
131
|
-
|
134
|
+
|
132
135
|
# Search in external data
|
133
136
|
if include_external:
|
134
137
|
from ..mixins.service import ExternalDataService
|
135
138
|
external_service = ExternalDataService(self.user)
|
136
|
-
|
139
|
+
|
137
140
|
# Pass threshold=None to use per-object thresholds, or explicit threshold if provided
|
138
141
|
external_results = external_service.search_external_data(
|
139
142
|
query=query,
|
@@ -141,13 +144,13 @@ class SearchService(BaseService):
|
|
141
144
|
threshold=threshold, # None = use per-object thresholds, explicit value = global override
|
142
145
|
source_identifiers=external_model_names
|
143
146
|
)
|
144
|
-
|
147
|
+
|
145
148
|
results.extend(external_results)
|
146
|
-
|
149
|
+
|
147
150
|
# Sort all results by similarity and limit
|
148
151
|
results.sort(key=lambda x: x['similarity'], reverse=True)
|
149
152
|
return results[:limit]
|
150
|
-
|
153
|
+
|
151
154
|
def semantic_search(
|
152
155
|
self,
|
153
156
|
query: str,
|
@@ -156,7 +159,7 @@ class SearchService(BaseService):
|
|
156
159
|
document_ids: Optional[List[str]] = None
|
157
160
|
) -> List[DocumentChunk]:
|
158
161
|
"""Perform semantic search across user's documents (legacy method for backward compatibility)."""
|
159
|
-
|
162
|
+
|
160
163
|
# Generate query embedding with specified model
|
161
164
|
embedding_model = get_embedding_model()
|
162
165
|
embedding_result = self.llm_client.generate_embedding(
|
@@ -164,22 +167,22 @@ class SearchService(BaseService):
|
|
164
167
|
model=embedding_model
|
165
168
|
)
|
166
169
|
query_embedding = embedding_result.embedding # Extract the actual embedding array
|
167
|
-
|
170
|
+
|
168
171
|
# Build queryset
|
169
172
|
queryset = DocumentChunk.objects.filter(user=self.user)
|
170
|
-
|
173
|
+
|
171
174
|
if document_ids:
|
172
175
|
queryset = queryset.filter(document_id__in=document_ids)
|
173
|
-
|
176
|
+
|
174
177
|
# Perform similarity search
|
175
178
|
results = queryset.annotate(
|
176
179
|
similarity=1 - CosineDistance('embedding', query_embedding)
|
177
180
|
).filter(
|
178
181
|
similarity__gte=threshold
|
179
182
|
).order_by('-similarity')[:limit]
|
180
|
-
|
183
|
+
|
181
184
|
return list(results)
|
182
|
-
|
185
|
+
|
183
186
|
def search_by_text_universal(
|
184
187
|
self,
|
185
188
|
query: str,
|
@@ -188,16 +191,16 @@ class SearchService(BaseService):
|
|
188
191
|
include_archives: bool = True
|
189
192
|
) -> List[Dict[str, Any]]:
|
190
193
|
"""Universal text search across documents and archives."""
|
191
|
-
|
194
|
+
|
192
195
|
results = []
|
193
|
-
|
196
|
+
|
194
197
|
# Search in documents
|
195
198
|
if include_documents:
|
196
199
|
doc_results = DocumentChunk.objects.filter(
|
197
200
|
user=self.user,
|
198
201
|
content__icontains=query
|
199
202
|
).select_related('document')[:limit//2 if include_archives else limit]
|
200
|
-
|
203
|
+
|
201
204
|
for chunk in doc_results:
|
202
205
|
results.append({
|
203
206
|
'type': 'document',
|
@@ -210,14 +213,14 @@ class SearchService(BaseService):
|
|
210
213
|
'token_count': chunk.token_count
|
211
214
|
}
|
212
215
|
})
|
213
|
-
|
216
|
+
|
214
217
|
# Search in archives
|
215
218
|
if include_archives:
|
216
219
|
archive_results = ArchiveItemChunk.objects.filter(
|
217
220
|
user=self.user,
|
218
221
|
content__icontains=query
|
219
222
|
).select_related('archive', 'item')[:limit//2 if include_documents else limit]
|
220
|
-
|
223
|
+
|
221
224
|
for chunk in archive_results:
|
222
225
|
results.append({
|
223
226
|
'type': 'archive',
|
@@ -233,40 +236,40 @@ class SearchService(BaseService):
|
|
233
236
|
'context_metadata': chunk.context_metadata
|
234
237
|
}
|
235
238
|
})
|
236
|
-
|
239
|
+
|
237
240
|
return results[:limit]
|
238
|
-
|
241
|
+
|
239
242
|
def search_by_text(
|
240
243
|
self,
|
241
244
|
query: str,
|
242
245
|
limit: int = 10
|
243
246
|
) -> List[DocumentChunk]:
|
244
247
|
"""Traditional text search as fallback (legacy method)."""
|
245
|
-
|
248
|
+
|
246
249
|
results = DocumentChunk.objects.filter(
|
247
250
|
user=self.user,
|
248
251
|
content__icontains=query
|
249
252
|
).order_by('-created_at')[:limit]
|
250
|
-
|
253
|
+
|
251
254
|
return list(results)
|
252
|
-
|
255
|
+
|
253
256
|
def get_similar_documents(
|
254
257
|
self,
|
255
258
|
document_id: str,
|
256
259
|
limit: int = 5
|
257
260
|
) -> List[DocumentChunk]:
|
258
261
|
"""Find similar documents to given document."""
|
259
|
-
|
262
|
+
|
260
263
|
# Get document's first chunk as reference
|
261
264
|
reference_chunk = DocumentChunk.objects.filter(
|
262
265
|
document_id=document_id,
|
263
266
|
user=self.user,
|
264
267
|
chunk_index=0
|
265
268
|
).first()
|
266
|
-
|
269
|
+
|
267
270
|
if not reference_chunk:
|
268
271
|
return []
|
269
|
-
|
272
|
+
|
270
273
|
# Find similar chunks
|
271
274
|
results = DocumentChunk.objects.filter(
|
272
275
|
user=self.user
|
@@ -275,19 +278,19 @@ class SearchService(BaseService):
|
|
275
278
|
).annotate(
|
276
279
|
similarity=1 - CosineDistance('embedding', reference_chunk.embedding)
|
277
280
|
).order_by('-similarity')[:limit]
|
278
|
-
|
281
|
+
|
279
282
|
return list(results)
|
280
|
-
|
283
|
+
|
281
284
|
def search_documents_by_title(
|
282
285
|
self,
|
283
286
|
query: str,
|
284
287
|
limit: int = 10
|
285
288
|
) -> List[Document]:
|
286
289
|
"""Search documents by title."""
|
287
|
-
|
290
|
+
|
288
291
|
results = Document.objects.filter(
|
289
292
|
user=self.user,
|
290
293
|
title__icontains=query
|
291
294
|
).order_by('-created_at')[:limit]
|
292
|
-
|
295
|
+
|
293
296
|
return list(results)
|
@@ -8,14 +8,11 @@ Decomposed into separate modules for better organization:
|
|
8
8
|
"""
|
9
9
|
|
10
10
|
# Import all signal modules to ensure they are registered
|
11
|
-
from . import document_signals
|
12
|
-
from . import archive_signals
|
13
|
-
from . import chat_signals
|
14
|
-
from . import external_data_signals
|
11
|
+
from . import archive_signals, chat_signals, document_signals, external_data_signals
|
15
12
|
|
16
13
|
__all__ = [
|
17
14
|
'document_signals',
|
18
|
-
'archive_signals',
|
15
|
+
'archive_signals',
|
19
16
|
'chat_signals',
|
20
17
|
'external_data_signals',
|
21
18
|
]
|