django-cfg 1.4.21__py3-none-any.whl โ 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client โ apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client โ apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client โ apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard โ apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js โ apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard โ apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info โ django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client โ apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client โ apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info โ django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info โ django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info โ django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -2,12 +2,13 @@
|
|
2
2
|
Archive processing signals.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.db.models.signals import post_save, post_delete
|
6
|
-
from django.dispatch import receiver
|
7
|
-
from django.core.cache import cache
|
8
5
|
import logging
|
9
6
|
|
10
|
-
from
|
7
|
+
from django.core.cache import cache
|
8
|
+
from django.db.models.signals import post_delete, post_save
|
9
|
+
from django.dispatch import receiver
|
10
|
+
|
11
|
+
from ..models import ArchiveItem, ArchiveItemChunk, DocumentArchive
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
13
14
|
|
@@ -15,43 +16,43 @@ logger = logging.getLogger(__name__)
|
|
15
16
|
@receiver(post_save, sender=DocumentArchive)
|
16
17
|
def archive_post_save(sender, instance, created, **kwargs):
|
17
18
|
"""Handle archive creation and updates."""
|
18
|
-
|
19
|
+
|
19
20
|
# Clear user's archive cache on any archive change
|
20
21
|
cache_key = f"user_archives:{instance.user.id}"
|
21
22
|
cache.delete(cache_key)
|
22
|
-
|
23
|
+
|
23
24
|
if created and instance.archive_file:
|
24
25
|
# New archive with file - start processing
|
25
26
|
logger.info(f"๐ฆ New archive created: {instance.title} (ID: {instance.id})")
|
26
27
|
_start_archive_processing(instance)
|
27
|
-
|
28
|
+
|
28
29
|
elif not created:
|
29
30
|
# Archive update - check what changed
|
30
31
|
update_fields = kwargs.get('update_fields')
|
31
|
-
|
32
|
+
|
32
33
|
# Define fields that, if updated alone, should NOT trigger reprocessing
|
33
34
|
processing_fields = {
|
34
35
|
'processing_status', 'processed_at', 'processing_duration_ms',
|
35
36
|
'processing_error', 'total_items', 'processed_items', 'total_chunks',
|
36
37
|
'vectorized_chunks', 'total_tokens', 'total_cost_usd'
|
37
38
|
}
|
38
|
-
|
39
|
+
|
39
40
|
# If specific fields were updated, check if they are only processing-related
|
40
41
|
if update_fields is not None:
|
41
42
|
update_fields_set = set(update_fields) if update_fields else set()
|
42
|
-
|
43
|
+
|
43
44
|
if update_fields_set and update_fields_set.issubset(processing_fields):
|
44
45
|
# This is just a processing status update - don't reprocess
|
45
46
|
logger.debug(f"๐ Archive stats updated: {instance.title}")
|
46
47
|
return
|
47
|
-
|
48
|
+
|
48
49
|
# Check if archive file was updated
|
49
50
|
if 'archive_file' in update_fields_set and instance.archive_file:
|
50
51
|
logger.info(f"๐ฆ Archive file updated: {instance.title} (ID: {instance.id})")
|
51
|
-
|
52
|
+
|
52
53
|
# Clear existing items and reset processing state
|
53
54
|
_reset_archive_processing(instance)
|
54
|
-
|
55
|
+
|
55
56
|
# Start new processing
|
56
57
|
_start_archive_processing(instance)
|
57
58
|
else:
|
@@ -66,10 +67,10 @@ def archive_post_save(sender, instance, created, **kwargs):
|
|
66
67
|
def _reset_archive_processing(archive):
|
67
68
|
"""Reset archive processing state and clear items."""
|
68
69
|
logger.debug(f"๐งน Clearing items for archive: {archive.title}")
|
69
|
-
|
70
|
+
|
70
71
|
# Delete existing items (cascades to chunks)
|
71
72
|
archive.items.all().delete()
|
72
|
-
|
73
|
+
|
73
74
|
# Reset processing fields
|
74
75
|
archive.processing_status = "pending"
|
75
76
|
archive.processed_at = None
|
@@ -81,7 +82,7 @@ def _reset_archive_processing(archive):
|
|
81
82
|
archive.vectorized_chunks = 0
|
82
83
|
archive.total_tokens = 0
|
83
84
|
archive.total_cost_usd = 0
|
84
|
-
|
85
|
+
|
85
86
|
# Save with explicit update_fields to avoid triggering this signal again
|
86
87
|
archive.save(update_fields=[
|
87
88
|
'processing_status', 'processed_at', 'processing_duration_ms',
|
@@ -97,10 +98,10 @@ def _start_archive_processing(archive):
|
|
97
98
|
from ..tasks.archive_tasks import process_archive_task
|
98
99
|
process_archive_task.send(str(archive.id), str(archive.user.id))
|
99
100
|
logger.info(f"๐ Started async processing for archive: {archive.id}")
|
100
|
-
|
101
|
+
|
101
102
|
except Exception as e:
|
102
103
|
logger.error(f"โ Failed to start archive processing: {e}")
|
103
|
-
|
104
|
+
|
104
105
|
# Update archive status to failed
|
105
106
|
archive.processing_status = "failed"
|
106
107
|
archive.processing_error = f"Failed to start processing: {e}"
|
@@ -112,7 +113,7 @@ def archive_item_post_save(sender, instance, created, **kwargs):
|
|
112
113
|
"""Handle archive item creation."""
|
113
114
|
if created:
|
114
115
|
logger.debug(f"๐ New archive item created: {instance.archive.title} - {instance.item_name}")
|
115
|
-
|
116
|
+
|
116
117
|
# Update archive item count
|
117
118
|
archive = instance.archive
|
118
119
|
archive.total_items = archive.items.count()
|
@@ -130,13 +131,13 @@ def archive_item_post_delete(sender, instance, **kwargs):
|
|
130
131
|
except (AttributeError, DocumentArchive.DoesNotExist):
|
131
132
|
logger.debug("โ ๏ธ Archive already deleted, skipping item count update")
|
132
133
|
return
|
133
|
-
|
134
|
+
|
134
135
|
logger.debug(f"๐๏ธ Archive item deleted: {archive_title} - {instance.item_name}")
|
135
|
-
|
136
|
+
|
136
137
|
# Update archive item count
|
137
138
|
archive.total_items = archive.items.count()
|
138
139
|
archive.save(update_fields=['total_items'])
|
139
|
-
|
140
|
+
|
140
141
|
except DocumentArchive.DoesNotExist:
|
141
142
|
# Archive was already deleted
|
142
143
|
logger.debug("Archive already deleted, skipping item count update")
|
@@ -150,17 +151,17 @@ def archive_chunk_post_save(sender, instance, created, **kwargs):
|
|
150
151
|
"""Handle archive chunk creation."""
|
151
152
|
if created:
|
152
153
|
logger.debug(f"๐งฉ New archive chunk created: {instance.item.item_name} chunk {instance.chunk_index}")
|
153
|
-
|
154
|
+
|
154
155
|
# Update archive chunk count
|
155
156
|
archive = instance.archive
|
156
157
|
archive.total_chunks = ArchiveItemChunk.objects.filter(archive=archive).count()
|
157
|
-
|
158
|
+
|
158
159
|
# Update vectorized chunks count
|
159
160
|
archive.vectorized_chunks = ArchiveItemChunk.objects.filter(
|
160
|
-
archive=archive,
|
161
|
+
archive=archive,
|
161
162
|
embedding__isnull=False
|
162
163
|
).count()
|
163
|
-
|
164
|
+
|
164
165
|
archive.save(update_fields=['total_chunks', 'vectorized_chunks'])
|
165
166
|
|
166
167
|
|
@@ -173,9 +174,9 @@ def archive_chunk_post_delete(sender, instance, **kwargs):
|
|
173
174
|
item_name = instance.item.item_name if hasattr(instance, 'item') and instance.item else "unknown"
|
174
175
|
except (AttributeError, ArchiveItem.DoesNotExist):
|
175
176
|
item_name = "unknown"
|
176
|
-
|
177
|
+
|
177
178
|
logger.debug(f"๐๏ธ Archive chunk deleted: {item_name} chunk {instance.chunk_index}")
|
178
|
-
|
179
|
+
|
179
180
|
# Update archive chunk counts - get archive through item if available
|
180
181
|
try:
|
181
182
|
if hasattr(instance, 'item') and instance.item:
|
@@ -184,18 +185,18 @@ def archive_chunk_post_delete(sender, instance, **kwargs):
|
|
184
185
|
# If item is already deleted, we can't update counts safely
|
185
186
|
logger.debug("โ ๏ธ Cannot update chunk counts - parent item already deleted")
|
186
187
|
return
|
187
|
-
|
188
|
+
|
188
189
|
archive.total_chunks = ArchiveItemChunk.objects.filter(item__archive=archive).count()
|
189
190
|
archive.vectorized_chunks = ArchiveItemChunk.objects.filter(
|
190
|
-
item__archive=archive,
|
191
|
+
item__archive=archive,
|
191
192
|
embedding__isnull=False
|
192
193
|
).count()
|
193
|
-
|
194
|
+
|
194
195
|
archive.save(update_fields=['total_chunks', 'vectorized_chunks'])
|
195
|
-
|
196
|
+
|
196
197
|
except (AttributeError, ArchiveItem.DoesNotExist, DocumentArchive.DoesNotExist):
|
197
198
|
logger.debug("โ ๏ธ Cannot update chunk counts - related objects already deleted")
|
198
|
-
|
199
|
+
|
199
200
|
except Exception as e:
|
200
201
|
logger.error(f"โ Error in archive chunk post-delete signal: {e}")
|
201
202
|
# Don't re-raise to avoid breaking deletion
|
@@ -207,5 +208,5 @@ def archive_post_delete(sender, instance, **kwargs):
|
|
207
208
|
# Clear user's archive cache
|
208
209
|
cache_key = f"user_archives:{instance.user.id}"
|
209
210
|
cache.delete(cache_key)
|
210
|
-
|
211
|
+
|
211
212
|
logger.info(f"๐๏ธ Archive deleted: {instance.title} (ID: {instance.id})")
|
@@ -2,12 +2,13 @@
|
|
2
2
|
Chat and messaging related signals.
|
3
3
|
"""
|
4
4
|
|
5
|
-
|
5
|
+
import logging
|
6
|
+
|
6
7
|
from django.db import models
|
8
|
+
from django.db.models.signals import post_delete, post_save
|
7
9
|
from django.dispatch import receiver
|
8
|
-
import logging
|
9
10
|
|
10
|
-
from ..models import
|
11
|
+
from ..models import ChatMessage, ChatSession
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
13
14
|
|
@@ -17,7 +18,7 @@ def message_post_save(sender, instance, created, **kwargs):
|
|
17
18
|
"""Handle chat message creation."""
|
18
19
|
if created:
|
19
20
|
logger.debug(f"๐ฌ New message: {instance.session.title} - {instance.role}")
|
20
|
-
|
21
|
+
|
21
22
|
# Update session statistics
|
22
23
|
session = instance.session
|
23
24
|
session.messages_count = session.messages.count()
|
@@ -27,7 +28,7 @@ def message_post_save(sender, instance, created, **kwargs):
|
|
27
28
|
session.total_cost_usd = session.messages.aggregate(
|
28
29
|
total=models.Sum('cost_usd')
|
29
30
|
)['total'] or 0
|
30
|
-
|
31
|
+
|
31
32
|
session.save(update_fields=['messages_count', 'total_tokens_used', 'total_cost_usd'])
|
32
33
|
|
33
34
|
|
@@ -2,12 +2,12 @@
|
|
2
2
|
Document and DocumentChunk related signals.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.db.models.signals import post_save, post_delete
|
6
|
-
from django.db import models
|
7
|
-
from django.dispatch import receiver
|
8
|
-
from django.core.cache import cache
|
9
5
|
import logging
|
10
6
|
|
7
|
+
from django.core.cache import cache
|
8
|
+
from django.db.models.signals import post_delete, post_save
|
9
|
+
from django.dispatch import receiver
|
10
|
+
|
11
11
|
from ..models import Document, DocumentChunk, ProcessingStatus
|
12
12
|
|
13
13
|
logger = logging.getLogger(__name__)
|
@@ -16,43 +16,43 @@ logger = logging.getLogger(__name__)
|
|
16
16
|
@receiver(post_save, sender=Document)
|
17
17
|
def document_post_save(sender, instance, created, **kwargs):
|
18
18
|
"""Handle document creation and updates."""
|
19
|
-
|
19
|
+
|
20
20
|
# Clear user's document cache on any document change
|
21
21
|
cache_key = f"user_documents:{instance.user.id}"
|
22
22
|
cache.delete(cache_key)
|
23
|
-
|
23
|
+
|
24
24
|
if created:
|
25
25
|
# New document - always process
|
26
26
|
logger.info(f"๐ New document created: {instance.title} (ID: {instance.id})")
|
27
27
|
_start_document_processing(instance)
|
28
|
-
|
28
|
+
|
29
29
|
else:
|
30
30
|
# Document update - check what changed
|
31
31
|
update_fields = kwargs.get('update_fields')
|
32
|
-
|
32
|
+
|
33
33
|
# Define fields that, if updated alone, should NOT trigger reprocessing
|
34
34
|
processing_fields = {
|
35
35
|
'processing_status', 'processing_started_at', 'processing_completed_at',
|
36
36
|
'processing_error', 'chunks_count', 'total_tokens', 'total_cost_usd'
|
37
37
|
}
|
38
|
-
|
38
|
+
|
39
39
|
# If specific fields were updated, check if they are only processing-related
|
40
40
|
if update_fields is not None:
|
41
41
|
update_fields_set = set(update_fields) if update_fields else set()
|
42
|
-
|
42
|
+
|
43
43
|
if update_fields_set and update_fields_set.issubset(processing_fields):
|
44
44
|
# This is just a processing status update - don't reprocess
|
45
45
|
logger.debug(f"๐ Document stats updated: {instance.title}")
|
46
46
|
return
|
47
|
-
|
47
|
+
|
48
48
|
# Check if content actually changed
|
49
49
|
content_fields = {'content', 'content_hash'}
|
50
50
|
if content_fields.intersection(update_fields_set):
|
51
51
|
logger.info(f"๐ Document content updated: {instance.title} (ID: {instance.id})")
|
52
|
-
|
52
|
+
|
53
53
|
# Clear existing chunks and reset processing state
|
54
54
|
_reset_document_processing(instance)
|
55
|
-
|
55
|
+
|
56
56
|
# Start new processing
|
57
57
|
_start_document_processing(instance)
|
58
58
|
else:
|
@@ -68,10 +68,10 @@ def document_post_save(sender, instance, created, **kwargs):
|
|
68
68
|
def _reset_document_processing(document):
|
69
69
|
"""Reset document processing state and clear chunks."""
|
70
70
|
logger.debug(f"๐งน Clearing chunks for document: {document.title}")
|
71
|
-
|
71
|
+
|
72
72
|
# Delete existing chunks
|
73
73
|
document.chunks.all().delete()
|
74
|
-
|
74
|
+
|
75
75
|
# Reset processing fields
|
76
76
|
document.processing_status = "pending"
|
77
77
|
document.processing_started_at = None
|
@@ -80,7 +80,7 @@ def _reset_document_processing(document):
|
|
80
80
|
document.chunks_count = 0
|
81
81
|
document.total_tokens = 0
|
82
82
|
document.total_cost_usd = 0
|
83
|
-
|
83
|
+
|
84
84
|
# Save with explicit update_fields to avoid triggering this signal again
|
85
85
|
document.save(update_fields=[
|
86
86
|
'processing_status', 'processing_started_at', 'processing_completed_at',
|
@@ -95,10 +95,10 @@ def _start_document_processing(document):
|
|
95
95
|
from ..tasks.document_processing import process_document_async
|
96
96
|
process_document_async.send(str(document.id))
|
97
97
|
logger.info(f"๐ Started async processing for document: {document.id}")
|
98
|
-
|
98
|
+
|
99
99
|
except Exception as e:
|
100
100
|
logger.error(f"โ Failed to start document processing: {e}")
|
101
|
-
|
101
|
+
|
102
102
|
# Update document status to failed
|
103
103
|
document.processing_status = ProcessingStatus.FAILED
|
104
104
|
document.processing_error = f"Failed to start processing: {e}"
|
@@ -110,7 +110,7 @@ def chunk_post_save(sender, instance, created, **kwargs):
|
|
110
110
|
"""Handle chunk creation."""
|
111
111
|
if created:
|
112
112
|
logger.debug(f"๐งฉ New chunk created: {instance.document.title} chunk {instance.chunk_index}")
|
113
|
-
|
113
|
+
|
114
114
|
# Update document chunk count (this will trigger document save with update_fields)
|
115
115
|
document = instance.document
|
116
116
|
document.chunks_count = document.chunks.count()
|
@@ -122,12 +122,12 @@ def chunk_post_delete(sender, instance, **kwargs):
|
|
122
122
|
"""Handle chunk deletion."""
|
123
123
|
try:
|
124
124
|
logger.debug(f"๐๏ธ Chunk deleted: {instance.document.title} chunk {instance.chunk_index}")
|
125
|
-
|
125
|
+
|
126
126
|
# Update document chunk count
|
127
127
|
document = instance.document
|
128
128
|
document.chunks_count = document.chunks.count()
|
129
129
|
document.save(update_fields=['chunks_count'])
|
130
|
-
|
130
|
+
|
131
131
|
except Document.DoesNotExist:
|
132
132
|
# Document was already deleted
|
133
133
|
logger.debug("Document already deleted, skipping chunk count update")
|
@@ -139,5 +139,5 @@ def document_post_delete(sender, instance, **kwargs):
|
|
139
139
|
# Clear user's document cache
|
140
140
|
cache_key = f"user_documents:{instance.user.id}"
|
141
141
|
cache.delete(cache_key)
|
142
|
-
|
142
|
+
|
143
143
|
logger.info(f"๐๏ธ Document deleted: {instance.title} (ID: {instance.id})")
|
@@ -2,12 +2,12 @@
|
|
2
2
|
External Data and ExternalDataChunk related signals.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.db.models.signals import post_save, post_delete
|
6
|
-
from django.db import models
|
7
|
-
from django.dispatch import receiver
|
8
|
-
from django.core.cache import cache
|
9
5
|
import logging
|
10
6
|
|
7
|
+
from django.core.cache import cache
|
8
|
+
from django.db.models.signals import post_delete, post_save
|
9
|
+
from django.dispatch import receiver
|
10
|
+
|
11
11
|
from ..models.external_data import ExternalData, ExternalDataChunk, ExternalDataStatus
|
12
12
|
|
13
13
|
logger = logging.getLogger(__name__)
|
@@ -16,11 +16,11 @@ logger = logging.getLogger(__name__)
|
|
16
16
|
@receiver(post_save, sender=ExternalData)
|
17
17
|
def external_data_post_save(sender, instance, created, **kwargs):
|
18
18
|
"""Handle external data creation and updates."""
|
19
|
-
|
19
|
+
|
20
20
|
# Clear user's external data cache on any change
|
21
21
|
cache_key = f"user_external_data:{instance.user.id}"
|
22
22
|
cache.delete(cache_key)
|
23
|
-
|
23
|
+
|
24
24
|
if created:
|
25
25
|
# New external data - process if has content
|
26
26
|
logger.info(f"๐ New external data created: {instance.title} (ID: {instance.id})")
|
@@ -28,36 +28,36 @@ def external_data_post_save(sender, instance, created, **kwargs):
|
|
28
28
|
_start_external_data_processing(instance)
|
29
29
|
else:
|
30
30
|
logger.debug(f"๐ External data created without content: {instance.title}")
|
31
|
-
|
31
|
+
|
32
32
|
else:
|
33
33
|
# External data update - check what changed
|
34
34
|
update_fields = kwargs.get('update_fields')
|
35
|
-
|
35
|
+
|
36
36
|
# Define fields that, if updated alone, should NOT trigger reprocessing
|
37
37
|
processing_fields = {
|
38
38
|
'status', 'processed_at', 'source_updated_at', 'processing_error',
|
39
39
|
'total_chunks', 'total_tokens', 'processing_cost'
|
40
40
|
}
|
41
|
-
|
41
|
+
|
42
42
|
# If specific fields were updated, check if they are only processing-related
|
43
43
|
if update_fields is not None:
|
44
44
|
update_fields_set = set(update_fields) if update_fields else set()
|
45
|
-
|
45
|
+
|
46
46
|
if update_fields_set and update_fields_set.issubset(processing_fields):
|
47
47
|
# This is just a processing status update - don't reprocess
|
48
48
|
logger.debug(f"๐ External data stats updated: {instance.title}")
|
49
49
|
return
|
50
|
-
|
50
|
+
|
51
51
|
# Check if content actually changed
|
52
52
|
content_fields = {'content', 'content_hash', 'source_config', 'chunk_size', 'overlap_size', 'embedding_model'}
|
53
53
|
if content_fields.intersection(update_fields_set):
|
54
54
|
logger.info(f"๐ External data content updated: {instance.title} (ID: {instance.id})")
|
55
|
-
|
55
|
+
|
56
56
|
# Only reprocess if there's content
|
57
57
|
if instance.content and instance.content.strip():
|
58
58
|
# Clear existing chunks and reset processing state
|
59
59
|
_reset_external_data_processing(instance)
|
60
|
-
|
60
|
+
|
61
61
|
# Start new processing
|
62
62
|
_start_external_data_processing(instance)
|
63
63
|
else:
|
@@ -83,10 +83,10 @@ def external_data_post_save(sender, instance, created, **kwargs):
|
|
83
83
|
def _reset_external_data_processing(external_data):
|
84
84
|
"""Reset external data processing state and clear chunks."""
|
85
85
|
logger.debug(f"๐งน Clearing chunks for external data: {external_data.title}")
|
86
|
-
|
86
|
+
|
87
87
|
# Delete existing chunks
|
88
88
|
external_data.chunks.all().delete()
|
89
|
-
|
89
|
+
|
90
90
|
# Reset processing fields
|
91
91
|
external_data.status = ExternalDataStatus.PENDING
|
92
92
|
external_data.processed_at = None
|
@@ -94,7 +94,7 @@ def _reset_external_data_processing(external_data):
|
|
94
94
|
external_data.total_chunks = 0
|
95
95
|
external_data.total_tokens = 0
|
96
96
|
external_data.processing_cost = 0.0
|
97
|
-
|
97
|
+
|
98
98
|
# Save with explicit update_fields to avoid triggering this signal again
|
99
99
|
external_data.save(update_fields=[
|
100
100
|
'status', 'processed_at', 'processing_error',
|
@@ -109,10 +109,10 @@ def _start_external_data_processing(external_data):
|
|
109
109
|
from ..tasks.external_data_tasks import process_external_data_async
|
110
110
|
process_external_data_async.send(str(external_data.id))
|
111
111
|
logger.info(f"๐ Started async processing for external data: {external_data.id}")
|
112
|
-
|
112
|
+
|
113
113
|
except Exception as e:
|
114
114
|
logger.error(f"โ Failed to start external data processing: {e}")
|
115
|
-
|
115
|
+
|
116
116
|
# Update external data status to failed
|
117
117
|
external_data.status = ExternalDataStatus.FAILED
|
118
118
|
external_data.processing_error = f"Failed to start processing: {e}"
|
@@ -124,7 +124,7 @@ def external_data_chunk_post_save(sender, instance, created, **kwargs):
|
|
124
124
|
"""Handle external data chunk creation."""
|
125
125
|
if created:
|
126
126
|
logger.debug(f"๐งฉ New external data chunk created: {instance.external_data.title} chunk {instance.chunk_index}")
|
127
|
-
|
127
|
+
|
128
128
|
# Update external data chunk count (this will trigger external data save with update_fields)
|
129
129
|
external_data = instance.external_data
|
130
130
|
external_data.total_chunks = external_data.chunks.count()
|
@@ -136,12 +136,12 @@ def external_data_chunk_post_delete(sender, instance, **kwargs):
|
|
136
136
|
"""Handle external data chunk deletion."""
|
137
137
|
try:
|
138
138
|
logger.debug(f"๐๏ธ External data chunk deleted: {instance.external_data.title} chunk {instance.chunk_index}")
|
139
|
-
|
139
|
+
|
140
140
|
# Update external data chunk count
|
141
141
|
external_data = instance.external_data
|
142
142
|
external_data.total_chunks = external_data.chunks.count()
|
143
143
|
external_data.save(update_fields=['total_chunks'])
|
144
|
-
|
144
|
+
|
145
145
|
except ExternalData.DoesNotExist:
|
146
146
|
# External data was already deleted
|
147
147
|
logger.debug("External data already deleted, skipping chunk count update")
|
@@ -153,5 +153,5 @@ def external_data_post_delete(sender, instance, **kwargs):
|
|
153
153
|
# Clear user's external data cache
|
154
154
|
cache_key = f"user_external_data:{instance.user.id}"
|
155
155
|
cache.delete(cache_key)
|
156
|
-
|
156
|
+
|
157
157
|
logger.info(f"๐๏ธ External data deleted: {instance.title} (ID: {instance.id})")
|
@@ -4,18 +4,17 @@ Knowledge Base Background Tasks
|
|
4
4
|
Dramatiq tasks for document processing and maintenance.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .document_processing import *
|
8
|
-
from .maintenance import *
|
9
7
|
from .archive_tasks import *
|
8
|
+
from .document_processing import *
|
10
9
|
from .external_data_tasks import *
|
11
|
-
|
10
|
+
from .maintenance import *
|
12
11
|
|
13
12
|
__all__ = [
|
14
13
|
# Document processing
|
15
14
|
'process_document_async',
|
16
15
|
'reprocess_document_chunks',
|
17
16
|
'generate_embeddings_batch',
|
18
|
-
|
17
|
+
|
19
18
|
# Archive processing
|
20
19
|
'process_archive_task',
|
21
20
|
'vectorize_archive_items_task',
|
@@ -23,17 +22,17 @@ __all__ = [
|
|
23
22
|
'generate_archive_statistics_task',
|
24
23
|
'archive_health_check_task',
|
25
24
|
'test_archive_task',
|
26
|
-
|
25
|
+
|
27
26
|
# External data processing
|
28
27
|
'process_external_data_async',
|
29
28
|
'bulk_process_external_data_async',
|
30
29
|
'cleanup_failed_external_data_async',
|
31
|
-
|
30
|
+
|
32
31
|
# Maintenance
|
33
32
|
'cleanup_old_embeddings',
|
34
33
|
'optimize_vector_indexes',
|
35
34
|
'health_check_knowledge_base',
|
36
|
-
|
35
|
+
|
37
36
|
# Test tasks
|
38
37
|
'test_simple_task',
|
39
38
|
]
|