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
@@ -3,10 +3,10 @@ Document and DocumentChunk managers.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import logging
|
6
|
-
from typing import List
|
7
|
-
|
8
|
-
from django.db.models import Count, Q
|
6
|
+
from typing import List
|
7
|
+
|
9
8
|
from django.contrib.auth import get_user_model
|
9
|
+
from django.db import models
|
10
10
|
|
11
11
|
logger = logging.getLogger(__name__)
|
12
12
|
User = get_user_model()
|
@@ -14,54 +14,54 @@ User = get_user_model()
|
|
14
14
|
|
15
15
|
class DocumentManager(models.Manager):
|
16
16
|
"""Custom manager for Document model."""
|
17
|
-
|
17
|
+
|
18
18
|
def for_user(self, user):
|
19
19
|
"""Explicitly filter by specific user."""
|
20
20
|
return self.get_queryset().filter(user=user)
|
21
|
-
|
21
|
+
|
22
22
|
def all_users(self):
|
23
23
|
"""Get unfiltered queryset (admin use)."""
|
24
24
|
return self.get_queryset()
|
25
|
-
|
25
|
+
|
26
26
|
def processed(self):
|
27
27
|
"""Get only processed documents."""
|
28
28
|
from ..models.base import ProcessingStatus
|
29
29
|
return self.get_queryset().filter(
|
30
30
|
processing_status=ProcessingStatus.COMPLETED
|
31
31
|
)
|
32
|
-
|
32
|
+
|
33
33
|
def pending_processing(self):
|
34
34
|
"""Get documents pending processing."""
|
35
35
|
from ..models.base import ProcessingStatus
|
36
36
|
return self.get_queryset().filter(
|
37
37
|
processing_status=ProcessingStatus.PENDING
|
38
38
|
)
|
39
|
-
|
39
|
+
|
40
40
|
def by_content_hash(self, content_hash: str):
|
41
41
|
"""Find documents by content hash."""
|
42
42
|
return self.get_queryset().filter(content_hash=content_hash)
|
43
|
-
|
43
|
+
|
44
44
|
def with_stats(self):
|
45
45
|
"""Get documents with chunk statistics."""
|
46
46
|
return self.get_queryset().select_related().prefetch_related('chunks')
|
47
|
-
|
47
|
+
|
48
48
|
def get_vectorization_progress(self, document_id):
|
49
49
|
"""Get vectorization progress for a document."""
|
50
50
|
try:
|
51
51
|
from ..models.document import DocumentChunk
|
52
|
-
|
52
|
+
|
53
53
|
# Get all chunks for this document
|
54
54
|
chunks_qs = DocumentChunk.objects.filter(document_id=document_id)
|
55
|
-
|
55
|
+
|
56
56
|
total = chunks_qs.count()
|
57
|
-
|
57
|
+
|
58
58
|
# Count vectorized chunks by checking if embedding has non-zero values
|
59
59
|
vectorized = 0
|
60
60
|
if total > 0:
|
61
61
|
for chunk in chunks_qs.only('embedding'):
|
62
62
|
if chunk.embedding is not None and len(chunk.embedding) > 0 and any(x != 0.0 for x in chunk.embedding):
|
63
63
|
vectorized += 1
|
64
|
-
|
64
|
+
|
65
65
|
return {
|
66
66
|
'total': total,
|
67
67
|
'vectorized': vectorized,
|
@@ -74,25 +74,25 @@ class DocumentManager(models.Manager):
|
|
74
74
|
'vectorized': 0,
|
75
75
|
'percentage': 0
|
76
76
|
}
|
77
|
-
|
77
|
+
|
78
78
|
def get_vectorization_status_display(self, document):
|
79
79
|
"""Get vectorization status display for admin."""
|
80
80
|
try:
|
81
81
|
# Check processing status first
|
82
82
|
from ..models.document import ProcessingStatus
|
83
|
-
|
83
|
+
|
84
84
|
if document.processing_status == ProcessingStatus.PENDING:
|
85
85
|
return 'no_chunks', 'Pending'
|
86
86
|
elif document.processing_status == ProcessingStatus.PROCESSING:
|
87
87
|
return 'partial', 'Processing...'
|
88
88
|
elif document.processing_status == ProcessingStatus.FAILED:
|
89
89
|
return 'none', 'Failed'
|
90
|
-
|
90
|
+
|
91
91
|
progress = self.get_vectorization_progress(document.id)
|
92
92
|
total = progress['total']
|
93
93
|
vectorized = progress['vectorized']
|
94
94
|
percentage = progress['percentage']
|
95
|
-
|
95
|
+
|
96
96
|
if total == 0:
|
97
97
|
return 'no_chunks', 'No chunks'
|
98
98
|
elif percentage == 100:
|
@@ -103,71 +103,71 @@ class DocumentManager(models.Manager):
|
|
103
103
|
return 'none', f'{vectorized}/{total} (0%)'
|
104
104
|
except Exception as e:
|
105
105
|
logger.error(f"Error getting vectorization status for document {document.id}: {e}")
|
106
|
-
|
106
|
+
|
107
107
|
# Try to provide more specific error information
|
108
108
|
if document.processing_status == ProcessingStatus.COMPLETED and document.chunks_count > 0:
|
109
109
|
return 'none', f'Error ({document.chunks_count} chunks)'
|
110
110
|
else:
|
111
111
|
return 'no_chunks', 'Error'
|
112
|
-
|
112
|
+
|
113
113
|
def find_duplicates(self, document):
|
114
114
|
"""Find duplicate documents with same content hash."""
|
115
115
|
if not document.content_hash:
|
116
116
|
return self.none()
|
117
|
-
|
117
|
+
|
118
118
|
return self.get_queryset().filter(
|
119
119
|
user=document.user,
|
120
120
|
content_hash=document.content_hash
|
121
121
|
).exclude(pk=document.pk)
|
122
|
-
|
122
|
+
|
123
123
|
def get_duplicate_info(self, document):
|
124
124
|
"""Get duplicate information for admin display."""
|
125
125
|
if not document.content_hash:
|
126
126
|
return "No content hash"
|
127
|
-
|
127
|
+
|
128
128
|
duplicates = self.find_duplicates(document)
|
129
|
-
|
129
|
+
|
130
130
|
if not duplicates.exists():
|
131
131
|
return "✅ No duplicates found"
|
132
|
-
|
132
|
+
|
133
133
|
return {
|
134
134
|
'count': duplicates.count(),
|
135
135
|
'duplicates': list(duplicates[:3]) # Return first 3 for display
|
136
136
|
}
|
137
|
-
|
137
|
+
|
138
138
|
def check_duplicate_before_save(self, user, content, exclude_id=None):
|
139
139
|
"""Check for duplicate content before saving. Returns (is_duplicate, existing_doc)."""
|
140
140
|
if not content:
|
141
141
|
return False, None
|
142
|
-
|
142
|
+
|
143
143
|
import hashlib
|
144
144
|
content_hash = hashlib.sha256(content.encode()).hexdigest()
|
145
|
-
|
145
|
+
|
146
146
|
# Use all_users() to bypass user filtering
|
147
147
|
query = self.all_users().filter(user=user, content_hash=content_hash)
|
148
|
-
|
148
|
+
|
149
149
|
if exclude_id:
|
150
150
|
query = query.exclude(pk=exclude_id)
|
151
|
-
|
151
|
+
|
152
152
|
existing_doc = query.first()
|
153
153
|
return existing_doc is not None, existing_doc
|
154
154
|
|
155
155
|
|
156
156
|
class DocumentChunkManager(models.Manager):
|
157
157
|
"""Custom manager for DocumentChunk model."""
|
158
|
-
|
158
|
+
|
159
159
|
def for_user(self, user):
|
160
160
|
"""Explicitly filter by specific user."""
|
161
161
|
return self.get_queryset().filter(user=user)
|
162
|
-
|
162
|
+
|
163
163
|
def all_users(self):
|
164
164
|
"""Get unfiltered queryset (admin use)."""
|
165
165
|
return self.get_queryset()
|
166
|
-
|
166
|
+
|
167
167
|
def for_document(self, document_id: str):
|
168
168
|
"""Get chunks for specific document."""
|
169
169
|
return self.get_queryset().filter(document_id=document_id)
|
170
|
-
|
170
|
+
|
171
171
|
def semantic_search(
|
172
172
|
self,
|
173
173
|
query_embedding: List[float],
|
@@ -176,26 +176,26 @@ class DocumentChunkManager(models.Manager):
|
|
176
176
|
):
|
177
177
|
"""Perform semantic search."""
|
178
178
|
from pgvector.django import CosineDistance
|
179
|
-
|
179
|
+
|
180
180
|
return self.get_queryset().annotate(
|
181
181
|
similarity=1 - CosineDistance('embedding', query_embedding)
|
182
182
|
).filter(
|
183
183
|
similarity__gte=similarity_threshold
|
184
184
|
).order_by('-similarity')[:limit]
|
185
|
-
|
185
|
+
|
186
186
|
def with_document_info(self):
|
187
187
|
"""Get chunks with document information."""
|
188
188
|
return self.get_queryset().select_related('document')
|
189
|
-
|
189
|
+
|
190
190
|
def vectorized(self):
|
191
191
|
"""Get only vectorized chunks (with non-zero embeddings)."""
|
192
192
|
# This is a simplified check - in practice you might want to check for non-zero vectors
|
193
193
|
return self.get_queryset().exclude(embedding__isnull=True)
|
194
|
-
|
194
|
+
|
195
195
|
def by_user_and_similarity(self, user, query_embedding: List[float], limit: int = 10):
|
196
196
|
"""Get chunks for specific user with similarity search."""
|
197
197
|
from pgvector.django import CosineDistance
|
198
|
-
|
198
|
+
|
199
199
|
return self.get_queryset().filter(
|
200
200
|
user=user
|
201
201
|
).annotate(
|
@@ -2,53 +2,54 @@
|
|
2
2
|
External Data managers for advanced querying and operations.
|
3
3
|
"""
|
4
4
|
|
5
|
+
from datetime import timedelta
|
6
|
+
from typing import Any, Dict, List, Optional
|
7
|
+
|
5
8
|
from django.db import models
|
6
|
-
from django.db.models import Count, Q,
|
9
|
+
from django.db.models import Avg, Count, Q, Sum
|
7
10
|
from django.utils import timezone
|
8
|
-
from typing import Optional, List, Dict, Any
|
9
|
-
from datetime import timedelta
|
10
11
|
|
11
12
|
from .base import BaseKnowbaseManager
|
12
13
|
|
13
14
|
|
14
15
|
class ExternalDataQuerySet(models.QuerySet):
|
15
16
|
"""Custom QuerySet for ExternalData with advanced filtering."""
|
16
|
-
|
17
|
+
|
17
18
|
def active(self):
|
18
19
|
"""Filter to active external data sources."""
|
19
20
|
return self.filter(is_active=True)
|
20
|
-
|
21
|
+
|
21
22
|
def public(self):
|
22
23
|
"""Filter to public external data sources."""
|
23
24
|
return self.filter(is_public=True)
|
24
|
-
|
25
|
+
|
25
26
|
def processed(self):
|
26
27
|
"""Filter to successfully processed external data."""
|
27
28
|
return self.filter(status='completed')
|
28
|
-
|
29
|
+
|
29
30
|
def failed(self):
|
30
31
|
"""Filter to failed external data."""
|
31
32
|
return self.filter(status='failed')
|
32
|
-
|
33
|
+
|
33
34
|
def outdated(self):
|
34
35
|
"""Filter to outdated external data that needs reprocessing."""
|
35
36
|
return self.filter(
|
36
37
|
Q(status='outdated') |
|
37
38
|
Q(source_updated_at__gt=models.F('processed_at'))
|
38
39
|
)
|
39
|
-
|
40
|
+
|
40
41
|
def by_source_type(self, source_type: str):
|
41
42
|
"""Filter by source type."""
|
42
43
|
return self.filter(source_type=source_type)
|
43
|
-
|
44
|
+
|
44
45
|
def by_status(self, status: str):
|
45
46
|
"""Filter by status."""
|
46
47
|
return self.filter(status=status)
|
47
|
-
|
48
|
+
|
48
49
|
def get_processing_statistics(self):
|
49
50
|
"""Get processing statistics for external data."""
|
50
51
|
from django.db.models import Count, Q
|
51
|
-
|
52
|
+
|
52
53
|
stats = self.aggregate(
|
53
54
|
total=Count('id'),
|
54
55
|
pending=Count('id', filter=Q(status='pending')),
|
@@ -56,7 +57,7 @@ class ExternalDataQuerySet(models.QuerySet):
|
|
56
57
|
completed=Count('id', filter=Q(status='completed')),
|
57
58
|
failed=Count('id', filter=Q(status='failed')),
|
58
59
|
)
|
59
|
-
|
60
|
+
|
60
61
|
return {
|
61
62
|
'total_external_data': stats['total'],
|
62
63
|
'pending_processing': stats['pending'],
|
@@ -64,21 +65,21 @@ class ExternalDataQuerySet(models.QuerySet):
|
|
64
65
|
'completed_processing': stats['completed'],
|
65
66
|
'failed_processing': stats['failed'],
|
66
67
|
}
|
67
|
-
|
68
|
+
|
68
69
|
def by_category(self, category):
|
69
70
|
"""Filter by category."""
|
70
71
|
return self.filter(category=category)
|
71
|
-
|
72
|
+
|
72
73
|
def with_tags(self, tags: List[str]):
|
73
74
|
"""Filter external data that contains any of the specified tags."""
|
74
75
|
if not tags:
|
75
76
|
return self
|
76
|
-
|
77
|
+
|
77
78
|
q = Q()
|
78
79
|
for tag in tags:
|
79
80
|
q |= Q(tags__contains=[tag])
|
80
81
|
return self.filter(q)
|
81
|
-
|
82
|
+
|
82
83
|
def search_content(self, query: str):
|
83
84
|
"""Search in title, description, and content."""
|
84
85
|
return self.filter(
|
@@ -86,24 +87,24 @@ class ExternalDataQuerySet(models.QuerySet):
|
|
86
87
|
Q(description__icontains=query) |
|
87
88
|
Q(content__icontains=query)
|
88
89
|
)
|
89
|
-
|
90
|
+
|
90
91
|
def recent(self, days: int = 7):
|
91
92
|
"""Filter to recently processed external data."""
|
92
93
|
cutoff = timezone.now() - timedelta(days=days)
|
93
94
|
return self.filter(processed_at__gte=cutoff)
|
94
|
-
|
95
|
+
|
95
96
|
def with_chunks(self):
|
96
97
|
"""Filter to external data that has chunks."""
|
97
98
|
return self.filter(total_chunks__gt=0)
|
98
|
-
|
99
|
+
|
99
100
|
def without_chunks(self):
|
100
101
|
"""Filter to external data without chunks."""
|
101
102
|
return self.filter(total_chunks=0)
|
102
|
-
|
103
|
+
|
103
104
|
def expensive(self, min_cost: float = 0.01):
|
104
105
|
"""Filter to external data with high processing costs."""
|
105
106
|
return self.filter(processing_cost__gte=min_cost)
|
106
|
-
|
107
|
+
|
107
108
|
def with_statistics(self):
|
108
109
|
"""Annotate with chunk and cost statistics."""
|
109
110
|
return self.annotate(
|
@@ -115,70 +116,70 @@ class ExternalDataQuerySet(models.QuerySet):
|
|
115
116
|
|
116
117
|
class ExternalDataManager(BaseKnowbaseManager):
|
117
118
|
"""Manager for ExternalData with user scoping and advanced queries."""
|
118
|
-
|
119
|
+
|
119
120
|
def get_queryset(self):
|
120
121
|
return ExternalDataQuerySet(self.model, using=self._db)
|
121
|
-
|
122
|
+
|
122
123
|
def active(self):
|
123
124
|
"""Get active external data sources."""
|
124
125
|
return self.get_queryset().active()
|
125
|
-
|
126
|
+
|
126
127
|
def public(self):
|
127
128
|
"""Get public external data sources."""
|
128
129
|
return self.get_queryset().public()
|
129
|
-
|
130
|
+
|
130
131
|
def processed(self):
|
131
132
|
"""Get successfully processed external data."""
|
132
133
|
return self.get_queryset().processed()
|
133
|
-
|
134
|
+
|
134
135
|
def failed(self):
|
135
136
|
"""Get failed external data."""
|
136
137
|
return self.get_queryset().failed()
|
137
|
-
|
138
|
+
|
138
139
|
def outdated(self):
|
139
140
|
"""Get outdated external data that needs reprocessing."""
|
140
141
|
return self.get_queryset().outdated()
|
141
|
-
|
142
|
+
|
142
143
|
def by_source_type(self, source_type: str):
|
143
144
|
"""Get external data by source type."""
|
144
145
|
return self.get_queryset().by_source_type(source_type)
|
145
|
-
|
146
|
+
|
146
147
|
def by_status(self, status: str):
|
147
148
|
"""Get external data by status."""
|
148
149
|
return self.get_queryset().by_status(status)
|
149
|
-
|
150
|
+
|
150
151
|
def by_category(self, category):
|
151
152
|
"""Get external data by category."""
|
152
153
|
return self.get_queryset().by_category(category)
|
153
|
-
|
154
|
+
|
154
155
|
def with_tags(self, tags: List[str]):
|
155
156
|
"""Get external data with specified tags."""
|
156
157
|
return self.get_queryset().with_tags(tags)
|
157
|
-
|
158
|
+
|
158
159
|
def search_content(self, query: str):
|
159
160
|
"""Search external data content."""
|
160
161
|
return self.get_queryset().search_content(query)
|
161
|
-
|
162
|
+
|
162
163
|
def recent(self, days: int = 7):
|
163
164
|
"""Get recently processed external data."""
|
164
165
|
return self.get_queryset().recent(days)
|
165
|
-
|
166
|
+
|
166
167
|
def with_chunks(self):
|
167
168
|
"""Get external data that has chunks."""
|
168
169
|
return self.get_queryset().with_chunks()
|
169
|
-
|
170
|
+
|
170
171
|
def without_chunks(self):
|
171
172
|
"""Get external data without chunks."""
|
172
173
|
return self.get_queryset().without_chunks()
|
173
|
-
|
174
|
+
|
174
175
|
def expensive(self, min_cost: float = 0.01):
|
175
176
|
"""Get external data with high processing costs."""
|
176
177
|
return self.get_queryset().expensive(min_cost)
|
177
|
-
|
178
|
+
|
178
179
|
def with_statistics(self):
|
179
180
|
"""Get external data with statistics."""
|
180
181
|
return self.get_queryset().with_statistics()
|
181
|
-
|
182
|
+
|
182
183
|
def create_from_source(
|
183
184
|
self,
|
184
185
|
user,
|
@@ -216,7 +217,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
216
217
|
metadata=metadata or {},
|
217
218
|
**kwargs
|
218
219
|
)
|
219
|
-
|
220
|
+
|
220
221
|
def get_or_create_from_source(
|
221
222
|
self,
|
222
223
|
user,
|
@@ -239,7 +240,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
239
240
|
source_identifier=source_identifier,
|
240
241
|
defaults=defaults or {}
|
241
242
|
)
|
242
|
-
|
243
|
+
|
243
244
|
def bulk_update_status(self, external_data_ids: List[str], status: str):
|
244
245
|
"""
|
245
246
|
Bulk update status for multiple external data sources.
|
@@ -255,7 +256,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
255
256
|
status=status,
|
256
257
|
updated_at=timezone.now()
|
257
258
|
)
|
258
|
-
|
259
|
+
|
259
260
|
def get_processing_statistics(self, user=None) -> Dict[str, Any]:
|
260
261
|
"""
|
261
262
|
Get processing statistics for external data.
|
@@ -269,7 +270,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
269
270
|
queryset = self.get_queryset()
|
270
271
|
if user:
|
271
272
|
queryset = queryset.filter(user=user)
|
272
|
-
|
273
|
+
|
273
274
|
stats = queryset.aggregate(
|
274
275
|
total_count=Count('id'),
|
275
276
|
processed_count=Count('id', filter=Q(status='completed')),
|
@@ -281,7 +282,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
281
282
|
total_cost=Sum('processing_cost'),
|
282
283
|
avg_chunk_size=Avg('chunk_size'),
|
283
284
|
)
|
284
|
-
|
285
|
+
|
285
286
|
# Calculate percentages
|
286
287
|
total = stats['total_count'] or 0
|
287
288
|
if total > 0:
|
@@ -294,9 +295,9 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
294
295
|
stats['failed_percentage'] = 0
|
295
296
|
stats['pending_percentage'] = 0
|
296
297
|
stats['outdated_percentage'] = 0
|
297
|
-
|
298
|
+
|
298
299
|
return stats
|
299
|
-
|
300
|
+
|
300
301
|
def cleanup_failed(self, older_than_days: int = 7) -> int:
|
301
302
|
"""
|
302
303
|
Clean up old failed external data sources.
|
@@ -312,7 +313,7 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
312
313
|
count = failed_queryset.count()
|
313
314
|
failed_queryset.delete()
|
314
315
|
return count
|
315
|
-
|
316
|
+
|
316
317
|
def regenerate_external_data(self, external_data_ids: List[str]) -> Dict[str, Any]:
|
317
318
|
"""
|
318
319
|
Regenerate embeddings for specified external data sources.
|
@@ -325,9 +326,9 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
325
326
|
"""
|
326
327
|
from ..models.external_data import ExternalDataStatus
|
327
328
|
from ..tasks.external_data_tasks import process_external_data_async
|
328
|
-
|
329
|
+
|
329
330
|
external_data_list = list(self.get_queryset().filter(id__in=external_data_ids))
|
330
|
-
|
331
|
+
|
331
332
|
if not external_data_list:
|
332
333
|
return {
|
333
334
|
'success': False,
|
@@ -335,11 +336,11 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
335
336
|
'regenerated_count': 0,
|
336
337
|
'failed_count': 0
|
337
338
|
}
|
338
|
-
|
339
|
+
|
339
340
|
regenerated_count = 0
|
340
341
|
failed_count = 0
|
341
342
|
errors = []
|
342
|
-
|
343
|
+
|
343
344
|
for external_data in external_data_list:
|
344
345
|
try:
|
345
346
|
# Reset processing state
|
@@ -353,22 +354,22 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
353
354
|
'status', 'processing_error', 'processed_at',
|
354
355
|
'total_chunks', 'total_tokens', 'processing_cost'
|
355
356
|
])
|
356
|
-
|
357
|
+
|
357
358
|
# Clear existing chunks
|
358
359
|
external_data.chunks.all().delete()
|
359
|
-
|
360
|
+
|
360
361
|
# Queue for reprocessing with force flag
|
361
362
|
process_external_data_async.send(
|
362
363
|
str(external_data.id),
|
363
364
|
force_reprocess=True
|
364
365
|
)
|
365
|
-
|
366
|
+
|
366
367
|
regenerated_count += 1
|
367
|
-
|
368
|
+
|
368
369
|
except Exception as e:
|
369
370
|
failed_count += 1
|
370
371
|
errors.append(f"Failed to regenerate {external_data.title}: {str(e)}")
|
371
|
-
|
372
|
+
|
372
373
|
return {
|
373
374
|
'success': regenerated_count > 0,
|
374
375
|
'regenerated_count': regenerated_count,
|
@@ -380,31 +381,31 @@ class ExternalDataManager(BaseKnowbaseManager):
|
|
380
381
|
|
381
382
|
class ExternalDataChunkQuerySet(models.QuerySet):
|
382
383
|
"""Custom QuerySet for ExternalDataChunk."""
|
383
|
-
|
384
|
+
|
384
385
|
def by_external_data(self, external_data):
|
385
386
|
"""Filter by external data."""
|
386
387
|
return self.filter(external_data=external_data)
|
387
|
-
|
388
|
+
|
388
389
|
def by_embedding_model(self, model: str):
|
389
390
|
"""Filter by embedding model."""
|
390
391
|
return self.filter(embedding_model=model)
|
391
|
-
|
392
|
+
|
392
393
|
def with_embeddings(self):
|
393
394
|
"""Filter to chunks that have embeddings."""
|
394
395
|
return self.filter(embedding__isnull=False)
|
395
|
-
|
396
|
+
|
396
397
|
def without_embeddings(self):
|
397
398
|
"""Filter to chunks without embeddings."""
|
398
399
|
return self.filter(embedding__isnull=True)
|
399
|
-
|
400
|
+
|
400
401
|
def large_chunks(self, min_tokens: int = 500):
|
401
402
|
"""Filter to large chunks."""
|
402
403
|
return self.filter(token_count__gte=min_tokens)
|
403
|
-
|
404
|
+
|
404
405
|
def small_chunks(self, max_tokens: int = 100):
|
405
406
|
"""Filter to small chunks."""
|
406
407
|
return self.filter(token_count__lte=max_tokens)
|
407
|
-
|
408
|
+
|
408
409
|
def expensive_chunks(self, min_cost: float = 0.001):
|
409
410
|
"""Filter to expensive chunks."""
|
410
411
|
return self.filter(embedding_cost__gte=min_cost)
|
@@ -412,38 +413,38 @@ class ExternalDataChunkQuerySet(models.QuerySet):
|
|
412
413
|
|
413
414
|
class ExternalDataChunkManager(models.Manager):
|
414
415
|
"""Manager for ExternalDataChunk."""
|
415
|
-
|
416
|
+
|
416
417
|
def get_queryset(self):
|
417
418
|
return ExternalDataChunkQuerySet(self.model, using=self._db)
|
418
|
-
|
419
|
+
|
419
420
|
def by_external_data(self, external_data):
|
420
421
|
"""Get chunks for external data."""
|
421
422
|
return self.get_queryset().by_external_data(external_data)
|
422
|
-
|
423
|
+
|
423
424
|
def by_embedding_model(self, model: str):
|
424
425
|
"""Get chunks by embedding model."""
|
425
426
|
return self.get_queryset().by_embedding_model(model)
|
426
|
-
|
427
|
+
|
427
428
|
def with_embeddings(self):
|
428
429
|
"""Get chunks with embeddings."""
|
429
430
|
return self.get_queryset().with_embeddings()
|
430
|
-
|
431
|
+
|
431
432
|
def without_embeddings(self):
|
432
433
|
"""Get chunks without embeddings."""
|
433
434
|
return self.get_queryset().without_embeddings()
|
434
|
-
|
435
|
+
|
435
436
|
def large_chunks(self, min_tokens: int = 500):
|
436
437
|
"""Get large chunks."""
|
437
438
|
return self.get_queryset().large_chunks(min_tokens)
|
438
|
-
|
439
|
+
|
439
440
|
def small_chunks(self, max_tokens: int = 100):
|
440
441
|
"""Get small chunks."""
|
441
442
|
return self.get_queryset().small_chunks(max_tokens)
|
442
|
-
|
443
|
+
|
443
444
|
def expensive_chunks(self, min_cost: float = 0.001):
|
444
445
|
"""Get expensive chunks."""
|
445
446
|
return self.get_queryset().expensive_chunks(min_cost)
|
446
|
-
|
447
|
+
|
447
448
|
def get_chunk_statistics(self, user=None) -> Dict[str, Any]:
|
448
449
|
"""
|
449
450
|
Get chunk statistics.
|
@@ -457,7 +458,7 @@ class ExternalDataChunkManager(models.Manager):
|
|
457
458
|
queryset = self.get_queryset()
|
458
459
|
if user:
|
459
460
|
queryset = queryset.filter(user=user)
|
460
|
-
|
461
|
+
|
461
462
|
return queryset.aggregate(
|
462
463
|
total_chunks=Count('id'),
|
463
464
|
total_tokens=Sum('token_count'),
|