django-cfg 1.4.20__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +35 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +36 -35
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +12 -13
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.20.dist-info/RECORD +0 -1110
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,42 +4,39 @@ Archive admin interfaces using Django Admin Utilities.
|
|
4
4
|
Enhanced archive management with Material Icons and optimized queries.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import hashlib
|
8
7
|
import logging
|
8
|
+
|
9
9
|
from django.contrib import admin, messages
|
10
|
-
from django.urls import reverse
|
11
|
-
from django.utils.safestring import mark_safe
|
12
10
|
from django.db import models
|
13
|
-
from django.db.models import Count,
|
11
|
+
from django.db.models import Count, Q, Sum
|
14
12
|
from django.db.models.fields.json import JSONField
|
15
|
-
from django.shortcuts import redirect
|
16
13
|
from django_json_widget.widgets import JSONEditorWidget
|
17
14
|
from unfold.admin import ModelAdmin, TabularInline
|
18
15
|
from unfold.contrib.filters.admin import AutocompleteSelectFilter
|
19
16
|
from unfold.contrib.forms.widgets import WysiwygWidget
|
20
|
-
from django_cfg import ExportMixin
|
21
17
|
|
18
|
+
from django_cfg import ExportMixin
|
22
19
|
from django_cfg.modules.django_admin import (
|
23
|
-
|
20
|
+
ActionVariant,
|
21
|
+
DateTimeDisplayConfig,
|
24
22
|
DisplayMixin,
|
23
|
+
Icons,
|
25
24
|
MoneyDisplayConfig,
|
25
|
+
OptimizedModelAdmin,
|
26
26
|
StatusBadgeConfig,
|
27
|
-
|
28
|
-
Icons,
|
29
|
-
ActionVariant,
|
27
|
+
action,
|
30
28
|
display,
|
31
|
-
action
|
32
29
|
)
|
33
30
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
34
31
|
|
35
|
-
from ..models.archive import
|
32
|
+
from ..models.archive import ArchiveItem, ArchiveItemChunk, DocumentArchive
|
36
33
|
|
37
34
|
logger = logging.getLogger(__name__)
|
38
35
|
|
39
36
|
|
40
37
|
class ArchiveItemInline(TabularInline):
|
41
38
|
"""Inline for archive items with Unfold styling."""
|
42
|
-
|
39
|
+
|
43
40
|
model = ArchiveItem
|
44
41
|
verbose_name = "Archive Item"
|
45
42
|
verbose_name_plural = "📁 Archive Items (Read-only)"
|
@@ -47,28 +44,28 @@ class ArchiveItemInline(TabularInline):
|
|
47
44
|
max_num = 0
|
48
45
|
can_delete = False
|
49
46
|
show_change_link = True
|
50
|
-
|
47
|
+
|
51
48
|
def has_add_permission(self, request, obj=None):
|
52
49
|
return False
|
53
|
-
|
50
|
+
|
54
51
|
def has_change_permission(self, request, obj=None):
|
55
52
|
return False
|
56
|
-
|
53
|
+
|
57
54
|
def has_delete_permission(self, request, obj=None):
|
58
55
|
return False
|
59
|
-
|
56
|
+
|
60
57
|
fields = [
|
61
|
-
'item_name', 'content_type', 'file_size_display_inline',
|
58
|
+
'item_name', 'content_type', 'file_size_display_inline',
|
62
59
|
'is_processable', 'chunks_count', 'created_at'
|
63
60
|
]
|
64
61
|
readonly_fields = [
|
65
62
|
'item_name', 'content_type', 'file_size_display_inline',
|
66
63
|
'is_processable', 'chunks_count', 'created_at'
|
67
64
|
]
|
68
|
-
|
65
|
+
|
69
66
|
hide_title = False
|
70
67
|
classes = ['collapse']
|
71
|
-
|
68
|
+
|
72
69
|
@display(description="File Size")
|
73
70
|
def file_size_display_inline(self, obj):
|
74
71
|
"""Display file size in human readable format for inline."""
|
@@ -78,7 +75,7 @@ class ArchiveItemInline(TabularInline):
|
|
78
75
|
return f"{size:.1f} {unit}"
|
79
76
|
size /= 1024.0
|
80
77
|
return f"{size:.1f} GB"
|
81
|
-
|
78
|
+
|
82
79
|
def get_queryset(self, request):
|
83
80
|
"""Optimize queryset for inline display."""
|
84
81
|
return super().get_queryset(request).select_related('archive', 'user')
|
@@ -87,10 +84,10 @@ class ArchiveItemInline(TabularInline):
|
|
87
84
|
@admin.register(DocumentArchive)
|
88
85
|
class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
89
86
|
"""Admin interface for DocumentArchive using Django Admin Utilities."""
|
90
|
-
|
87
|
+
|
91
88
|
# Performance optimization
|
92
89
|
select_related_fields = ['user']
|
93
|
-
|
90
|
+
|
94
91
|
list_display = [
|
95
92
|
'title_display', 'user_display', 'archive_type_display', 'status_display',
|
96
93
|
'items_count', 'chunks_count', 'vectorization_progress', 'file_size_display',
|
@@ -108,11 +105,11 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
108
105
|
autocomplete_fields = ['user', 'categories']
|
109
106
|
readonly_fields = [
|
110
107
|
'id', 'user', 'content_hash', 'original_filename', 'file_size', 'archive_type',
|
111
|
-
'processing_status', 'processed_at', 'processing_duration_ms',
|
112
|
-
'processing_error', 'total_items', 'processed_items', 'total_chunks',
|
108
|
+
'processing_status', 'processed_at', 'processing_duration_ms',
|
109
|
+
'processing_error', 'total_items', 'processed_items', 'total_chunks',
|
113
110
|
'vectorized_chunks', 'total_cost_usd', 'created_at', 'updated_at'
|
114
111
|
]
|
115
|
-
|
112
|
+
|
116
113
|
fieldsets = (
|
117
114
|
('📁 Archive Info', {
|
118
115
|
'fields': ('id', 'title', 'description', 'user', 'categories', 'is_public'),
|
@@ -139,46 +136,46 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
139
136
|
})
|
140
137
|
)
|
141
138
|
filter_horizontal = ['categories']
|
142
|
-
|
139
|
+
|
143
140
|
# Unfold configuration
|
144
141
|
compressed_fields = True
|
145
142
|
warn_unsaved_form = True
|
146
|
-
|
143
|
+
|
147
144
|
# Form field overrides
|
148
145
|
formfield_overrides = {
|
149
146
|
models.TextField: {"widget": WysiwygWidget},
|
150
147
|
JSONField: {"widget": JSONEditorWidget}
|
151
148
|
}
|
152
|
-
|
149
|
+
|
153
150
|
actions = ['reprocess_archives', 'mark_as_public', 'mark_as_private']
|
154
|
-
|
151
|
+
|
155
152
|
@display(description="Archive Title", ordering="title")
|
156
153
|
def title_display(self, obj):
|
157
154
|
"""Display archive title."""
|
158
155
|
title = obj.title or "Untitled Archive"
|
159
156
|
if len(title) > 50:
|
160
157
|
title = title[:47] + "..."
|
161
|
-
|
158
|
+
|
162
159
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ARCHIVE)
|
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="Archive Type")
|
177
174
|
def archive_type_display(self, obj):
|
178
175
|
"""Display archive type with badge."""
|
179
176
|
if not obj.archive_type:
|
180
177
|
return "—"
|
181
|
-
|
178
|
+
|
182
179
|
type_variants = {
|
183
180
|
'zip': 'info',
|
184
181
|
'tar': 'warning',
|
@@ -186,14 +183,14 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
186
183
|
'7z': 'primary'
|
187
184
|
}
|
188
185
|
variant = type_variants.get(obj.archive_type.lower(), 'secondary')
|
189
|
-
|
186
|
+
|
190
187
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.FOLDER_ZIP)
|
191
188
|
return StatusBadge.create(
|
192
189
|
text=obj.archive_type.upper(),
|
193
190
|
variant=variant,
|
194
191
|
config=config
|
195
192
|
)
|
196
|
-
|
193
|
+
|
197
194
|
@display(description="Status")
|
198
195
|
def status_display(self, obj):
|
199
196
|
"""Display processing status."""
|
@@ -209,32 +206,32 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
209
206
|
icon=Icons.CHECK_CIRCLE if obj.processing_status == 'completed' else Icons.ERROR if obj.processing_status == 'failed' else Icons.SCHEDULE
|
210
207
|
)
|
211
208
|
return self.display_status_auto(obj, 'processing_status', status_config)
|
212
|
-
|
209
|
+
|
213
210
|
@display(description="Items", ordering="total_items")
|
214
211
|
def items_count(self, obj):
|
215
212
|
"""Display items count."""
|
216
213
|
total = obj.total_items or 0
|
217
214
|
processed = obj.processed_items or 0
|
218
215
|
return f"{processed}/{total} items"
|
219
|
-
|
216
|
+
|
220
217
|
@display(description="Chunks", ordering="total_chunks")
|
221
218
|
def chunks_count(self, obj):
|
222
219
|
"""Display chunks count."""
|
223
220
|
total = obj.total_chunks or 0
|
224
221
|
vectorized = obj.vectorized_chunks or 0
|
225
222
|
return f"{vectorized}/{total} chunks"
|
226
|
-
|
223
|
+
|
227
224
|
@display(description="Vectorization")
|
228
225
|
def vectorization_progress(self, obj):
|
229
226
|
"""Display vectorization progress."""
|
230
227
|
total = obj.total_chunks or 0
|
231
228
|
vectorized = obj.vectorized_chunks or 0
|
232
|
-
|
229
|
+
|
233
230
|
if total == 0:
|
234
231
|
return "No chunks"
|
235
|
-
|
232
|
+
|
236
233
|
percentage = (vectorized / total) * 100
|
237
|
-
|
234
|
+
|
238
235
|
if percentage == 100:
|
239
236
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.CHECK_CIRCLE)
|
240
237
|
return StatusBadge.create(text="100%", variant="success", config=config)
|
@@ -244,7 +241,7 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
244
241
|
else:
|
245
242
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ERROR)
|
246
243
|
return StatusBadge.create(text="0%", variant="danger", config=config)
|
247
|
-
|
244
|
+
|
248
245
|
@display(description="File Size", ordering="file_size")
|
249
246
|
def file_size_display(self, obj):
|
250
247
|
"""Display file size in human readable format."""
|
@@ -254,47 +251,47 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
254
251
|
return f"{size:.1f} {unit}"
|
255
252
|
size /= 1024.0
|
256
253
|
return f"{size:.1f} GB"
|
257
|
-
|
254
|
+
|
258
255
|
@display(description="Progress")
|
259
256
|
def progress_display(self, obj):
|
260
257
|
"""Display overall progress."""
|
261
258
|
total_items = obj.total_items or 0
|
262
259
|
processed_items = obj.processed_items or 0
|
263
|
-
|
260
|
+
|
264
261
|
if total_items == 0:
|
265
262
|
return "No items"
|
266
|
-
|
263
|
+
|
267
264
|
percentage = (processed_items / total_items) * 100
|
268
265
|
return f"{percentage:.1f}%"
|
269
|
-
|
266
|
+
|
270
267
|
@display(description="Created")
|
271
268
|
def created_at_display(self, obj):
|
272
269
|
"""Created time with relative display."""
|
273
270
|
config = DateTimeDisplayConfig(show_relative=True)
|
274
271
|
return self.display_datetime_relative(obj, 'created_at', config)
|
275
|
-
|
272
|
+
|
276
273
|
@action(description="Reprocess archives", variant=ActionVariant.INFO)
|
277
274
|
def reprocess_archives(self, request, queryset):
|
278
275
|
"""Reprocess selected archives."""
|
279
276
|
count = queryset.count()
|
280
277
|
messages.info(request, f"Reprocess functionality not implemented yet. {count} archives selected.")
|
281
|
-
|
278
|
+
|
282
279
|
@action(description="Mark as public", variant=ActionVariant.SUCCESS)
|
283
280
|
def mark_as_public(self, request, queryset):
|
284
281
|
"""Mark selected archives as public."""
|
285
282
|
updated = queryset.update(is_public=True)
|
286
283
|
messages.success(request, f"Marked {updated} archives as public.")
|
287
|
-
|
284
|
+
|
288
285
|
@action(description="Mark as private", variant=ActionVariant.WARNING)
|
289
286
|
def mark_as_private(self, request, queryset):
|
290
287
|
"""Mark selected archives as private."""
|
291
288
|
updated = queryset.update(is_public=False)
|
292
289
|
messages.warning(request, f"Marked {updated} archives as private.")
|
293
|
-
|
290
|
+
|
294
291
|
def changelist_view(self, request, extra_context=None):
|
295
292
|
"""Add archive statistics to changelist."""
|
296
293
|
extra_context = extra_context or {}
|
297
|
-
|
294
|
+
|
298
295
|
queryset = self.get_queryset(request)
|
299
296
|
stats = queryset.aggregate(
|
300
297
|
total_archives=Count('id'),
|
@@ -303,7 +300,7 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
303
300
|
total_chunks=Sum('total_chunks'),
|
304
301
|
total_cost=Sum('total_cost_usd')
|
305
302
|
)
|
306
|
-
|
303
|
+
|
307
304
|
extra_context['archive_stats'] = {
|
308
305
|
'total_archives': stats['total_archives'] or 0,
|
309
306
|
'completed_archives': stats['completed_archives'] or 0,
|
@@ -311,17 +308,17 @@ class DocumentArchiveAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Export
|
|
311
308
|
'total_chunks': stats['total_chunks'] or 0,
|
312
309
|
'total_cost': f"${(stats['total_cost'] or 0):.6f}"
|
313
310
|
}
|
314
|
-
|
311
|
+
|
315
312
|
return super().changelist_view(request, extra_context)
|
316
313
|
|
317
314
|
|
318
315
|
@admin.register(ArchiveItem)
|
319
316
|
class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
320
317
|
"""Admin interface for ArchiveItem using Django Admin Utilities."""
|
321
|
-
|
318
|
+
|
322
319
|
# Performance optimization
|
323
320
|
select_related_fields = ['archive', 'user']
|
324
|
-
|
321
|
+
|
325
322
|
list_display = [
|
326
323
|
'item_name_display', 'archive_display', 'user_display', 'content_type_display',
|
327
324
|
'file_size_display', 'processable_display', 'chunks_count_display', 'created_at_display'
|
@@ -339,7 +336,7 @@ class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
339
336
|
'id', 'user', 'file_size', 'content_type', 'is_processable',
|
340
337
|
'chunks_count', 'created_at', 'updated_at'
|
341
338
|
]
|
342
|
-
|
339
|
+
|
343
340
|
fieldsets = (
|
344
341
|
('📄 Item Info', {
|
345
342
|
'fields': ('id', 'item_name', 'archive', 'user'),
|
@@ -358,48 +355,48 @@ class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
358
355
|
'classes': ('tab', 'collapse')
|
359
356
|
})
|
360
357
|
)
|
361
|
-
|
358
|
+
|
362
359
|
actions = ['mark_as_processable', 'mark_as_not_processable']
|
363
|
-
|
360
|
+
|
364
361
|
@display(description="Item Name", ordering="item_name")
|
365
362
|
def item_name_display(self, obj):
|
366
363
|
"""Display item name."""
|
367
364
|
name = obj.item_name
|
368
365
|
if len(name) > 50:
|
369
366
|
name = name[:47] + "..."
|
370
|
-
|
367
|
+
|
371
368
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.INSERT_DRIVE_FILE)
|
372
369
|
return StatusBadge.create(
|
373
370
|
text=name,
|
374
371
|
variant="primary",
|
375
372
|
config=config
|
376
373
|
)
|
377
|
-
|
374
|
+
|
378
375
|
@display(description="Archive", ordering="archive__title")
|
379
376
|
def archive_display(self, obj):
|
380
377
|
"""Display archive title."""
|
381
378
|
return obj.archive.title or "Untitled Archive"
|
382
|
-
|
379
|
+
|
383
380
|
@display(description="User")
|
384
381
|
def user_display(self, obj):
|
385
382
|
"""User display."""
|
386
383
|
if not obj.user:
|
387
384
|
return "—"
|
388
385
|
return self.display_user_simple(obj.user)
|
389
|
-
|
386
|
+
|
390
387
|
@display(description="Content Type")
|
391
388
|
def content_type_display(self, obj):
|
392
389
|
"""Display content type with badge."""
|
393
390
|
if not obj.content_type:
|
394
391
|
return "—"
|
395
|
-
|
392
|
+
|
396
393
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.DESCRIPTION)
|
397
394
|
return StatusBadge.create(
|
398
395
|
text=obj.content_type,
|
399
396
|
variant="info",
|
400
397
|
config=config
|
401
398
|
)
|
402
|
-
|
399
|
+
|
403
400
|
@display(description="File Size", ordering="file_size")
|
404
401
|
def file_size_display(self, obj):
|
405
402
|
"""Display file size in human readable format."""
|
@@ -409,7 +406,7 @@ class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
409
406
|
return f"{size:.1f} {unit}"
|
410
407
|
size /= 1024.0
|
411
408
|
return f"{size:.1f} GB"
|
412
|
-
|
409
|
+
|
413
410
|
@display(description="Processable")
|
414
411
|
def processable_display(self, obj):
|
415
412
|
"""Display processable status."""
|
@@ -419,25 +416,25 @@ class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
419
416
|
else:
|
420
417
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.CANCEL)
|
421
418
|
return StatusBadge.create(text="No", variant="danger", config=config)
|
422
|
-
|
419
|
+
|
423
420
|
@display(description="Chunks", ordering="chunks_count")
|
424
421
|
def chunks_count_display(self, obj):
|
425
422
|
"""Display chunks count."""
|
426
423
|
count = obj.chunks_count or 0
|
427
424
|
return f"{count} chunks"
|
428
|
-
|
425
|
+
|
429
426
|
@display(description="Created")
|
430
427
|
def created_at_display(self, obj):
|
431
428
|
"""Created time with relative display."""
|
432
429
|
config = DateTimeDisplayConfig(show_relative=True)
|
433
430
|
return self.display_datetime_relative(obj, 'created_at', config)
|
434
|
-
|
431
|
+
|
435
432
|
@action(description="Mark as processable", variant=ActionVariant.SUCCESS)
|
436
433
|
def mark_as_processable(self, request, queryset):
|
437
434
|
"""Mark selected items as processable."""
|
438
435
|
updated = queryset.update(is_processable=True)
|
439
436
|
messages.success(request, f"Marked {updated} items as processable.")
|
440
|
-
|
437
|
+
|
441
438
|
@action(description="Mark as not processable", variant=ActionVariant.WARNING)
|
442
439
|
def mark_as_not_processable(self, request, queryset):
|
443
440
|
"""Mark selected items as not processable."""
|
@@ -448,10 +445,10 @@ class ArchiveItemAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixi
|
|
448
445
|
@admin.register(ArchiveItemChunk)
|
449
446
|
class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
450
447
|
"""Admin interface for ArchiveItemChunk using Django Admin Utilities."""
|
451
|
-
|
448
|
+
|
452
449
|
# Performance optimization
|
453
450
|
select_related_fields = ['archive_item', 'user']
|
454
|
-
|
451
|
+
|
455
452
|
list_display = [
|
456
453
|
'chunk_display', 'archive_item_display', 'user_display', 'token_count_display',
|
457
454
|
'embedding_status', 'embedding_cost_display', 'created_at_display'
|
@@ -469,7 +466,7 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
469
466
|
'id', 'token_count', 'character_count', 'embedding_cost',
|
470
467
|
'created_at', 'updated_at', 'content_preview'
|
471
468
|
]
|
472
|
-
|
469
|
+
|
473
470
|
fieldsets = (
|
474
471
|
('📄 Chunk Info', {
|
475
472
|
'fields': ('id', 'archive_item', 'user', 'chunk_index'),
|
@@ -492,9 +489,9 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
492
489
|
'classes': ('tab', 'collapse')
|
493
490
|
})
|
494
491
|
)
|
495
|
-
|
492
|
+
|
496
493
|
actions = ['regenerate_embeddings', 'clear_embeddings']
|
497
|
-
|
494
|
+
|
498
495
|
@display(description="Chunk", ordering="chunk_index")
|
499
496
|
def chunk_display(self, obj):
|
500
497
|
"""Display chunk identifier."""
|
@@ -504,19 +501,19 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
504
501
|
variant="info",
|
505
502
|
config=config
|
506
503
|
)
|
507
|
-
|
504
|
+
|
508
505
|
@display(description="Archive Item", ordering="archive_item__item_name")
|
509
506
|
def archive_item_display(self, obj):
|
510
507
|
"""Display archive item name."""
|
511
508
|
return obj.archive_item.item_name
|
512
|
-
|
509
|
+
|
513
510
|
@display(description="User")
|
514
511
|
def user_display(self, obj):
|
515
512
|
"""User display."""
|
516
513
|
if not obj.user:
|
517
514
|
return "—"
|
518
515
|
return self.display_user_simple(obj.user)
|
519
|
-
|
516
|
+
|
520
517
|
@display(description="Tokens", ordering="token_count")
|
521
518
|
def token_count_display(self, obj):
|
522
519
|
"""Display token count with formatting."""
|
@@ -524,7 +521,7 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
524
521
|
if tokens > 1000:
|
525
522
|
return f"{tokens/1000:.1f}K"
|
526
523
|
return str(tokens)
|
527
|
-
|
524
|
+
|
528
525
|
@display(description="Embedding")
|
529
526
|
def embedding_status(self, obj):
|
530
527
|
"""Display embedding status."""
|
@@ -535,7 +532,7 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
535
532
|
else:
|
536
533
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ERROR)
|
537
534
|
return StatusBadge.create(text="✗ Not vectorized", variant="danger", config=config)
|
538
|
-
|
535
|
+
|
539
536
|
@display(description="Cost (USD)", ordering="embedding_cost")
|
540
537
|
def embedding_cost_display(self, obj):
|
541
538
|
"""Display embedding cost with currency formatting."""
|
@@ -545,24 +542,24 @@ class ArchiveItemChunkAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, Expor
|
|
545
542
|
show_sign=False
|
546
543
|
)
|
547
544
|
return self.display_money_amount(obj, 'embedding_cost', config)
|
548
|
-
|
545
|
+
|
549
546
|
@display(description="Created")
|
550
547
|
def created_at_display(self, obj):
|
551
548
|
"""Created time with relative display."""
|
552
549
|
config = DateTimeDisplayConfig(show_relative=True)
|
553
550
|
return self.display_datetime_relative(obj, 'created_at', config)
|
554
|
-
|
551
|
+
|
555
552
|
@display(description="Content Preview")
|
556
553
|
def content_preview(self, obj):
|
557
554
|
"""Display content preview with truncation."""
|
558
555
|
return obj.content[:200] + "..." if len(obj.content) > 200 else obj.content
|
559
|
-
|
556
|
+
|
560
557
|
@action(description="Regenerate embeddings", variant=ActionVariant.INFO)
|
561
558
|
def regenerate_embeddings(self, request, queryset):
|
562
559
|
"""Regenerate embeddings for selected chunks."""
|
563
560
|
count = queryset.count()
|
564
561
|
messages.info(request, f"Regenerate embeddings functionality not implemented yet. {count} chunks selected.")
|
565
|
-
|
562
|
+
|
566
563
|
@action(description="Clear embeddings", variant=ActionVariant.WARNING)
|
567
564
|
def clear_embeddings(self, request, queryset):
|
568
565
|
"""Clear embeddings for selected chunks."""
|