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
@@ -4,29 +4,26 @@ Main document archive service.
|
|
4
4
|
Orchestrates the complete archive processing pipeline with synchronous processing.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import os
|
8
|
-
import time
|
9
|
-
import tempfile
|
10
7
|
import hashlib
|
11
8
|
import logging
|
12
|
-
|
13
|
-
|
9
|
+
import os
|
10
|
+
import tempfile
|
11
|
+
import time
|
12
|
+
from typing import Any, Dict, List, Optional
|
13
|
+
|
14
14
|
from django.contrib.auth import get_user_model
|
15
|
+
from django.core.files.uploadedfile import UploadedFile
|
15
16
|
from django.db import transaction
|
16
17
|
from django.utils import timezone
|
17
18
|
from pydantic import BaseModel, Field, ValidationError
|
18
19
|
|
19
|
-
from ...models.archive import
|
20
|
-
from ...models.document import DocumentCategory
|
20
|
+
from ...models.archive import ArchiveType, DocumentArchive
|
21
21
|
from ...models.base import ProcessingStatus
|
22
|
+
from ...models.document import DocumentCategory
|
22
23
|
from ..base import BaseService
|
23
|
-
from .exceptions import (
|
24
|
-
ArchiveValidationError,
|
25
|
-
ArchiveProcessingError,
|
26
|
-
ProcessingTimeoutError
|
27
|
-
)
|
28
|
-
from .extraction_service import ArchiveExtractionService, ExtractedItemData
|
29
24
|
from .chunking_service import ContextualChunkingService
|
25
|
+
from .exceptions import ArchiveProcessingError, ArchiveValidationError, ProcessingTimeoutError
|
26
|
+
from .extraction_service import ArchiveExtractionService, ExtractedItemData
|
30
27
|
from .vectorization_service import ArchiveVectorizationService
|
31
28
|
|
32
29
|
User = get_user_model()
|
@@ -35,20 +32,20 @@ logger = logging.getLogger(__name__)
|
|
35
32
|
|
36
33
|
class ArchiveUploadRequest(BaseModel):
|
37
34
|
"""Pydantic model for archive upload validation."""
|
38
|
-
|
35
|
+
|
39
36
|
title: str = Field(..., min_length=1, max_length=512)
|
40
37
|
description: Optional[str] = Field(None, max_length=2000)
|
41
38
|
category_ids: List[str] = Field(default_factory=list)
|
42
39
|
is_public: bool = Field(default=True)
|
43
40
|
process_immediately: bool = Field(default=True)
|
44
|
-
|
41
|
+
|
45
42
|
class Config:
|
46
43
|
str_strip_whitespace = True
|
47
44
|
|
48
45
|
|
49
46
|
class ArchiveProcessingResult(BaseModel):
|
50
47
|
"""Result of archive processing operation."""
|
51
|
-
|
48
|
+
|
52
49
|
archive_id: str
|
53
50
|
status: str
|
54
51
|
processing_time_ms: int
|
@@ -61,25 +58,25 @@ class ArchiveProcessingResult(BaseModel):
|
|
61
58
|
|
62
59
|
class DocumentArchiveService(BaseService):
|
63
60
|
"""Main service for document archive operations."""
|
64
|
-
|
61
|
+
|
65
62
|
# Processing limits
|
66
63
|
MAX_ARCHIVE_SIZE = 200 * 1024 * 1024 # 200MB
|
67
64
|
MAX_ITEMS_COUNT = 2000
|
68
65
|
MAX_PROCESSING_TIME = 120 # 2 minutes
|
69
|
-
|
66
|
+
|
70
67
|
def __init__(self, user: User):
|
71
68
|
super().__init__(user)
|
72
69
|
self.extraction_service = ArchiveExtractionService()
|
73
70
|
self.chunking_service = ContextualChunkingService(user)
|
74
71
|
self.vectorization_service = ArchiveVectorizationService(user)
|
75
|
-
|
72
|
+
|
76
73
|
def create_and_process_archive(
|
77
74
|
self,
|
78
75
|
uploaded_file: UploadedFile,
|
79
76
|
request_data: Dict[str, Any]
|
80
77
|
) -> ArchiveProcessingResult:
|
81
78
|
"""Create archive and process it synchronously."""
|
82
|
-
|
79
|
+
|
83
80
|
# Validate request data
|
84
81
|
try:
|
85
82
|
validated_request = ArchiveUploadRequest(**request_data)
|
@@ -89,10 +86,10 @@ class DocumentArchiveService(BaseService):
|
|
89
86
|
code="INVALID_REQUEST",
|
90
87
|
details={"validation_errors": e.errors()}
|
91
88
|
)
|
92
|
-
|
89
|
+
|
93
90
|
# Create archive record
|
94
91
|
archive = self._create_archive_record(uploaded_file, validated_request)
|
95
|
-
|
92
|
+
|
96
93
|
# Process synchronously if requested
|
97
94
|
if validated_request.process_immediately:
|
98
95
|
return self._process_archive_sync(archive, uploaded_file)
|
@@ -106,72 +103,72 @@ class DocumentArchiveService(BaseService):
|
|
106
103
|
vectorized_chunks=0,
|
107
104
|
total_cost_usd=0.0
|
108
105
|
)
|
109
|
-
|
106
|
+
|
110
107
|
def process_archive(self, archive: DocumentArchive) -> bool:
|
111
108
|
"""Process an existing archive by its stored file."""
|
112
|
-
|
109
|
+
|
113
110
|
# Debug logging
|
114
111
|
logger.info(f"process_archive called with archive: {archive}, type: {type(archive)}")
|
115
|
-
|
112
|
+
|
116
113
|
if not archive:
|
117
114
|
raise ArchiveProcessingError(
|
118
115
|
message="Archive object is None",
|
119
116
|
code="ARCHIVE_IS_NONE"
|
120
117
|
)
|
121
|
-
|
118
|
+
|
122
119
|
if not archive.archive_file:
|
123
120
|
raise ArchiveProcessingError(
|
124
121
|
message="Archive has no file to process",
|
125
122
|
code="NO_FILE"
|
126
123
|
)
|
127
|
-
|
124
|
+
|
128
125
|
start_time = time.time()
|
129
|
-
|
126
|
+
|
130
127
|
try:
|
131
128
|
# Update status
|
132
129
|
archive.processing_status = ProcessingStatus.PROCESSING
|
133
130
|
archive.save()
|
134
|
-
|
131
|
+
|
135
132
|
# Get file path from the archive_file field
|
136
133
|
file_path = archive.archive_file.path
|
137
|
-
|
134
|
+
|
138
135
|
# Extract archive
|
139
136
|
extracted_items = self.extraction_service.extract_archive(
|
140
|
-
file_path,
|
137
|
+
file_path,
|
141
138
|
archive.archive_type
|
142
139
|
)
|
143
|
-
|
140
|
+
|
144
141
|
# Check processing time
|
145
142
|
self._check_processing_timeout(start_time)
|
146
|
-
|
143
|
+
|
147
144
|
# Create item records
|
148
145
|
items = self._create_item_records(archive, extracted_items)
|
149
|
-
|
146
|
+
|
150
147
|
# Check processing time again
|
151
148
|
self._check_processing_timeout(start_time)
|
152
|
-
|
149
|
+
|
153
150
|
# Generate chunks
|
154
151
|
chunks = self._generate_chunks_for_items(items)
|
155
|
-
|
152
|
+
|
156
153
|
# Check processing time again
|
157
154
|
self._check_processing_timeout(start_time)
|
158
|
-
|
155
|
+
|
159
156
|
# Vectorize chunks
|
160
157
|
vectorization_result = self._vectorize_chunks(chunks)
|
161
|
-
|
158
|
+
|
162
159
|
# Update archive statistics
|
163
160
|
self._update_archive_statistics(archive, items, chunks, vectorization_result)
|
164
|
-
|
161
|
+
|
165
162
|
# Mark as completed
|
166
163
|
processing_time_ms = int((time.time() - start_time) * 1000)
|
167
164
|
archive.processing_status = ProcessingStatus.COMPLETED
|
168
165
|
archive.processed_at = timezone.now()
|
169
166
|
archive.processing_duration_ms = processing_time_ms
|
170
167
|
archive.save()
|
171
|
-
|
168
|
+
|
172
169
|
logger.info(f"Successfully processed archive {archive.id} in {processing_time_ms}ms")
|
173
170
|
return True
|
174
|
-
|
171
|
+
|
175
172
|
except ProcessingTimeoutError:
|
176
173
|
processing_time_ms = int((time.time() - start_time) * 1000)
|
177
174
|
archive.processing_status = ProcessingStatus.FAILED
|
@@ -180,7 +177,7 @@ class DocumentArchiveService(BaseService):
|
|
180
177
|
archive.save()
|
181
178
|
logger.error(f"Archive processing timeout for {archive.id}")
|
182
179
|
return False
|
183
|
-
|
180
|
+
|
184
181
|
except Exception as e:
|
185
182
|
processing_time_ms = int((time.time() - start_time) * 1000)
|
186
183
|
archive.processing_status = ProcessingStatus.FAILED
|
@@ -196,29 +193,29 @@ class DocumentArchiveService(BaseService):
|
|
196
193
|
request: ArchiveUploadRequest
|
197
194
|
) -> DocumentArchive:
|
198
195
|
"""Create initial archive record."""
|
199
|
-
|
196
|
+
|
200
197
|
# Validate file
|
201
198
|
self._validate_uploaded_file(uploaded_file)
|
202
|
-
|
199
|
+
|
203
200
|
# Generate content hash
|
204
201
|
content_hash = self._generate_file_hash(uploaded_file)
|
205
|
-
|
202
|
+
|
206
203
|
# Check for duplicates
|
207
204
|
existing = DocumentArchive.objects.filter(
|
208
205
|
user=self.user,
|
209
206
|
content_hash=content_hash
|
210
207
|
).first()
|
211
|
-
|
208
|
+
|
212
209
|
if existing:
|
213
210
|
raise ArchiveValidationError(
|
214
211
|
message=f"Archive already exists: {existing.title}",
|
215
212
|
code="DUPLICATE_ARCHIVE",
|
216
213
|
details={"existing_archive_id": str(existing.id)}
|
217
214
|
)
|
218
|
-
|
215
|
+
|
219
216
|
# Detect archive type
|
220
217
|
archive_type = self._detect_archive_type(uploaded_file.name)
|
221
|
-
|
218
|
+
|
222
219
|
with transaction.atomic():
|
223
220
|
# Create archive record
|
224
221
|
archive = DocumentArchive.objects.create(
|
@@ -232,73 +229,73 @@ class DocumentArchiveService(BaseService):
|
|
232
229
|
is_public=request.is_public,
|
233
230
|
processing_status=ProcessingStatus.PENDING
|
234
231
|
)
|
235
|
-
|
232
|
+
|
236
233
|
# Add categories
|
237
234
|
if request.category_ids:
|
238
235
|
categories = DocumentCategory.objects.filter(
|
239
236
|
id__in=request.category_ids
|
240
237
|
)
|
241
238
|
archive.categories.set(categories)
|
242
|
-
|
239
|
+
|
243
240
|
return archive
|
244
|
-
|
241
|
+
|
245
242
|
def _process_archive_sync(
|
246
243
|
self,
|
247
244
|
archive: DocumentArchive,
|
248
245
|
uploaded_file: UploadedFile
|
249
246
|
) -> ArchiveProcessingResult:
|
250
247
|
"""Process archive synchronously with time limits."""
|
251
|
-
|
248
|
+
|
252
249
|
start_time = time.time()
|
253
|
-
|
250
|
+
|
254
251
|
try:
|
255
252
|
# Update status
|
256
253
|
archive.processing_status = ProcessingStatus.PROCESSING
|
257
254
|
archive.save()
|
258
|
-
|
255
|
+
|
259
256
|
# Save file temporarily
|
260
257
|
temp_file_path = self._save_temp_file(uploaded_file, archive.id)
|
261
|
-
|
258
|
+
|
262
259
|
try:
|
263
260
|
# Extract archive
|
264
261
|
extracted_items = self.extraction_service.extract_archive(
|
265
|
-
temp_file_path,
|
262
|
+
temp_file_path,
|
266
263
|
archive.archive_type
|
267
264
|
)
|
268
|
-
|
265
|
+
|
269
266
|
# Check processing time
|
270
267
|
self._check_processing_timeout(start_time)
|
271
|
-
|
268
|
+
|
272
269
|
# Create item records
|
273
270
|
items = self._create_item_records(archive, extracted_items)
|
274
|
-
|
271
|
+
|
275
272
|
# Check processing time
|
276
273
|
self._check_processing_timeout(start_time)
|
277
|
-
|
274
|
+
|
278
275
|
# Generate chunks
|
279
276
|
all_chunks = self._generate_chunks_for_items(items)
|
280
|
-
|
277
|
+
|
281
278
|
# Check processing time
|
282
279
|
self._check_processing_timeout(start_time)
|
283
|
-
|
280
|
+
|
284
281
|
# Vectorize chunks
|
285
282
|
vectorization_result = self._vectorize_chunks(all_chunks)
|
286
|
-
|
283
|
+
|
287
284
|
# Update archive statistics
|
288
285
|
self._update_archive_statistics(
|
289
|
-
archive,
|
290
|
-
items,
|
291
|
-
all_chunks,
|
286
|
+
archive,
|
287
|
+
items,
|
288
|
+
all_chunks,
|
292
289
|
vectorization_result
|
293
290
|
)
|
294
|
-
|
291
|
+
|
295
292
|
# Mark as completed
|
296
293
|
processing_time_ms = int((time.time() - start_time) * 1000)
|
297
294
|
archive.processing_status = ProcessingStatus.COMPLETED
|
298
295
|
archive.processed_at = timezone.now()
|
299
296
|
archive.processing_duration_ms = processing_time_ms
|
300
297
|
archive.save()
|
301
|
-
|
298
|
+
|
302
299
|
return ArchiveProcessingResult(
|
303
300
|
archive_id=str(archive.id),
|
304
301
|
status=archive.processing_status,
|
@@ -308,11 +305,11 @@ class DocumentArchiveService(BaseService):
|
|
308
305
|
vectorized_chunks=vectorization_result['vectorized_count'],
|
309
306
|
total_cost_usd=vectorization_result['total_cost']
|
310
307
|
)
|
311
|
-
|
308
|
+
|
312
309
|
finally:
|
313
310
|
# Always cleanup temp file
|
314
311
|
self._cleanup_temp_file(temp_file_path)
|
315
|
-
|
312
|
+
|
316
313
|
except Exception as e:
|
317
314
|
# Mark as failed
|
318
315
|
processing_time_ms = int((time.time() - start_time) * 1000)
|
@@ -320,7 +317,7 @@ class DocumentArchiveService(BaseService):
|
|
320
317
|
archive.processing_error = str(e)
|
321
318
|
archive.processing_duration_ms = processing_time_ms
|
322
319
|
archive.save()
|
323
|
-
|
320
|
+
|
324
321
|
return ArchiveProcessingResult(
|
325
322
|
archive_id=str(archive.id),
|
326
323
|
status=archive.processing_status,
|
@@ -331,10 +328,10 @@ class DocumentArchiveService(BaseService):
|
|
331
328
|
total_cost_usd=0.0,
|
332
329
|
error_message=str(e)
|
333
330
|
)
|
334
|
-
|
331
|
+
|
335
332
|
def _validate_uploaded_file(self, uploaded_file: UploadedFile) -> None:
|
336
333
|
"""Validate uploaded archive file."""
|
337
|
-
|
334
|
+
|
338
335
|
# Size check
|
339
336
|
if uploaded_file.size > self.MAX_ARCHIVE_SIZE:
|
340
337
|
raise ArchiveValidationError(
|
@@ -345,7 +342,7 @@ class DocumentArchiveService(BaseService):
|
|
345
342
|
"max_size": self.MAX_ARCHIVE_SIZE
|
346
343
|
}
|
347
344
|
)
|
348
|
-
|
345
|
+
|
349
346
|
# Type check
|
350
347
|
archive_type = self._detect_archive_type(uploaded_file.name)
|
351
348
|
if not archive_type:
|
@@ -354,11 +351,11 @@ class DocumentArchiveService(BaseService):
|
|
354
351
|
code="UNSUPPORTED_FORMAT",
|
355
352
|
details={"filename": uploaded_file.name}
|
356
353
|
)
|
357
|
-
|
354
|
+
|
358
355
|
def _detect_archive_type(self, filename: str) -> Optional[str]:
|
359
356
|
"""Detect archive type from filename."""
|
360
357
|
filename_lower = filename.lower()
|
361
|
-
|
358
|
+
|
362
359
|
if filename_lower.endswith('.zip'):
|
363
360
|
return ArchiveType.ZIP
|
364
361
|
elif filename_lower.endswith(('.tar.gz', '.tgz')):
|
@@ -367,47 +364,47 @@ class DocumentArchiveService(BaseService):
|
|
367
364
|
return ArchiveType.TAR_BZ2
|
368
365
|
elif filename_lower.endswith('.tar'):
|
369
366
|
return ArchiveType.TAR
|
370
|
-
|
367
|
+
|
371
368
|
return None
|
372
|
-
|
369
|
+
|
373
370
|
def _generate_file_hash(self, uploaded_file: UploadedFile) -> str:
|
374
371
|
"""Generate SHA-256 hash of uploaded file."""
|
375
372
|
hash_sha256 = hashlib.sha256()
|
376
|
-
|
373
|
+
|
377
374
|
# Reset file pointer
|
378
375
|
uploaded_file.seek(0)
|
379
|
-
|
376
|
+
|
380
377
|
for chunk in uploaded_file.chunks():
|
381
378
|
hash_sha256.update(chunk)
|
382
|
-
|
379
|
+
|
383
380
|
# Reset file pointer again
|
384
381
|
uploaded_file.seek(0)
|
385
|
-
|
382
|
+
|
386
383
|
return hash_sha256.hexdigest()
|
387
|
-
|
384
|
+
|
388
385
|
def _save_temp_file(self, uploaded_file: UploadedFile, archive_id: str) -> str:
|
389
386
|
"""Save uploaded file to temporary location."""
|
390
387
|
temp_dir = tempfile.mkdtemp(prefix=f'archive_{archive_id}_')
|
391
388
|
temp_path = os.path.join(temp_dir, uploaded_file.name)
|
392
|
-
|
389
|
+
|
393
390
|
with open(temp_path, 'wb') as f:
|
394
391
|
for chunk in uploaded_file.chunks():
|
395
392
|
f.write(chunk)
|
396
|
-
|
393
|
+
|
397
394
|
return temp_path
|
398
|
-
|
395
|
+
|
399
396
|
def _cleanup_temp_file(self, temp_file_path: str) -> None:
|
400
397
|
"""Clean up temporary file and directory."""
|
401
398
|
if os.path.exists(temp_file_path):
|
402
399
|
os.unlink(temp_file_path)
|
403
|
-
|
400
|
+
|
404
401
|
# Remove directory if empty
|
405
402
|
temp_dir = os.path.dirname(temp_file_path)
|
406
403
|
try:
|
407
404
|
os.rmdir(temp_dir)
|
408
405
|
except OSError:
|
409
406
|
pass # Directory not empty or other error
|
410
|
-
|
407
|
+
|
411
408
|
def _check_processing_timeout(self, start_time: float) -> None:
|
412
409
|
"""Check if processing has exceeded time limit."""
|
413
410
|
elapsed = time.time() - start_time
|
@@ -420,15 +417,15 @@ class DocumentArchiveService(BaseService):
|
|
420
417
|
"max_seconds": self.MAX_PROCESSING_TIME
|
421
418
|
}
|
422
419
|
)
|
423
|
-
|
420
|
+
|
424
421
|
def _create_item_records(
|
425
|
-
self,
|
426
|
-
archive: DocumentArchive,
|
422
|
+
self,
|
423
|
+
archive: DocumentArchive,
|
427
424
|
extracted_items: List[ExtractedItemData]
|
428
425
|
) -> List:
|
429
426
|
"""Create ArchiveItem records from extracted data."""
|
430
427
|
from ...models.archive import ArchiveItem
|
431
|
-
|
428
|
+
|
432
429
|
if len(extracted_items) > self.MAX_ITEMS_COUNT:
|
433
430
|
raise ArchiveValidationError(
|
434
431
|
message=f"Too many items: {len(extracted_items)}",
|
@@ -438,11 +435,11 @@ class DocumentArchiveService(BaseService):
|
|
438
435
|
"max_count": self.MAX_ITEMS_COUNT
|
439
436
|
}
|
440
437
|
)
|
441
|
-
|
438
|
+
|
442
439
|
items = []
|
443
|
-
|
440
|
+
|
444
441
|
# Note: Items should already be cleared by reprocess method
|
445
|
-
|
442
|
+
|
446
443
|
with transaction.atomic():
|
447
444
|
for item_data in extracted_items:
|
448
445
|
item = ArchiveItem.objects.create(
|
@@ -456,33 +453,33 @@ class DocumentArchiveService(BaseService):
|
|
456
453
|
metadata=item_data.metadata
|
457
454
|
)
|
458
455
|
items.append(item)
|
459
|
-
|
456
|
+
|
460
457
|
# Update archive statistics
|
461
458
|
archive.total_items = len(items)
|
462
459
|
archive.processed_items = len(items)
|
463
460
|
archive.save()
|
464
|
-
|
461
|
+
|
465
462
|
return items
|
466
|
-
|
463
|
+
|
467
464
|
def _generate_chunks_for_items(self, items: List) -> List:
|
468
465
|
"""Generate chunks for all processable items."""
|
469
466
|
all_chunks = []
|
470
|
-
|
467
|
+
|
471
468
|
for item in items:
|
472
469
|
if item.is_processable and item.raw_content:
|
473
470
|
chunks = self.chunking_service.create_chunks_with_context(item)
|
474
471
|
all_chunks.extend(chunks)
|
475
|
-
|
472
|
+
|
476
473
|
# Update item statistics
|
477
474
|
item.chunks_count = len(chunks)
|
478
475
|
item.save()
|
479
|
-
|
476
|
+
|
480
477
|
return all_chunks
|
481
|
-
|
478
|
+
|
482
479
|
def _vectorize_chunks(self, chunks: List) -> Dict[str, Any]:
|
483
480
|
"""Vectorize all chunks."""
|
484
481
|
return self.vectorization_service.vectorize_chunks_batch(chunks)
|
485
|
-
|
482
|
+
|
486
483
|
def _update_archive_statistics(
|
487
484
|
self,
|
488
485
|
archive: DocumentArchive,
|
@@ -491,16 +488,16 @@ class DocumentArchiveService(BaseService):
|
|
491
488
|
vectorization_result: Dict[str, Any]
|
492
489
|
) -> None:
|
493
490
|
"""Update archive with final statistics."""
|
494
|
-
|
491
|
+
|
495
492
|
total_tokens = sum(item.total_tokens for item in items)
|
496
493
|
total_cost = sum(item.processing_cost for item in items)
|
497
|
-
|
494
|
+
|
498
495
|
archive.total_chunks = len(chunks)
|
499
496
|
archive.vectorized_chunks = vectorization_result['vectorized_count']
|
500
497
|
archive.total_tokens = total_tokens
|
501
498
|
archive.total_cost_usd = total_cost
|
502
499
|
archive.save()
|
503
|
-
|
500
|
+
|
504
501
|
def get_archive_by_id(self, archive_id: str) -> Optional[DocumentArchive]:
|
505
502
|
"""Get archive by ID with user access check."""
|
506
503
|
try:
|
@@ -508,7 +505,7 @@ class DocumentArchiveService(BaseService):
|
|
508
505
|
return archive
|
509
506
|
except DocumentArchive.DoesNotExist:
|
510
507
|
return None
|
511
|
-
|
508
|
+
|
512
509
|
def list_user_archives(
|
513
510
|
self,
|
514
511
|
limit: int = 20,
|
@@ -516,21 +513,21 @@ class DocumentArchiveService(BaseService):
|
|
516
513
|
status_filter: Optional[str] = None
|
517
514
|
) -> Dict[str, Any]:
|
518
515
|
"""List user's archives with pagination."""
|
519
|
-
|
516
|
+
|
520
517
|
queryset = DocumentArchive.objects.filter(user=self.user)
|
521
|
-
|
518
|
+
|
522
519
|
if status_filter:
|
523
520
|
queryset = queryset.filter(processing_status=status_filter)
|
524
|
-
|
521
|
+
|
525
522
|
total_count = queryset.count()
|
526
523
|
archives = list(queryset.order_by('-created_at')[offset:offset + limit])
|
527
|
-
|
524
|
+
|
528
525
|
return {
|
529
526
|
'archives': archives,
|
530
527
|
'total_count': total_count,
|
531
528
|
'has_more': offset + limit < total_count
|
532
529
|
}
|
533
|
-
|
530
|
+
|
534
531
|
def delete_archive(self, archive_id: str) -> bool:
|
535
532
|
"""Delete archive and all related data."""
|
536
533
|
try:
|
@@ -5,10 +5,10 @@ Language-specific and content-aware chunking implementations.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from .base import BaseChunker
|
8
|
-
from .text_chunker import TextChunker
|
9
|
-
from .python_chunker import PythonChunker
|
10
|
-
from .markdown_chunker import MarkdownChunker
|
11
8
|
from .json_chunker import JsonChunker
|
9
|
+
from .markdown_chunker import MarkdownChunker
|
10
|
+
from .python_chunker import PythonChunker
|
11
|
+
from .text_chunker import TextChunker
|
12
12
|
|
13
13
|
__all__ = [
|
14
14
|
'BaseChunker',
|
@@ -6,10 +6,11 @@ Chunks JSON by object structure.
|
|
6
6
|
|
7
7
|
import json
|
8
8
|
from typing import List
|
9
|
-
|
10
|
-
from ..context.models import ChunkData
|
11
|
-
from ..context.builders import ChunkContextBuilder
|
9
|
+
|
12
10
|
from ....models.archive import ArchiveItem, ChunkType
|
11
|
+
from ..context.builders import ChunkContextBuilder
|
12
|
+
from ..context.models import ChunkData
|
13
|
+
from .base import BaseChunker
|
13
14
|
|
14
15
|
|
15
16
|
class JsonChunker(BaseChunker):
|
@@ -4,11 +4,12 @@ Markdown document chunker.
|
|
4
4
|
Chunks markdown by headings and sections.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
8
|
-
|
9
|
-
from ..context.models import ChunkData
|
10
|
-
from ..context.builders import ChunkContextBuilder
|
7
|
+
from typing import Any, Dict, List
|
8
|
+
|
11
9
|
from ....models.archive import ArchiveItem, ChunkType
|
10
|
+
from ..context.builders import ChunkContextBuilder
|
11
|
+
from ..context.models import ChunkData
|
12
|
+
from .base import BaseChunker
|
12
13
|
|
13
14
|
|
14
15
|
class MarkdownChunker(BaseChunker):
|
@@ -5,11 +5,12 @@ Chunks Python code by logical boundaries (classes, functions, imports).
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import ast
|
8
|
-
from typing import
|
9
|
-
|
10
|
-
from ..context.models import ChunkData
|
11
|
-
from ..context.builders import ChunkContextBuilder
|
8
|
+
from typing import Any, Dict, List, Optional
|
9
|
+
|
12
10
|
from ....models.archive import ArchiveItem, ChunkType
|
11
|
+
from ..context.builders import ChunkContextBuilder
|
12
|
+
from ..context.models import ChunkData
|
13
|
+
from .base import BaseChunker
|
13
14
|
|
14
15
|
|
15
16
|
class PythonChunker(BaseChunker):
|
@@ -97,7 +98,7 @@ class PythonChunker(BaseChunker):
|
|
97
98
|
content = '\n'.join(lines[start_line:end_line])
|
98
99
|
|
99
100
|
# Analyze code structure
|
100
|
-
from ..analyzers import ComplexityAnalyzer,
|
101
|
+
from ..analyzers import ComplexityAnalyzer, PurposeDetector, QualityAnalyzer
|
101
102
|
code_info = self._analyze_structure(
|
102
103
|
node, content,
|
103
104
|
ComplexityAnalyzer, QualityAnalyzer, PurposeDetector
|
@@ -5,10 +5,11 @@ Simple text chunking with fixed size and overlap.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from typing import List
|
8
|
-
|
9
|
-
from ..context.models import ChunkData
|
10
|
-
from ..context.builders import ChunkContextBuilder
|
8
|
+
|
11
9
|
from ....models.archive import ArchiveItem, ChunkType
|
10
|
+
from ..context.builders import ChunkContextBuilder
|
11
|
+
from ..context.models import ChunkData
|
12
|
+
from .base import BaseChunker
|
12
13
|
|
13
14
|
|
14
15
|
class TextChunker(BaseChunker):
|