django-cfg 1.4.21__py3-none-any.whl → 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -5,39 +5,37 @@ Enhanced external data management with Material Icons and optimized queries.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.contrib import admin, messages
|
8
|
-
from django.urls import reverse
|
9
|
-
from django.utils.http import urlencode
|
10
|
-
from django.shortcuts import redirect
|
11
8
|
from django.db import models
|
12
|
-
from django.db.models import Count,
|
9
|
+
from django.db.models import Count, Q, Sum
|
13
10
|
from django.db.models.fields.json import JSONField
|
14
|
-
from django.utils import timezone
|
15
|
-
from django import forms
|
16
11
|
from django_json_widget.widgets import JSONEditorWidget
|
17
12
|
from unfold.admin import ModelAdmin, TabularInline
|
18
|
-
from unfold.contrib.filters.admin import AutocompleteSelectFilter
|
13
|
+
from unfold.contrib.filters.admin import AutocompleteSelectFilter
|
19
14
|
from unfold.contrib.forms.widgets import WysiwygWidget
|
20
|
-
from django_cfg import ExportMixin
|
21
15
|
|
16
|
+
from django_cfg import ExportMixin
|
22
17
|
from django_cfg.modules.django_admin import (
|
23
|
-
|
18
|
+
ActionVariant,
|
19
|
+
DateTimeDisplayConfig,
|
24
20
|
DisplayMixin,
|
21
|
+
Icons,
|
25
22
|
MoneyDisplayConfig,
|
23
|
+
OptimizedModelAdmin,
|
26
24
|
StatusBadgeConfig,
|
27
|
-
|
28
|
-
Icons,
|
29
|
-
ActionVariant,
|
25
|
+
action,
|
30
26
|
display,
|
31
|
-
action
|
32
27
|
)
|
33
28
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
34
29
|
|
35
|
-
from ..models.external_data import
|
30
|
+
from ..models.external_data import (
|
31
|
+
ExternalData,
|
32
|
+
ExternalDataChunk,
|
33
|
+
)
|
36
34
|
|
37
35
|
|
38
36
|
class ExternalDataChunkInline(TabularInline):
|
39
37
|
"""Inline for external data chunks with Unfold styling."""
|
40
|
-
|
38
|
+
|
41
39
|
model = ExternalDataChunk
|
42
40
|
verbose_name = "External Data Chunk"
|
43
41
|
verbose_name_plural = "🔗 External Data Chunks (Read-only)"
|
@@ -45,40 +43,40 @@ class ExternalDataChunkInline(TabularInline):
|
|
45
43
|
max_num = 0
|
46
44
|
can_delete = False
|
47
45
|
show_change_link = True
|
48
|
-
|
46
|
+
|
49
47
|
def has_add_permission(self, request, obj=None):
|
50
48
|
return False
|
51
|
-
|
49
|
+
|
52
50
|
def has_change_permission(self, request, obj=None):
|
53
51
|
return False
|
54
|
-
|
52
|
+
|
55
53
|
def has_delete_permission(self, request, obj=None):
|
56
54
|
return False
|
57
|
-
|
55
|
+
|
58
56
|
fields = [
|
59
|
-
'short_uuid', 'chunk_index', 'content_preview_inline', 'token_count',
|
57
|
+
'short_uuid', 'chunk_index', 'content_preview_inline', 'token_count',
|
60
58
|
'has_embedding_inline', 'embedding_cost'
|
61
59
|
]
|
62
60
|
readonly_fields = [
|
63
61
|
'short_uuid', 'chunk_index', 'content_preview_inline', 'token_count', 'character_count',
|
64
62
|
'has_embedding_inline', 'embedding_cost', 'created_at'
|
65
63
|
]
|
66
|
-
|
64
|
+
|
67
65
|
hide_title = False
|
68
66
|
classes = ['collapse']
|
69
|
-
|
67
|
+
|
70
68
|
@display(description="Content Preview")
|
71
69
|
def content_preview_inline(self, obj):
|
72
70
|
"""Shortened content preview for inline display."""
|
73
71
|
if not obj.content:
|
74
72
|
return "—"
|
75
73
|
return obj.content[:100] + "..." if len(obj.content) > 100 else obj.content
|
76
|
-
|
74
|
+
|
77
75
|
@display(description="Has Embedding", boolean=True)
|
78
76
|
def has_embedding_inline(self, obj):
|
79
77
|
"""Check if chunk has embedding vector for inline."""
|
80
78
|
return obj.embedding is not None and len(obj.embedding) > 0
|
81
|
-
|
79
|
+
|
82
80
|
def get_queryset(self, request):
|
83
81
|
"""Optimize queryset for inline display."""
|
84
82
|
return super().get_queryset(request).select_related('external_data', 'user')
|
@@ -87,10 +85,10 @@ class ExternalDataChunkInline(TabularInline):
|
|
87
85
|
@admin.register(ExternalData)
|
88
86
|
class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
89
87
|
"""Admin interface for ExternalData model using Django Admin Utilities."""
|
90
|
-
|
88
|
+
|
91
89
|
# Performance optimization
|
92
90
|
select_related_fields = ['user', 'category']
|
93
|
-
|
91
|
+
|
94
92
|
list_display = [
|
95
93
|
'title_display', 'source_type_display', 'source_identifier_display', 'user_display',
|
96
94
|
'status_display', 'chunks_count_display', 'tokens_display', 'cost_display',
|
@@ -113,7 +111,7 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
113
111
|
'total_chunks', 'total_tokens', 'processing_cost',
|
114
112
|
'created_at', 'updated_at'
|
115
113
|
]
|
116
|
-
|
114
|
+
|
117
115
|
fieldsets = (
|
118
116
|
('🔗 External Data Info', {
|
119
117
|
'fields': ('id', 'title', 'description', 'user', 'category'),
|
@@ -140,39 +138,39 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
140
138
|
'classes': ('tab', 'collapse')
|
141
139
|
})
|
142
140
|
)
|
143
|
-
|
141
|
+
|
144
142
|
# Unfold configuration
|
145
143
|
compressed_fields = True
|
146
144
|
warn_unsaved_form = True
|
147
|
-
|
145
|
+
|
148
146
|
# Form field overrides
|
149
147
|
formfield_overrides = {
|
150
148
|
models.TextField: {"widget": WysiwygWidget},
|
151
149
|
JSONField: {"widget": JSONEditorWidget}
|
152
150
|
}
|
153
|
-
|
151
|
+
|
154
152
|
actions = ['reprocess_data', 'activate_data', 'deactivate_data', 'mark_as_public', 'mark_as_private']
|
155
|
-
|
153
|
+
|
156
154
|
@display(description="Title", ordering="title")
|
157
155
|
def title_display(self, obj):
|
158
156
|
"""Display external data title."""
|
159
157
|
title = obj.title or "Untitled External Data"
|
160
158
|
if len(title) > 50:
|
161
159
|
title = title[:47] + "..."
|
162
|
-
|
160
|
+
|
163
161
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.CLOUD)
|
164
162
|
return StatusBadge.create(
|
165
163
|
text=title,
|
166
164
|
variant="primary",
|
167
165
|
config=config
|
168
166
|
)
|
169
|
-
|
167
|
+
|
170
168
|
@display(description="Source Type")
|
171
169
|
def source_type_display(self, obj):
|
172
170
|
"""Display source type with badge."""
|
173
171
|
if not obj.source_type:
|
174
172
|
return "—"
|
175
|
-
|
173
|
+
|
176
174
|
type_variants = {
|
177
175
|
'api': 'info',
|
178
176
|
'webhook': 'success',
|
@@ -180,7 +178,7 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
180
178
|
'file': 'secondary'
|
181
179
|
}
|
182
180
|
variant = type_variants.get(obj.source_type.lower(), 'secondary')
|
183
|
-
|
181
|
+
|
184
182
|
type_icons = {
|
185
183
|
'api': Icons.API,
|
186
184
|
'webhook': Icons.WEBHOOK,
|
@@ -188,33 +186,33 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
188
186
|
'file': Icons.INSERT_DRIVE_FILE
|
189
187
|
}
|
190
188
|
icon = type_icons.get(obj.source_type.lower(), Icons.CLOUD)
|
191
|
-
|
189
|
+
|
192
190
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
193
191
|
return StatusBadge.create(
|
194
192
|
text=obj.source_type.upper(),
|
195
193
|
variant=variant,
|
196
194
|
config=config
|
197
195
|
)
|
198
|
-
|
196
|
+
|
199
197
|
@display(description="Source ID", ordering="source_identifier")
|
200
198
|
def source_identifier_display(self, obj):
|
201
199
|
"""Display source identifier with truncation."""
|
202
200
|
if not obj.source_identifier:
|
203
201
|
return "—"
|
204
|
-
|
202
|
+
|
205
203
|
identifier = obj.source_identifier
|
206
204
|
if len(identifier) > 30:
|
207
205
|
identifier = identifier[:27] + "..."
|
208
|
-
|
206
|
+
|
209
207
|
return identifier
|
210
|
-
|
208
|
+
|
211
209
|
@display(description="User")
|
212
210
|
def user_display(self, obj):
|
213
211
|
"""User display."""
|
214
212
|
if not obj.user:
|
215
213
|
return "—"
|
216
214
|
return self.display_user_simple(obj.user)
|
217
|
-
|
215
|
+
|
218
216
|
@display(description="Status")
|
219
217
|
def status_display(self, obj):
|
220
218
|
"""Display processing status."""
|
@@ -230,13 +228,13 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
230
228
|
icon=Icons.CHECK_CIRCLE if obj.status == 'completed' else Icons.ERROR if obj.status == 'failed' else Icons.SCHEDULE
|
231
229
|
)
|
232
230
|
return self.display_status_auto(obj, 'status', status_config)
|
233
|
-
|
231
|
+
|
234
232
|
@display(description="Chunks", ordering="chunks_count")
|
235
233
|
def chunks_count_display(self, obj):
|
236
234
|
"""Display chunks count."""
|
237
235
|
count = obj.chunks_count or 0
|
238
236
|
return f"{count} chunks"
|
239
|
-
|
237
|
+
|
240
238
|
@display(description="Tokens", ordering="total_tokens")
|
241
239
|
def tokens_display(self, obj):
|
242
240
|
"""Display token count with formatting."""
|
@@ -244,7 +242,7 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
244
242
|
if tokens > 1000:
|
245
243
|
return f"{tokens/1000:.1f}K"
|
246
244
|
return str(tokens)
|
247
|
-
|
245
|
+
|
248
246
|
@display(description="Cost (USD)", ordering="processing_cost")
|
249
247
|
def cost_display(self, obj):
|
250
248
|
"""Display cost with currency formatting."""
|
@@ -254,7 +252,7 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
254
252
|
show_sign=False
|
255
253
|
)
|
256
254
|
return self.display_money_amount(obj, 'processing_cost', config)
|
257
|
-
|
255
|
+
|
258
256
|
@display(description="Visibility")
|
259
257
|
def visibility_display(self, obj):
|
260
258
|
"""Display visibility status."""
|
@@ -264,7 +262,7 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
264
262
|
else:
|
265
263
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.LOCK)
|
266
264
|
return StatusBadge.create(text="Private", variant="danger", config=config)
|
267
|
-
|
265
|
+
|
268
266
|
@display(description="Processed", ordering="processed_at")
|
269
267
|
def processed_at_display(self, obj):
|
270
268
|
"""Processed time with relative display."""
|
@@ -272,47 +270,47 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
272
270
|
return "—"
|
273
271
|
config = DateTimeDisplayConfig(show_relative=True)
|
274
272
|
return self.display_datetime_relative(obj, 'processed_at', config)
|
275
|
-
|
273
|
+
|
276
274
|
@display(description="Created")
|
277
275
|
def created_at_display(self, obj):
|
278
276
|
"""Created time with relative display."""
|
279
277
|
config = DateTimeDisplayConfig(show_relative=True)
|
280
278
|
return self.display_datetime_relative(obj, 'created_at', config)
|
281
|
-
|
279
|
+
|
282
280
|
@action(description="Reprocess data", variant=ActionVariant.INFO)
|
283
281
|
def reprocess_data(self, request, queryset):
|
284
282
|
"""Reprocess selected external data."""
|
285
283
|
count = queryset.count()
|
286
284
|
messages.info(request, f"Reprocess functionality not implemented yet. {count} items selected.")
|
287
|
-
|
285
|
+
|
288
286
|
@action(description="Activate data", variant=ActionVariant.SUCCESS)
|
289
287
|
def activate_data(self, request, queryset):
|
290
288
|
"""Activate selected external data."""
|
291
289
|
updated = queryset.update(is_active=True)
|
292
290
|
messages.success(request, f"Activated {updated} external data items.")
|
293
|
-
|
291
|
+
|
294
292
|
@action(description="Deactivate data", variant=ActionVariant.WARNING)
|
295
293
|
def deactivate_data(self, request, queryset):
|
296
294
|
"""Deactivate selected external data."""
|
297
295
|
updated = queryset.update(is_active=False)
|
298
296
|
messages.warning(request, f"Deactivated {updated} external data items.")
|
299
|
-
|
297
|
+
|
300
298
|
@action(description="Mark as public", variant=ActionVariant.SUCCESS)
|
301
299
|
def mark_as_public(self, request, queryset):
|
302
300
|
"""Mark selected data as public."""
|
303
301
|
updated = queryset.update(is_public=True)
|
304
302
|
messages.success(request, f"Marked {updated} items as public.")
|
305
|
-
|
303
|
+
|
306
304
|
@action(description="Mark as private", variant=ActionVariant.WARNING)
|
307
305
|
def mark_as_private(self, request, queryset):
|
308
306
|
"""Mark selected data as private."""
|
309
307
|
updated = queryset.update(is_public=False)
|
310
308
|
messages.warning(request, f"Marked {updated} items as private.")
|
311
|
-
|
309
|
+
|
312
310
|
def changelist_view(self, request, extra_context=None):
|
313
311
|
"""Add external data statistics to changelist."""
|
314
312
|
extra_context = extra_context or {}
|
315
|
-
|
313
|
+
|
316
314
|
queryset = self.get_queryset(request)
|
317
315
|
stats = queryset.aggregate(
|
318
316
|
total_items=Count('id'),
|
@@ -322,14 +320,14 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
322
320
|
total_tokens=Sum('total_tokens'),
|
323
321
|
total_cost=Sum('processing_cost')
|
324
322
|
)
|
325
|
-
|
323
|
+
|
326
324
|
# Source type breakdown
|
327
325
|
source_type_counts = dict(
|
328
326
|
queryset.values_list('source_type').annotate(
|
329
327
|
count=Count('id')
|
330
328
|
)
|
331
329
|
)
|
332
|
-
|
330
|
+
|
333
331
|
extra_context['external_data_stats'] = {
|
334
332
|
'total_items': stats['total_items'] or 0,
|
335
333
|
'active_items': stats['active_items'] or 0,
|
@@ -339,17 +337,17 @@ class ExternalDataAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMix
|
|
339
337
|
'total_cost': f"${(stats['total_cost'] or 0):.6f}",
|
340
338
|
'source_type_counts': source_type_counts
|
341
339
|
}
|
342
|
-
|
340
|
+
|
343
341
|
return super().changelist_view(request, extra_context)
|
344
342
|
|
345
343
|
|
346
344
|
@admin.register(ExternalDataChunk)
|
347
345
|
class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
348
346
|
"""Admin interface for ExternalDataChunk model using Django Admin Utilities."""
|
349
|
-
|
347
|
+
|
350
348
|
# Performance optimization
|
351
349
|
select_related_fields = ['external_data', 'user']
|
352
|
-
|
350
|
+
|
353
351
|
list_display = [
|
354
352
|
'chunk_display', 'external_data_display', 'user_display', 'token_count_display',
|
355
353
|
'embedding_status', 'embedding_cost_display', 'created_at_display'
|
@@ -367,7 +365,7 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
367
365
|
'id', 'token_count', 'character_count', 'embedding_cost',
|
368
366
|
'created_at', 'updated_at', 'content_preview'
|
369
367
|
]
|
370
|
-
|
368
|
+
|
371
369
|
fieldsets = (
|
372
370
|
('🔗 Chunk Info', {
|
373
371
|
'fields': ('id', 'external_data', 'user', 'chunk_index'),
|
@@ -390,9 +388,9 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
390
388
|
'classes': ('tab', 'collapse')
|
391
389
|
})
|
392
390
|
)
|
393
|
-
|
391
|
+
|
394
392
|
actions = ['regenerate_embeddings', 'clear_embeddings']
|
395
|
-
|
393
|
+
|
396
394
|
@display(description="Chunk", ordering="chunk_index")
|
397
395
|
def chunk_display(self, obj):
|
398
396
|
"""Display chunk identifier."""
|
@@ -402,19 +400,19 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
402
400
|
variant="info",
|
403
401
|
config=config
|
404
402
|
)
|
405
|
-
|
403
|
+
|
406
404
|
@display(description="External Data", ordering="external_data__title")
|
407
405
|
def external_data_display(self, obj):
|
408
406
|
"""Display external data title."""
|
409
407
|
return obj.external_data.title or "Untitled External Data"
|
410
|
-
|
408
|
+
|
411
409
|
@display(description="User")
|
412
410
|
def user_display(self, obj):
|
413
411
|
"""User display."""
|
414
412
|
if not obj.user:
|
415
413
|
return "—"
|
416
414
|
return self.display_user_simple(obj.user)
|
417
|
-
|
415
|
+
|
418
416
|
@display(description="Tokens", ordering="token_count")
|
419
417
|
def token_count_display(self, obj):
|
420
418
|
"""Display token count with formatting."""
|
@@ -422,7 +420,7 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
422
420
|
if tokens > 1000:
|
423
421
|
return f"{tokens/1000:.1f}K"
|
424
422
|
return str(tokens)
|
425
|
-
|
423
|
+
|
426
424
|
@display(description="Embedding")
|
427
425
|
def embedding_status(self, obj):
|
428
426
|
"""Display embedding status."""
|
@@ -433,7 +431,7 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
433
431
|
else:
|
434
432
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ERROR)
|
435
433
|
return StatusBadge.create(text="✗ Not vectorized", variant="danger", config=config)
|
436
|
-
|
434
|
+
|
437
435
|
@display(description="Cost (USD)", ordering="embedding_cost")
|
438
436
|
def embedding_cost_display(self, obj):
|
439
437
|
"""Display embedding cost with currency formatting."""
|
@@ -443,24 +441,24 @@ class ExternalDataChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expo
|
|
443
441
|
show_sign=False
|
444
442
|
)
|
445
443
|
return self.display_money_amount(obj, 'embedding_cost', config)
|
446
|
-
|
444
|
+
|
447
445
|
@display(description="Created")
|
448
446
|
def created_at_display(self, obj):
|
449
447
|
"""Created time with relative display."""
|
450
448
|
config = DateTimeDisplayConfig(show_relative=True)
|
451
449
|
return self.display_datetime_relative(obj, 'created_at', config)
|
452
|
-
|
450
|
+
|
453
451
|
@display(description="Content Preview")
|
454
452
|
def content_preview(self, obj):
|
455
453
|
"""Display content preview with truncation."""
|
456
454
|
return obj.content[:200] + "..." if len(obj.content) > 200 else obj.content
|
457
|
-
|
455
|
+
|
458
456
|
@action(description="Regenerate embeddings", variant=ActionVariant.INFO)
|
459
457
|
def regenerate_embeddings(self, request, queryset):
|
460
458
|
"""Regenerate embeddings for selected chunks."""
|
461
459
|
count = queryset.count()
|
462
460
|
messages.info(request, f"Regenerate embeddings functionality not implemented yet. {count} chunks selected.")
|
463
|
-
|
461
|
+
|
464
462
|
@action(description="Clear embeddings", variant=ActionVariant.WARNING)
|
465
463
|
def clear_embeddings(self, request, queryset):
|
466
464
|
"""Clear embeddings for selected chunks."""
|
@@ -6,7 +6,7 @@ Provides shared display methods, configurations, and utilities.
|
|
6
6
|
|
7
7
|
from .configs import DocumentAdminConfigs
|
8
8
|
from .display_helpers import DocumentDisplayHelpers
|
9
|
-
from .statistics import
|
9
|
+
from .statistics import CategoryStatistics, ChunkStatistics, DocumentStatistics
|
10
10
|
|
11
11
|
__all__ = [
|
12
12
|
'DocumentAdminConfigs',
|
@@ -4,7 +4,7 @@ Statistics calculation for document admin changelist views.
|
|
4
4
|
Provides reusable statistics aggregation logic for admin interfaces.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.db.models import
|
7
|
+
from django.db.models import Avg, Count, Q, Sum
|
8
8
|
|
9
9
|
|
10
10
|
class DocumentStatistics:
|
django_cfg/apps/knowbase/apps.py
CHANGED
@@ -8,20 +8,19 @@ from django.db.models.signals import post_migrate
|
|
8
8
|
|
9
9
|
class KnowbaseConfig(AppConfig):
|
10
10
|
"""Knowledge Base application configuration."""
|
11
|
-
|
11
|
+
|
12
12
|
default_auto_field = 'django.db.models.BigAutoField'
|
13
13
|
name = 'django_cfg.apps.knowbase'
|
14
14
|
label = 'django_cfg_knowbase'
|
15
15
|
verbose_name = 'Django CFG Knowledge Base'
|
16
|
-
|
16
|
+
|
17
17
|
def ready(self):
|
18
18
|
"""Initialize app when Django starts."""
|
19
19
|
# Import signals to register them
|
20
|
-
|
21
|
-
|
20
|
+
|
22
21
|
# Connect post-migrate signal for database setup
|
23
22
|
post_migrate.connect(self.create_pgvector_extension, sender=self)
|
24
|
-
|
23
|
+
|
25
24
|
# Initialize task system and auto-start worker if configured
|
26
25
|
try:
|
27
26
|
from django_cfg.modules.django_tasks import initialize_task_system
|
@@ -30,20 +29,21 @@ class KnowbaseConfig(AppConfig):
|
|
30
29
|
import logging
|
31
30
|
logger = logging.getLogger(__name__)
|
32
31
|
logger.warning(f"Failed to initialize task system: {e}")
|
33
|
-
|
32
|
+
|
34
33
|
def create_pgvector_extension(self, sender, **kwargs):
|
35
34
|
"""Create pgvector extension and indexes if they don't exist."""
|
36
|
-
from django.db import connection
|
37
35
|
import logging
|
36
|
+
|
37
|
+
from django.db import connection
|
38
38
|
logger = logging.getLogger(__name__)
|
39
|
-
|
39
|
+
|
40
40
|
try:
|
41
41
|
with connection.cursor() as cursor:
|
42
42
|
# Create extensions
|
43
43
|
cursor.execute("CREATE EXTENSION IF NOT EXISTS vector;")
|
44
44
|
cursor.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm;") # For text search
|
45
45
|
logger.info("✅ pgvector extensions created/verified")
|
46
|
-
|
46
|
+
|
47
47
|
# Create vector index for cosine similarity if table exists
|
48
48
|
cursor.execute("""
|
49
49
|
SELECT EXISTS (
|
@@ -52,7 +52,7 @@ class KnowbaseConfig(AppConfig):
|
|
52
52
|
);
|
53
53
|
""")
|
54
54
|
table_exists = cursor.fetchone()[0]
|
55
|
-
|
55
|
+
|
56
56
|
if table_exists:
|
57
57
|
# Check if index already exists
|
58
58
|
cursor.execute("""
|
@@ -62,7 +62,7 @@ class KnowbaseConfig(AppConfig):
|
|
62
62
|
);
|
63
63
|
""")
|
64
64
|
index_exists = cursor.fetchone()[0]
|
65
|
-
|
65
|
+
|
66
66
|
if not index_exists:
|
67
67
|
cursor.execute("""
|
68
68
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS embedding_cosine_idx
|
@@ -75,7 +75,7 @@ class KnowbaseConfig(AppConfig):
|
|
75
75
|
logger.debug("✅ embedding_cosine_idx index already exists")
|
76
76
|
else:
|
77
77
|
logger.debug("⏳ django_cfg_knowbase_document_chunks table not yet created, skipping index creation")
|
78
|
-
|
78
|
+
|
79
79
|
except Exception as e:
|
80
80
|
# Log warning but don't fail - extension/index might already exist
|
81
|
-
logger.warning(f"Could not create pgvector extension/indexes: {e}")
|
81
|
+
logger.warning(f"Could not create pgvector extension/indexes: {e}")
|
@@ -8,15 +8,16 @@ including Pydantic-based settings and optional Constance field definitions.
|
|
8
8
|
# Import the main Pydantic configuration
|
9
9
|
from .settings import (
|
10
10
|
KnowledgeBaseConfig,
|
11
|
+
get_archive_chunk_size,
|
12
|
+
get_chunking_params_for_type,
|
11
13
|
get_config,
|
12
|
-
reload_config,
|
13
14
|
get_document_chunk_size,
|
14
|
-
get_archive_chunk_size,
|
15
|
-
get_embedding_model,
|
16
15
|
get_embedding_batch_size,
|
17
|
-
|
16
|
+
get_embedding_model,
|
17
|
+
reload_config,
|
18
18
|
)
|
19
19
|
|
20
|
+
|
20
21
|
# Constance-related imports are optional and only loaded when needed
|
21
22
|
# to avoid django_cfg dependency issues
|
22
23
|
def get_django_cfg_knowbase_constance_fields():
|
@@ -40,12 +41,12 @@ __all__ = [
|
|
40
41
|
"get_config",
|
41
42
|
"reload_config",
|
42
43
|
"get_document_chunk_size",
|
43
|
-
"get_archive_chunk_size",
|
44
|
+
"get_archive_chunk_size",
|
44
45
|
"get_embedding_model",
|
45
46
|
"get_embedding_batch_size",
|
46
47
|
"get_chunking_params_for_type",
|
47
48
|
# Constance configuration (lazy loaded)
|
48
49
|
"get_django_cfg_knowbase_constance_fields",
|
49
|
-
"get_django_cfg_knowbase_field_validation_rules",
|
50
|
+
"get_django_cfg_knowbase_field_validation_rules",
|
50
51
|
"get_all_django_cfg_knowbase_constance_config",
|
51
52
|
]
|