django-cfg 1.4.21__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/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.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.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.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,15 +4,15 @@ Archive models for universal document processing.
|
|
4
4
|
Supports any type of compressed document collections with context-aware chunking.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.db import models
|
8
|
-
from pgvector.django import VectorField
|
9
|
-
from typing import Optional, List, Dict, Any
|
10
7
|
import hashlib
|
11
8
|
import mimetypes
|
12
9
|
from pathlib import Path
|
13
|
-
from
|
10
|
+
from typing import Any, Dict, List, Optional
|
11
|
+
|
12
|
+
from django.db import models
|
13
|
+
from pgvector.django import VectorField
|
14
14
|
|
15
|
-
from .base import
|
15
|
+
from .base import ProcessingStatus, UserScopedModel
|
16
16
|
from .document import DocumentCategory
|
17
17
|
|
18
18
|
|
@@ -46,11 +46,11 @@ class ChunkType(models.TextChoices):
|
|
46
46
|
|
47
47
|
class DocumentArchive(UserScopedModel):
|
48
48
|
"""Universal archive entity for any document collection."""
|
49
|
-
|
49
|
+
|
50
50
|
# Custom managers
|
51
51
|
from ..managers.archive import DocumentArchiveManager
|
52
52
|
objects = DocumentArchiveManager()
|
53
|
-
|
53
|
+
|
54
54
|
title = models.CharField(
|
55
55
|
max_length=512,
|
56
56
|
help_text="Archive title"
|
@@ -59,7 +59,7 @@ class DocumentArchive(UserScopedModel):
|
|
59
59
|
blank=True,
|
60
60
|
help_text="Archive description"
|
61
61
|
)
|
62
|
-
|
62
|
+
|
63
63
|
# Categories relationship (reuse existing DocumentCategory)
|
64
64
|
categories = models.ManyToManyField(
|
65
65
|
DocumentCategory,
|
@@ -67,18 +67,18 @@ class DocumentArchive(UserScopedModel):
|
|
67
67
|
related_name='archives',
|
68
68
|
help_text="Archive categories (supports multiple)"
|
69
69
|
)
|
70
|
-
|
70
|
+
|
71
71
|
is_public = models.BooleanField(
|
72
72
|
default=True,
|
73
73
|
help_text="Whether this archive is publicly accessible"
|
74
74
|
)
|
75
|
-
|
75
|
+
|
76
76
|
# Archive file storage
|
77
77
|
archive_file = models.FileField(
|
78
78
|
upload_to='archives/%Y/%m/%d/',
|
79
79
|
help_text="Uploaded archive file"
|
80
80
|
)
|
81
|
-
|
81
|
+
|
82
82
|
# Archive metadata
|
83
83
|
original_filename = models.CharField(
|
84
84
|
max_length=255,
|
@@ -98,7 +98,7 @@ class DocumentArchive(UserScopedModel):
|
|
98
98
|
db_index=True,
|
99
99
|
help_text="SHA-256 hash for duplicate detection"
|
100
100
|
)
|
101
|
-
|
101
|
+
|
102
102
|
# Processing status (synchronous processing)
|
103
103
|
processing_status = models.CharField(
|
104
104
|
max_length=20,
|
@@ -107,12 +107,12 @@ class DocumentArchive(UserScopedModel):
|
|
107
107
|
db_index=True
|
108
108
|
)
|
109
109
|
processed_at = models.DateTimeField(
|
110
|
-
null=True,
|
110
|
+
null=True,
|
111
111
|
blank=True,
|
112
112
|
help_text="When processing completed"
|
113
113
|
)
|
114
114
|
processing_error = models.TextField(
|
115
|
-
blank=True,
|
115
|
+
blank=True,
|
116
116
|
default="",
|
117
117
|
help_text="Error message if processing failed"
|
118
118
|
)
|
@@ -120,7 +120,7 @@ class DocumentArchive(UserScopedModel):
|
|
120
120
|
default=0,
|
121
121
|
help_text="Processing time in milliseconds"
|
122
122
|
)
|
123
|
-
|
123
|
+
|
124
124
|
# Statistics
|
125
125
|
total_items = models.PositiveIntegerField(
|
126
126
|
default=0,
|
@@ -146,7 +146,7 @@ class DocumentArchive(UserScopedModel):
|
|
146
146
|
default=0.0,
|
147
147
|
help_text="Total processing cost in USD"
|
148
148
|
)
|
149
|
-
|
149
|
+
|
150
150
|
# Metadata
|
151
151
|
metadata = models.JSONField(
|
152
152
|
default=dict,
|
@@ -154,7 +154,7 @@ class DocumentArchive(UserScopedModel):
|
|
154
154
|
null=True,
|
155
155
|
help_text="Additional archive metadata"
|
156
156
|
)
|
157
|
-
|
157
|
+
|
158
158
|
class Meta:
|
159
159
|
db_table = 'django_cfg_knowbase_document_archives'
|
160
160
|
indexes = [
|
@@ -172,48 +172,48 @@ class DocumentArchive(UserScopedModel):
|
|
172
172
|
verbose_name = 'Document Archive'
|
173
173
|
verbose_name_plural = 'Document Archives'
|
174
174
|
ordering = ['-created_at']
|
175
|
-
|
175
|
+
|
176
176
|
def save(self, *args, **kwargs):
|
177
177
|
"""Override save to generate content_hash if not provided."""
|
178
178
|
# content_hash will be set by the service when processing file
|
179
179
|
super().save(*args, **kwargs)
|
180
|
-
|
180
|
+
|
181
181
|
def __str__(self) -> str:
|
182
182
|
return f"{self.title} ({self.user.username})"
|
183
|
-
|
183
|
+
|
184
184
|
@property
|
185
185
|
def is_processed(self) -> bool:
|
186
186
|
"""Check if archive processing is completed."""
|
187
187
|
return self.processing_status == ProcessingStatus.COMPLETED
|
188
|
-
|
188
|
+
|
189
189
|
@property
|
190
190
|
def processing_progress(self) -> float:
|
191
191
|
"""Calculate processing progress as percentage."""
|
192
192
|
if self.total_items == 0:
|
193
193
|
return 0.0
|
194
194
|
return (self.processed_items / self.total_items) * 100
|
195
|
-
|
195
|
+
|
196
196
|
@property
|
197
197
|
def vectorization_progress(self) -> float:
|
198
198
|
"""Calculate vectorization progress as percentage."""
|
199
199
|
if self.total_chunks == 0:
|
200
200
|
return 0.0
|
201
201
|
return (self.vectorized_chunks / self.total_chunks) * 100
|
202
|
-
|
202
|
+
|
203
203
|
def get_file_tree(self) -> Dict[str, Any]:
|
204
204
|
"""Build hierarchical file tree structure."""
|
205
205
|
items = self.items.all().order_by('relative_path')
|
206
206
|
tree: Dict[str, Any] = {}
|
207
|
-
|
207
|
+
|
208
208
|
for item in items:
|
209
209
|
parts = item.relative_path.split('/')
|
210
210
|
current = tree
|
211
|
-
|
211
|
+
|
212
212
|
for part in parts[:-1]: # All except filename
|
213
213
|
if part not in current:
|
214
214
|
current[part] = {'type': 'directory', 'children': {}}
|
215
215
|
current = current[part]['children']
|
216
|
-
|
216
|
+
|
217
217
|
# Add file
|
218
218
|
filename = parts[-1]
|
219
219
|
current[filename] = {
|
@@ -225,24 +225,24 @@ class DocumentArchive(UserScopedModel):
|
|
225
225
|
'is_processable': item.is_processable,
|
226
226
|
'chunks_count': item.chunks_count
|
227
227
|
}
|
228
|
-
|
228
|
+
|
229
229
|
return tree
|
230
230
|
|
231
231
|
|
232
232
|
class ArchiveItem(UserScopedModel):
|
233
233
|
"""Individual file/document within archive."""
|
234
|
-
|
234
|
+
|
235
235
|
# Custom managers
|
236
236
|
from ..managers.archive import ArchiveItemManager
|
237
237
|
objects = ArchiveItemManager()
|
238
|
-
|
238
|
+
|
239
239
|
archive = models.ForeignKey(
|
240
240
|
DocumentArchive,
|
241
241
|
on_delete=models.CASCADE,
|
242
242
|
related_name='items',
|
243
243
|
help_text="Parent archive"
|
244
244
|
)
|
245
|
-
|
245
|
+
|
246
246
|
# File metadata
|
247
247
|
relative_path = models.CharField(
|
248
248
|
max_length=1024,
|
@@ -270,7 +270,7 @@ class ArchiveItem(UserScopedModel):
|
|
270
270
|
max_length=64,
|
271
271
|
help_text="SHA-256 hash of item content"
|
272
272
|
)
|
273
|
-
|
273
|
+
|
274
274
|
# Content processing
|
275
275
|
raw_content = models.TextField(
|
276
276
|
blank=True,
|
@@ -280,7 +280,7 @@ class ArchiveItem(UserScopedModel):
|
|
280
280
|
default=False,
|
281
281
|
help_text="Whether item can be processed for chunks"
|
282
282
|
)
|
283
|
-
|
283
|
+
|
284
284
|
# Metadata for context
|
285
285
|
language = models.CharField(
|
286
286
|
max_length=50,
|
@@ -292,7 +292,7 @@ class ArchiveItem(UserScopedModel):
|
|
292
292
|
default='utf-8',
|
293
293
|
help_text="Character encoding"
|
294
294
|
)
|
295
|
-
|
295
|
+
|
296
296
|
# Processing results
|
297
297
|
chunks_count = models.PositiveIntegerField(
|
298
298
|
default=0,
|
@@ -306,7 +306,7 @@ class ArchiveItem(UserScopedModel):
|
|
306
306
|
default=0.0,
|
307
307
|
help_text="Processing cost for this item"
|
308
308
|
)
|
309
|
-
|
309
|
+
|
310
310
|
# Additional metadata
|
311
311
|
metadata = models.JSONField(
|
312
312
|
default=dict,
|
@@ -314,7 +314,7 @@ class ArchiveItem(UserScopedModel):
|
|
314
314
|
null=True,
|
315
315
|
help_text="Item-specific metadata"
|
316
316
|
)
|
317
|
-
|
317
|
+
|
318
318
|
class Meta:
|
319
319
|
db_table = 'django_cfg_knowbase_archive_items'
|
320
320
|
indexes = [
|
@@ -332,29 +332,29 @@ class ArchiveItem(UserScopedModel):
|
|
332
332
|
ordering = ['archive', 'relative_path']
|
333
333
|
verbose_name = 'Archive Item'
|
334
334
|
verbose_name_plural = 'Archive Items'
|
335
|
-
|
335
|
+
|
336
336
|
def save(self, *args, **kwargs):
|
337
337
|
"""Override save to set computed fields."""
|
338
338
|
if self.raw_content and not self.content_hash:
|
339
339
|
self.content_hash = hashlib.sha256(self.raw_content.encode()).hexdigest()
|
340
|
-
|
340
|
+
|
341
341
|
# Detect item type and programming language
|
342
342
|
if not self.item_type:
|
343
343
|
self.item_type, _ = mimetypes.guess_type(self.item_name)
|
344
344
|
if not self.item_type:
|
345
345
|
self.item_type = 'application/octet-stream'
|
346
|
-
|
346
|
+
|
347
347
|
if not self.language:
|
348
348
|
self.language = self.detect_programming_language()
|
349
|
-
|
349
|
+
|
350
350
|
if not self.content_type or self.content_type == ContentType.UNKNOWN:
|
351
351
|
self.content_type = self.detect_content_type()
|
352
|
-
|
352
|
+
|
353
353
|
super().save(*args, **kwargs)
|
354
|
-
|
354
|
+
|
355
355
|
def __str__(self) -> str:
|
356
356
|
return f"{self.relative_path} in {self.archive.title}"
|
357
|
-
|
357
|
+
|
358
358
|
def detect_programming_language(self) -> str:
|
359
359
|
"""Detect programming language from file extension."""
|
360
360
|
LANGUAGE_MAP = {
|
@@ -383,48 +383,48 @@ class ArchiveItem(UserScopedModel):
|
|
383
383
|
'.dockerfile': 'dockerfile',
|
384
384
|
'.tf': 'terraform',
|
385
385
|
}
|
386
|
-
|
386
|
+
|
387
387
|
file_path = Path(self.item_name)
|
388
388
|
extension = file_path.suffix.lower()
|
389
|
-
|
389
|
+
|
390
390
|
# Special cases
|
391
391
|
if file_path.name.lower() in ['dockerfile', 'makefile']:
|
392
392
|
return file_path.name.lower()
|
393
|
-
|
393
|
+
|
394
394
|
return LANGUAGE_MAP.get(extension, '')
|
395
|
-
|
395
|
+
|
396
396
|
def detect_content_type(self) -> str:
|
397
397
|
"""Detect content type from file extension and MIME type."""
|
398
398
|
file_path = Path(self.item_name)
|
399
399
|
extension = file_path.suffix.lower()
|
400
|
-
|
400
|
+
|
401
401
|
# Code files
|
402
402
|
code_extensions = {
|
403
403
|
'.py', '.js', '.ts', '.jsx', '.tsx', '.java', '.go', '.rs',
|
404
404
|
'.cpp', '.c', '.h', '.hpp', '.php', '.rb', '.cs', '.swift',
|
405
405
|
'.kt', '.scala', '.clj', '.hs', '.ml', '.fs', '.elm'
|
406
406
|
}
|
407
|
-
|
407
|
+
|
408
408
|
# Document files
|
409
409
|
document_extensions = {
|
410
410
|
'.md', '.txt', '.rst', '.adoc', '.pdf', '.docx', '.doc'
|
411
411
|
}
|
412
|
-
|
412
|
+
|
413
413
|
# Data files
|
414
414
|
data_extensions = {
|
415
415
|
'.json', '.csv', '.xml', '.yml', '.yaml', '.toml', '.ini'
|
416
416
|
}
|
417
|
-
|
417
|
+
|
418
418
|
# Image files
|
419
419
|
image_extensions = {
|
420
420
|
'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp'
|
421
421
|
}
|
422
|
-
|
422
|
+
|
423
423
|
# Archive files
|
424
424
|
archive_extensions = {
|
425
425
|
'.zip', '.tar', '.gz', '.bz2', '.7z', '.rar'
|
426
426
|
}
|
427
|
-
|
427
|
+
|
428
428
|
if extension in code_extensions:
|
429
429
|
return ContentType.CODE
|
430
430
|
elif extension in document_extensions:
|
@@ -437,17 +437,17 @@ class ArchiveItem(UserScopedModel):
|
|
437
437
|
return ContentType.ARCHIVE
|
438
438
|
else:
|
439
439
|
return ContentType.UNKNOWN
|
440
|
-
|
440
|
+
|
441
441
|
@property
|
442
442
|
def file_extension(self) -> str:
|
443
443
|
"""Get file extension."""
|
444
444
|
return Path(self.item_name).suffix.lower()
|
445
|
-
|
445
|
+
|
446
446
|
@property
|
447
447
|
def is_code_file(self) -> bool:
|
448
448
|
"""Check if item is a code file."""
|
449
449
|
return self.content_type == ContentType.CODE
|
450
|
-
|
450
|
+
|
451
451
|
@property
|
452
452
|
def is_document_file(self) -> bool:
|
453
453
|
"""Check if item is a document file."""
|
@@ -456,11 +456,11 @@ class ArchiveItem(UserScopedModel):
|
|
456
456
|
|
457
457
|
class ArchiveItemChunk(UserScopedModel):
|
458
458
|
"""Context-aware chunk with rich parent references."""
|
459
|
-
|
459
|
+
|
460
460
|
# Custom managers
|
461
461
|
from ..managers.archive import ArchiveItemChunkManager
|
462
462
|
objects = ArchiveItemChunkManager()
|
463
|
-
|
463
|
+
|
464
464
|
# Parent references
|
465
465
|
archive = models.ForeignKey(
|
466
466
|
DocumentArchive,
|
@@ -474,7 +474,7 @@ class ArchiveItemChunk(UserScopedModel):
|
|
474
474
|
related_name='chunks',
|
475
475
|
help_text="Parent item"
|
476
476
|
)
|
477
|
-
|
477
|
+
|
478
478
|
# Chunk content
|
479
479
|
content = models.TextField(
|
480
480
|
help_text="Chunk text content"
|
@@ -488,20 +488,20 @@ class ArchiveItemChunk(UserScopedModel):
|
|
488
488
|
default=ChunkType.TEXT,
|
489
489
|
help_text="Type of content in chunk"
|
490
490
|
)
|
491
|
-
|
491
|
+
|
492
492
|
# Context preservation - rich metadata for AI understanding
|
493
493
|
context_metadata = models.JSONField(
|
494
494
|
default=dict,
|
495
495
|
help_text="Rich context information for AI processing"
|
496
496
|
)
|
497
|
-
|
497
|
+
|
498
498
|
# Vector embedding (1536 dimensions for OpenAI text-embedding-ada-002)
|
499
499
|
embedding = VectorField(
|
500
500
|
dimensions=1536,
|
501
501
|
null=True,
|
502
502
|
help_text="Vector embedding for semantic search"
|
503
503
|
)
|
504
|
-
|
504
|
+
|
505
505
|
# Chunk statistics
|
506
506
|
token_count = models.PositiveIntegerField(
|
507
507
|
default=0,
|
@@ -511,7 +511,7 @@ class ArchiveItemChunk(UserScopedModel):
|
|
511
511
|
default=0,
|
512
512
|
help_text="Number of characters in chunk"
|
513
513
|
)
|
514
|
-
|
514
|
+
|
515
515
|
# Processing metadata
|
516
516
|
embedding_model = models.CharField(
|
517
517
|
max_length=100,
|
@@ -522,7 +522,7 @@ class ArchiveItemChunk(UserScopedModel):
|
|
522
522
|
default=0.0,
|
523
523
|
help_text="Cost in USD for embedding generation"
|
524
524
|
)
|
525
|
-
|
525
|
+
|
526
526
|
class Meta:
|
527
527
|
db_table = 'django_cfg_knowbase_archive_item_chunks'
|
528
528
|
indexes = [
|
@@ -540,17 +540,17 @@ class ArchiveItemChunk(UserScopedModel):
|
|
540
540
|
ordering = ['item', 'chunk_index']
|
541
541
|
verbose_name = 'Archive Item Chunk'
|
542
542
|
verbose_name_plural = 'Archive Item Chunks'
|
543
|
-
|
543
|
+
|
544
544
|
def save(self, *args, **kwargs):
|
545
545
|
"""Override save to set computed fields."""
|
546
546
|
if self.content and not self.character_count:
|
547
547
|
self.character_count = len(self.content)
|
548
|
-
|
548
|
+
|
549
549
|
super().save(*args, **kwargs)
|
550
|
-
|
550
|
+
|
551
551
|
def __str__(self) -> str:
|
552
552
|
return f"Chunk {self.chunk_index} of {self.item.relative_path}"
|
553
|
-
|
553
|
+
|
554
554
|
@classmethod
|
555
555
|
def semantic_search(
|
556
556
|
cls,
|
@@ -563,30 +563,30 @@ class ArchiveItemChunk(UserScopedModel):
|
|
563
563
|
):
|
564
564
|
"""Perform semantic search using pgvector with context filtering."""
|
565
565
|
from pgvector.django import CosineDistance
|
566
|
-
|
566
|
+
|
567
567
|
queryset = cls.objects.filter(
|
568
568
|
user=user,
|
569
569
|
embedding__isnull=False
|
570
570
|
)
|
571
|
-
|
571
|
+
|
572
572
|
# Apply content type filter
|
573
573
|
if content_types:
|
574
574
|
queryset = queryset.filter(
|
575
575
|
item__content_type__in=content_types
|
576
576
|
)
|
577
|
-
|
577
|
+
|
578
578
|
# Apply language filter
|
579
579
|
if languages:
|
580
580
|
queryset = queryset.filter(
|
581
581
|
item__language__in=languages
|
582
582
|
)
|
583
|
-
|
583
|
+
|
584
584
|
return queryset.annotate(
|
585
585
|
similarity=1 - CosineDistance('embedding', query_embedding)
|
586
586
|
).filter(
|
587
587
|
similarity__gte=similarity_threshold
|
588
588
|
).order_by('-similarity')[:limit]
|
589
|
-
|
589
|
+
|
590
590
|
def get_context_summary(self) -> Dict[str, Any]:
|
591
591
|
"""Get summary of chunk context for display."""
|
592
592
|
return {
|
@@ -2,12 +2,11 @@
|
|
2
2
|
Base models for knowledge base application.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from django.db import models
|
6
|
-
from django.contrib.auth import get_user_model
|
7
|
-
from django.conf import settings
|
8
|
-
from enum import Enum
|
9
5
|
import uuid
|
10
6
|
|
7
|
+
from django.conf import settings
|
8
|
+
from django.db import models
|
9
|
+
|
11
10
|
|
12
11
|
class ProcessingStatus(models.TextChoices):
|
13
12
|
"""Document processing status enumeration."""
|
@@ -20,21 +19,21 @@ class ProcessingStatus(models.TextChoices):
|
|
20
19
|
|
21
20
|
class TimestampedModel(models.Model):
|
22
21
|
"""Base model with automatic timestamps."""
|
23
|
-
|
22
|
+
|
24
23
|
id = models.UUIDField(
|
25
|
-
primary_key=True,
|
26
|
-
default=uuid.uuid4,
|
24
|
+
primary_key=True,
|
25
|
+
default=uuid.uuid4,
|
27
26
|
editable=False
|
28
27
|
)
|
29
28
|
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
|
30
29
|
updated_at = models.DateTimeField(auto_now=True)
|
31
|
-
|
30
|
+
|
32
31
|
class Meta:
|
33
32
|
abstract = True
|
34
33
|
indexes = [
|
35
34
|
models.Index(fields=['-created_at']),
|
36
35
|
]
|
37
|
-
|
36
|
+
|
38
37
|
@property
|
39
38
|
def short_uuid(self) -> str:
|
40
39
|
"""Return first 6 characters of UUID for display."""
|
@@ -43,14 +42,14 @@ class TimestampedModel(models.Model):
|
|
43
42
|
|
44
43
|
class UserScopedModel(TimestampedModel):
|
45
44
|
"""Base model with user isolation."""
|
46
|
-
|
45
|
+
|
47
46
|
user = models.ForeignKey(
|
48
|
-
settings.AUTH_USER_MODEL,
|
49
|
-
on_delete=models.CASCADE,
|
47
|
+
settings.AUTH_USER_MODEL,
|
48
|
+
on_delete=models.CASCADE,
|
50
49
|
db_index=True,
|
51
50
|
help_text="Owner of this record"
|
52
51
|
)
|
53
|
-
|
52
|
+
|
54
53
|
class Meta:
|
55
54
|
abstract = True
|
56
55
|
indexes = [
|
@@ -3,16 +3,17 @@ Chat models for RAG-powered conversations.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
from django.db import models
|
6
|
+
|
6
7
|
from .base import UserScopedModel
|
7
8
|
|
8
9
|
|
9
10
|
class ChatSession(UserScopedModel):
|
10
11
|
"""User chat session for conversation tracking."""
|
11
|
-
|
12
|
+
|
12
13
|
# Custom managers
|
13
14
|
from ..managers.chat import ChatSessionManager
|
14
15
|
objects = ChatSessionManager()
|
15
|
-
|
16
|
+
|
16
17
|
title = models.CharField(
|
17
18
|
max_length=255,
|
18
19
|
blank=True,
|
@@ -22,7 +23,7 @@ class ChatSession(UserScopedModel):
|
|
22
23
|
default=True,
|
23
24
|
help_text="Whether session accepts new messages"
|
24
25
|
)
|
25
|
-
|
26
|
+
|
26
27
|
# Session statistics
|
27
28
|
messages_count = models.PositiveIntegerField(default=0)
|
28
29
|
total_tokens_used = models.PositiveIntegerField(default=0)
|
@@ -30,7 +31,7 @@ class ChatSession(UserScopedModel):
|
|
30
31
|
default=0.0,
|
31
32
|
help_text="Total session cost for monitoring"
|
32
33
|
)
|
33
|
-
|
34
|
+
|
34
35
|
# Configuration
|
35
36
|
model_name = models.CharField(
|
36
37
|
max_length=100,
|
@@ -45,17 +46,17 @@ class ChatSession(UserScopedModel):
|
|
45
46
|
default=5,
|
46
47
|
help_text="Maximum chunks to include in context"
|
47
48
|
)
|
48
|
-
|
49
|
+
|
49
50
|
class Meta:
|
50
51
|
db_table = 'django_cfg_knowbase_chat_sessions'
|
51
52
|
indexes = [
|
52
53
|
models.Index(fields=['user', '-created_at']),
|
53
54
|
models.Index(fields=['is_active']),
|
54
55
|
]
|
55
|
-
|
56
|
+
|
56
57
|
def __str__(self) -> str:
|
57
58
|
return self.title or f"Session {self.id}"
|
58
|
-
|
59
|
+
|
59
60
|
def generate_title_if_empty(self) -> None:
|
60
61
|
"""Auto-generate title based on first message."""
|
61
62
|
if not self.title and self.messages.exists():
|
@@ -66,17 +67,17 @@ class ChatSession(UserScopedModel):
|
|
66
67
|
# Take first 50 characters as title
|
67
68
|
self.title = first_message.content[:50] + "..."
|
68
69
|
self.save(update_fields=['title'])
|
69
|
-
|
70
|
+
|
70
71
|
def archive(self) -> None:
|
71
72
|
"""Archive (deactivate) this session."""
|
72
73
|
self.is_active = False
|
73
74
|
self.save(update_fields=['is_active'])
|
74
|
-
|
75
|
+
|
75
76
|
def activate(self) -> None:
|
76
77
|
"""Activate this session."""
|
77
78
|
self.is_active = True
|
78
79
|
self.save(update_fields=['is_active'])
|
79
|
-
|
80
|
+
|
80
81
|
@property
|
81
82
|
def is_archived(self) -> bool:
|
82
83
|
"""Check if session is archived."""
|
@@ -85,23 +86,23 @@ class ChatSession(UserScopedModel):
|
|
85
86
|
|
86
87
|
class ChatMessage(UserScopedModel):
|
87
88
|
"""Individual chat message with context tracking."""
|
88
|
-
|
89
|
+
|
89
90
|
# Custom managers
|
90
91
|
from ..managers.chat import ChatMessageManager
|
91
92
|
objects = ChatMessageManager()
|
92
|
-
|
93
|
+
|
93
94
|
class MessageRole(models.TextChoices):
|
94
95
|
USER = 'user', 'User'
|
95
96
|
ASSISTANT = 'assistant', 'Assistant'
|
96
97
|
SYSTEM = 'system', 'System'
|
97
|
-
|
98
|
+
|
98
99
|
session = models.ForeignKey(
|
99
100
|
ChatSession,
|
100
101
|
on_delete=models.CASCADE,
|
101
102
|
related_name='messages',
|
102
103
|
help_text="Parent chat session"
|
103
104
|
)
|
104
|
-
|
105
|
+
|
105
106
|
role = models.CharField(
|
106
107
|
max_length=10,
|
107
108
|
choices=MessageRole.choices,
|
@@ -110,13 +111,13 @@ class ChatMessage(UserScopedModel):
|
|
110
111
|
content = models.TextField(
|
111
112
|
help_text="Message content"
|
112
113
|
)
|
113
|
-
|
114
|
+
|
114
115
|
# Context tracking
|
115
116
|
context_chunks = models.JSONField(
|
116
117
|
default=list,
|
117
118
|
help_text="IDs of chunks used for context"
|
118
119
|
)
|
119
|
-
|
120
|
+
|
120
121
|
# Usage tracking (for monitoring, not billing)
|
121
122
|
tokens_used = models.PositiveIntegerField(
|
122
123
|
default=0,
|
@@ -130,7 +131,7 @@ class ChatMessage(UserScopedModel):
|
|
130
131
|
default=0,
|
131
132
|
help_text="Processing time in milliseconds"
|
132
133
|
)
|
133
|
-
|
134
|
+
|
134
135
|
# Response metadata
|
135
136
|
model_name = models.CharField(
|
136
137
|
max_length=100,
|
@@ -142,7 +143,7 @@ class ChatMessage(UserScopedModel):
|
|
142
143
|
blank=True,
|
143
144
|
help_text="Why the model stopped generating"
|
144
145
|
)
|
145
|
-
|
146
|
+
|
146
147
|
class Meta:
|
147
148
|
db_table = 'django_cfg_knowbase_chat_messages'
|
148
149
|
indexes = [
|
@@ -151,7 +152,7 @@ class ChatMessage(UserScopedModel):
|
|
151
152
|
models.Index(fields=['-created_at']),
|
152
153
|
]
|
153
154
|
ordering = ['created_at']
|
154
|
-
|
155
|
+
|
155
156
|
def __str__(self) -> str:
|
156
157
|
preview = self.content[:50] + "..." if len(self.content) > 50 else self.content
|
157
158
|
return f"{self.role}: {preview}"
|