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,33 +5,30 @@ Enhanced chat management with Material Icons and optimized queries.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.contrib import admin, messages
|
8
|
-
from django.
|
9
|
-
from django.utils.safestring import mark_safe
|
10
|
-
from django.db import models
|
11
|
-
from django.db.models import Count, Sum, Avg, Q
|
8
|
+
from django.db.models import Avg, Count, Q, Sum
|
12
9
|
from unfold.admin import ModelAdmin, TabularInline
|
13
10
|
from unfold.contrib.filters.admin import AutocompleteSelectFilter
|
14
|
-
from django_cfg import ExportMixin
|
15
11
|
|
12
|
+
from django_cfg import ExportMixin
|
16
13
|
from django_cfg.modules.django_admin import (
|
17
|
-
|
14
|
+
ActionVariant,
|
15
|
+
DateTimeDisplayConfig,
|
18
16
|
DisplayMixin,
|
17
|
+
Icons,
|
19
18
|
MoneyDisplayConfig,
|
19
|
+
OptimizedModelAdmin,
|
20
20
|
StatusBadgeConfig,
|
21
|
-
|
22
|
-
Icons,
|
23
|
-
ActionVariant,
|
21
|
+
action,
|
24
22
|
display,
|
25
|
-
action
|
26
23
|
)
|
27
24
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
28
25
|
|
29
|
-
from ..models import
|
26
|
+
from ..models import ChatMessage, ChatSession
|
30
27
|
|
31
28
|
|
32
29
|
class ChatMessageInline(TabularInline):
|
33
30
|
"""Inline for chat messages with Unfold styling."""
|
34
|
-
|
31
|
+
|
35
32
|
model = ChatMessage
|
36
33
|
verbose_name = "Chat Message"
|
37
34
|
verbose_name_plural = "💬 Chat Messages (Read-only)"
|
@@ -39,52 +36,52 @@ class ChatMessageInline(TabularInline):
|
|
39
36
|
max_num = 0
|
40
37
|
can_delete = False
|
41
38
|
show_change_link = True
|
42
|
-
|
39
|
+
|
43
40
|
def has_add_permission(self, request, obj=None):
|
44
41
|
return False
|
45
|
-
|
42
|
+
|
46
43
|
def has_change_permission(self, request, obj=None):
|
47
44
|
return False
|
48
|
-
|
45
|
+
|
49
46
|
def has_delete_permission(self, request, obj=None):
|
50
47
|
return False
|
51
|
-
|
48
|
+
|
52
49
|
fields = [
|
53
|
-
'short_uuid', 'role_badge_inline', 'content_preview_inline', 'tokens_used',
|
50
|
+
'short_uuid', 'role_badge_inline', 'content_preview_inline', 'tokens_used',
|
54
51
|
'cost_display_inline', 'processing_time_inline', 'created_at'
|
55
52
|
]
|
56
53
|
readonly_fields = [
|
57
|
-
'short_uuid', 'role_badge_inline', 'content_preview_inline', 'tokens_used',
|
54
|
+
'short_uuid', 'role_badge_inline', 'content_preview_inline', 'tokens_used',
|
58
55
|
'cost_display_inline', 'processing_time_inline', 'created_at'
|
59
56
|
]
|
60
|
-
|
57
|
+
|
61
58
|
hide_title = False
|
62
59
|
classes = ['collapse']
|
63
|
-
|
60
|
+
|
64
61
|
@display(description="Role")
|
65
62
|
def role_badge_inline(self, obj):
|
66
63
|
"""Display message role with color coding for inline."""
|
67
64
|
role_variants = {
|
68
65
|
'user': 'primary',
|
69
|
-
'assistant': 'success',
|
66
|
+
'assistant': 'success',
|
70
67
|
'system': 'info'
|
71
68
|
}
|
72
69
|
variant = role_variants.get(obj.role, 'secondary')
|
73
|
-
|
70
|
+
|
74
71
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PERSON)
|
75
72
|
return StatusBadge.create(
|
76
73
|
text=obj.role.upper(),
|
77
74
|
variant=variant,
|
78
75
|
config=config
|
79
76
|
)
|
80
|
-
|
77
|
+
|
81
78
|
@display(description="Content Preview")
|
82
79
|
def content_preview_inline(self, obj):
|
83
80
|
"""Shortened content preview for inline display."""
|
84
81
|
if not obj.content:
|
85
82
|
return "—"
|
86
83
|
return obj.content[:80] + "..." if len(obj.content) > 80 else obj.content
|
87
|
-
|
84
|
+
|
88
85
|
@display(description="Cost (USD)")
|
89
86
|
def cost_display_inline(self, obj):
|
90
87
|
"""Display cost with currency formatting for inline."""
|
@@ -94,7 +91,7 @@ class ChatMessageInline(TabularInline):
|
|
94
91
|
show_sign=False
|
95
92
|
)
|
96
93
|
return f"${obj.cost_usd:.6f}"
|
97
|
-
|
94
|
+
|
98
95
|
@display(description="Time")
|
99
96
|
def processing_time_inline(self, obj):
|
100
97
|
"""Display processing time in compact format for inline."""
|
@@ -104,7 +101,7 @@ class ChatMessageInline(TabularInline):
|
|
104
101
|
else:
|
105
102
|
seconds = ms / 1000
|
106
103
|
return f"{seconds:.1f}s"
|
107
|
-
|
104
|
+
|
108
105
|
def get_queryset(self, request):
|
109
106
|
"""Optimize queryset for inline display."""
|
110
107
|
return super().get_queryset(request).select_related('session', 'user').order_by('created_at')
|
@@ -113,10 +110,10 @@ class ChatMessageInline(TabularInline):
|
|
113
110
|
@admin.register(ChatSession)
|
114
111
|
class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
115
112
|
"""Admin interface for ChatSession model using Django Admin Utilities."""
|
116
|
-
|
113
|
+
|
117
114
|
# Performance optimization
|
118
115
|
select_related_fields = ['user']
|
119
|
-
|
116
|
+
|
120
117
|
list_display = [
|
121
118
|
'title_display', 'user_display', 'status_display', 'messages_count_display',
|
122
119
|
'total_tokens_display', 'total_cost_display', 'last_activity_display', 'created_at_display'
|
@@ -134,7 +131,7 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
134
131
|
'id', 'user', 'messages_count', 'total_tokens_used', 'total_cost_usd',
|
135
132
|
'created_at', 'updated_at'
|
136
133
|
]
|
137
|
-
|
134
|
+
|
138
135
|
fieldsets = (
|
139
136
|
('💬 Session Info', {
|
140
137
|
'fields': ('id', 'title', 'user', 'is_active'),
|
@@ -149,30 +146,30 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
149
146
|
'classes': ('tab',)
|
150
147
|
}),
|
151
148
|
)
|
152
|
-
|
149
|
+
|
153
150
|
actions = ['activate_sessions', 'deactivate_sessions', 'clear_old_sessions']
|
154
|
-
|
151
|
+
|
155
152
|
@display(description="Session Title", ordering="title")
|
156
153
|
def title_display(self, obj):
|
157
154
|
"""Display session title."""
|
158
155
|
title = obj.title or "Untitled Session"
|
159
156
|
if len(title) > 50:
|
160
157
|
title = title[:47] + "..."
|
161
|
-
|
158
|
+
|
162
159
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.CHAT)
|
163
160
|
return StatusBadge.create(
|
164
161
|
text=title,
|
165
162
|
variant="primary",
|
166
163
|
config=config
|
167
164
|
)
|
168
|
-
|
165
|
+
|
169
166
|
@display(description="User")
|
170
167
|
def user_display(self, obj):
|
171
168
|
"""User display."""
|
172
169
|
if not obj.user:
|
173
170
|
return "—"
|
174
171
|
return self.display_user_simple(obj.user)
|
175
|
-
|
172
|
+
|
176
173
|
@display(description="Status")
|
177
174
|
def status_display(self, obj):
|
178
175
|
"""Display session status."""
|
@@ -182,13 +179,13 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
182
179
|
else:
|
183
180
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PAUSE_CIRCLE)
|
184
181
|
return StatusBadge.create(text="Inactive", variant="secondary", config=config)
|
185
|
-
|
182
|
+
|
186
183
|
@display(description="Messages", ordering="message_count")
|
187
184
|
def messages_count_display(self, obj):
|
188
185
|
"""Display messages count."""
|
189
186
|
count = obj.message_count
|
190
187
|
return f"{count} messages"
|
191
|
-
|
188
|
+
|
192
189
|
@display(description="Tokens", ordering="total_tokens")
|
193
190
|
def total_tokens_display(self, obj):
|
194
191
|
"""Display total tokens with formatting."""
|
@@ -196,7 +193,7 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
196
193
|
if tokens > 1000:
|
197
194
|
return f"{tokens/1000:.1f}K"
|
198
195
|
return str(tokens)
|
199
|
-
|
196
|
+
|
200
197
|
@display(description="Cost (USD)", ordering="total_cost_usd")
|
201
198
|
def total_cost_display(self, obj):
|
202
199
|
"""Display total cost with currency formatting."""
|
@@ -206,7 +203,7 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
206
203
|
show_sign=False
|
207
204
|
)
|
208
205
|
return self.display_money_amount(obj, 'total_cost_usd', config)
|
209
|
-
|
206
|
+
|
210
207
|
@display(description="Last Activity", ordering="last_activity_at")
|
211
208
|
def last_activity_display(self, obj):
|
212
209
|
"""Last activity time with relative display."""
|
@@ -214,44 +211,45 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
214
211
|
return "—"
|
215
212
|
config = DateTimeDisplayConfig(show_relative=True)
|
216
213
|
return self.display_datetime_relative(obj, 'last_activity_at', config)
|
217
|
-
|
214
|
+
|
218
215
|
@display(description="Created")
|
219
216
|
def created_at_display(self, obj):
|
220
217
|
"""Created time with relative display."""
|
221
218
|
config = DateTimeDisplayConfig(show_relative=True)
|
222
219
|
return self.display_datetime_relative(obj, 'created_at', config)
|
223
|
-
|
220
|
+
|
224
221
|
@action(description="Activate sessions", variant=ActionVariant.SUCCESS)
|
225
222
|
def activate_sessions(self, request, queryset):
|
226
223
|
"""Activate selected sessions."""
|
227
224
|
updated = queryset.update(is_active=True)
|
228
225
|
messages.success(request, f"Activated {updated} sessions.")
|
229
|
-
|
226
|
+
|
230
227
|
@action(description="Deactivate sessions", variant=ActionVariant.WARNING)
|
231
228
|
def deactivate_sessions(self, request, queryset):
|
232
229
|
"""Deactivate selected sessions."""
|
233
230
|
updated = queryset.update(is_active=False)
|
234
231
|
messages.warning(request, f"Deactivated {updated} sessions.")
|
235
|
-
|
232
|
+
|
236
233
|
@action(description="Clear old sessions", variant=ActionVariant.DANGER)
|
237
234
|
def clear_old_sessions(self, request, queryset):
|
238
235
|
"""Clear old inactive sessions."""
|
239
236
|
from datetime import timedelta
|
237
|
+
|
240
238
|
from django.utils import timezone
|
241
|
-
|
239
|
+
|
242
240
|
cutoff_date = timezone.now() - timedelta(days=30)
|
243
241
|
old_sessions = queryset.filter(is_active=False, last_activity_at__lt=cutoff_date)
|
244
242
|
count = old_sessions.count()
|
245
|
-
|
243
|
+
|
246
244
|
if count > 0:
|
247
245
|
messages.warning(request, f"Clear old sessions functionality not implemented yet. {count} old sessions found.")
|
248
246
|
else:
|
249
247
|
messages.info(request, "No old sessions found to clear.")
|
250
|
-
|
248
|
+
|
251
249
|
def changelist_view(self, request, extra_context=None):
|
252
250
|
"""Add session statistics to changelist."""
|
253
251
|
extra_context = extra_context or {}
|
254
|
-
|
252
|
+
|
255
253
|
queryset = self.get_queryset(request)
|
256
254
|
stats = queryset.aggregate(
|
257
255
|
total_sessions=Count('id'),
|
@@ -260,7 +258,7 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
260
258
|
total_tokens=Sum('total_tokens'),
|
261
259
|
total_cost=Sum('total_cost_usd')
|
262
260
|
)
|
263
|
-
|
261
|
+
|
264
262
|
extra_context['session_stats'] = {
|
265
263
|
'total_sessions': stats['total_sessions'] or 0,
|
266
264
|
'active_sessions': stats['active_sessions'] or 0,
|
@@ -268,17 +266,17 @@ class ChatSessionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
268
266
|
'total_tokens': stats['total_tokens'] or 0,
|
269
267
|
'total_cost': f"${(stats['total_cost'] or 0):.6f}"
|
270
268
|
}
|
271
|
-
|
269
|
+
|
272
270
|
return super().changelist_view(request, extra_context)
|
273
271
|
|
274
272
|
|
275
273
|
@admin.register(ChatMessage)
|
276
274
|
class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
277
275
|
"""Admin interface for ChatMessage model using Django Admin Utilities."""
|
278
|
-
|
276
|
+
|
279
277
|
# Performance optimization
|
280
278
|
select_related_fields = ['session', 'user']
|
281
|
-
|
279
|
+
|
282
280
|
list_display = [
|
283
281
|
'message_display', 'session_display', 'user_display', 'role_display',
|
284
282
|
'tokens_display', 'cost_display', 'processing_time_display', 'created_at_display'
|
@@ -296,7 +294,7 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
296
294
|
'id', 'user', 'tokens_used', 'cost_usd', 'processing_time_ms',
|
297
295
|
'created_at', 'updated_at', 'content_preview'
|
298
296
|
]
|
299
|
-
|
297
|
+
|
300
298
|
fieldsets = (
|
301
299
|
('💬 Message Info', {
|
302
300
|
'fields': ('id', 'session', 'user', 'role'),
|
@@ -315,9 +313,9 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
315
313
|
'classes': ('tab', 'collapse')
|
316
314
|
})
|
317
315
|
)
|
318
|
-
|
316
|
+
|
319
317
|
actions = ['delete_user_messages', 'delete_assistant_messages']
|
320
|
-
|
318
|
+
|
321
319
|
@display(description="Message", ordering="id")
|
322
320
|
def message_display(self, obj):
|
323
321
|
"""Display message identifier."""
|
@@ -327,43 +325,43 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
327
325
|
variant="secondary",
|
328
326
|
config=config
|
329
327
|
)
|
330
|
-
|
328
|
+
|
331
329
|
@display(description="Session", ordering="session__title")
|
332
330
|
def session_display(self, obj):
|
333
331
|
"""Display session title."""
|
334
332
|
return obj.session.title or "Untitled Session"
|
335
|
-
|
333
|
+
|
336
334
|
@display(description="User")
|
337
335
|
def user_display(self, obj):
|
338
336
|
"""User display."""
|
339
337
|
if not obj.user:
|
340
338
|
return "—"
|
341
339
|
return self.display_user_simple(obj.user)
|
342
|
-
|
340
|
+
|
343
341
|
@display(description="Role")
|
344
342
|
def role_display(self, obj):
|
345
343
|
"""Display message role with color coding."""
|
346
344
|
role_variants = {
|
347
345
|
'user': 'primary',
|
348
|
-
'assistant': 'success',
|
346
|
+
'assistant': 'success',
|
349
347
|
'system': 'info'
|
350
348
|
}
|
351
349
|
variant = role_variants.get(obj.role, 'secondary')
|
352
|
-
|
350
|
+
|
353
351
|
role_icons = {
|
354
352
|
'user': Icons.PERSON,
|
355
353
|
'assistant': Icons.SMART_TOY,
|
356
354
|
'system': Icons.SETTINGS
|
357
355
|
}
|
358
356
|
icon = role_icons.get(obj.role, Icons.MESSAGE)
|
359
|
-
|
357
|
+
|
360
358
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
361
359
|
return StatusBadge.create(
|
362
360
|
text=obj.role.title(),
|
363
361
|
variant=variant,
|
364
362
|
config=config
|
365
363
|
)
|
366
|
-
|
364
|
+
|
367
365
|
@display(description="Tokens", ordering="tokens_used")
|
368
366
|
def tokens_display(self, obj):
|
369
367
|
"""Display tokens used with formatting."""
|
@@ -371,7 +369,7 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
371
369
|
if tokens > 1000:
|
372
370
|
return f"{tokens/1000:.1f}K"
|
373
371
|
return str(tokens)
|
374
|
-
|
372
|
+
|
375
373
|
@display(description="Cost (USD)", ordering="cost_usd")
|
376
374
|
def cost_display(self, obj):
|
377
375
|
"""Display cost with currency formatting."""
|
@@ -381,7 +379,7 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
381
379
|
show_sign=False
|
382
380
|
)
|
383
381
|
return self.display_money_amount(obj, 'cost_usd', config)
|
384
|
-
|
382
|
+
|
385
383
|
@display(description="Processing Time", ordering="processing_time_ms")
|
386
384
|
def processing_time_display(self, obj):
|
387
385
|
"""Display processing time."""
|
@@ -391,44 +389,44 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
391
389
|
else:
|
392
390
|
seconds = ms / 1000
|
393
391
|
return f"{seconds:.1f}s"
|
394
|
-
|
392
|
+
|
395
393
|
@display(description="Created")
|
396
394
|
def created_at_display(self, obj):
|
397
395
|
"""Created time with relative display."""
|
398
396
|
config = DateTimeDisplayConfig(show_relative=True)
|
399
397
|
return self.display_datetime_relative(obj, 'created_at', config)
|
400
|
-
|
398
|
+
|
401
399
|
@display(description="Content Preview")
|
402
400
|
def content_preview(self, obj):
|
403
401
|
"""Display content preview with truncation."""
|
404
402
|
return obj.content[:200] + "..." if len(obj.content) > 200 else obj.content
|
405
|
-
|
403
|
+
|
406
404
|
@action(description="Delete user messages", variant=ActionVariant.DANGER)
|
407
405
|
def delete_user_messages(self, request, queryset):
|
408
406
|
"""Delete user messages from selection."""
|
409
407
|
user_messages = queryset.filter(role='user')
|
410
408
|
count = user_messages.count()
|
411
|
-
|
409
|
+
|
412
410
|
if count > 0:
|
413
411
|
messages.warning(request, f"Delete user messages functionality not implemented yet. {count} user messages selected.")
|
414
412
|
else:
|
415
413
|
messages.info(request, "No user messages in selection.")
|
416
|
-
|
414
|
+
|
417
415
|
@action(description="Delete assistant messages", variant=ActionVariant.DANGER)
|
418
416
|
def delete_assistant_messages(self, request, queryset):
|
419
417
|
"""Delete assistant messages from selection."""
|
420
418
|
assistant_messages = queryset.filter(role='assistant')
|
421
419
|
count = assistant_messages.count()
|
422
|
-
|
420
|
+
|
423
421
|
if count > 0:
|
424
422
|
messages.warning(request, f"Delete assistant messages functionality not implemented yet. {count} assistant messages selected.")
|
425
423
|
else:
|
426
424
|
messages.info(request, "No assistant messages in selection.")
|
427
|
-
|
425
|
+
|
428
426
|
def changelist_view(self, request, extra_context=None):
|
429
427
|
"""Add message statistics to changelist."""
|
430
428
|
extra_context = extra_context or {}
|
431
|
-
|
429
|
+
|
432
430
|
queryset = self.get_queryset(request)
|
433
431
|
stats = queryset.aggregate(
|
434
432
|
total_messages=Count('id'),
|
@@ -439,7 +437,7 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
439
437
|
total_cost=Sum('cost_usd'),
|
440
438
|
avg_processing_time=Avg('processing_time_ms')
|
441
439
|
)
|
442
|
-
|
440
|
+
|
443
441
|
extra_context['message_stats'] = {
|
444
442
|
'total_messages': stats['total_messages'] or 0,
|
445
443
|
'user_messages': stats['user_messages'] or 0,
|
@@ -449,5 +447,5 @@ class ChatMessageAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
449
447
|
'total_cost': f"${(stats['total_cost'] or 0):.6f}",
|
450
448
|
'avg_processing_time': f"{(stats['avg_processing_time'] or 0):.0f}ms"
|
451
449
|
}
|
452
|
-
|
450
|
+
|
453
451
|
return super().changelist_view(request, extra_context)
|
@@ -5,33 +5,32 @@ Enhanced document management with Material Icons and optimized queries.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.contrib import admin, messages
|
8
|
-
from django.db import
|
8
|
+
from django.db import IntegrityError, models
|
9
9
|
from django.db.models.fields.json import JSONField
|
10
10
|
from django_json_widget.widgets import JSONEditorWidget
|
11
11
|
from unfold.admin import ModelAdmin, TabularInline
|
12
12
|
from unfold.contrib.filters.admin import AutocompleteSelectFilter, AutocompleteSelectMultipleFilter
|
13
13
|
from unfold.contrib.forms.widgets import WysiwygWidget
|
14
|
-
from django_cfg import ImportExportModelAdmin, ImportForm, ExportForm
|
15
14
|
|
15
|
+
from django_cfg import ExportForm, ImportExportModelAdmin, ImportForm
|
16
16
|
from django_cfg.modules.django_admin import (
|
17
|
-
OptimizedModelAdmin,
|
18
|
-
DisplayMixin,
|
19
|
-
Icons,
|
20
17
|
ActionVariant,
|
18
|
+
DisplayMixin,
|
19
|
+
OptimizedModelAdmin,
|
20
|
+
action,
|
21
21
|
display,
|
22
|
-
action
|
23
22
|
)
|
24
23
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
25
24
|
|
26
|
-
from ..models import Document,
|
25
|
+
from ..models import Document, DocumentCategory, DocumentChunk
|
26
|
+
from .actions import VisibilityActions
|
27
27
|
from .helpers import (
|
28
|
+
CategoryStatistics,
|
29
|
+
ChunkStatistics,
|
30
|
+
DocumentAdminConfigs,
|
28
31
|
DocumentDisplayHelpers,
|
29
32
|
DocumentStatistics,
|
30
|
-
ChunkStatistics,
|
31
|
-
CategoryStatistics,
|
32
|
-
DocumentAdminConfigs
|
33
33
|
)
|
34
|
-
from .actions import VisibilityActions
|
35
34
|
|
36
35
|
|
37
36
|
class DocumentChunkInline(TabularInline):
|