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,14 +4,16 @@ Unfold Configuration Models
|
|
4
4
|
Complete configuration models for Django Unfold admin interface.
|
5
5
|
"""
|
6
6
|
|
7
|
-
|
8
|
-
from
|
9
|
-
|
10
|
-
from
|
7
|
+
import logging
|
8
|
+
from typing import Any, Dict, List, Optional
|
9
|
+
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
11
|
+
|
12
|
+
from django_cfg.modules.django_admin.icons import Icons
|
13
|
+
|
11
14
|
from .dropdown import SiteDropdownItem
|
15
|
+
from .navigation import NavigationSection
|
12
16
|
from .tabs import TabConfiguration
|
13
|
-
from django_cfg.modules.django_admin.icons import Icons
|
14
|
-
import logging
|
15
17
|
|
16
18
|
logger = logging.getLogger(__name__)
|
17
19
|
|
@@ -106,13 +108,13 @@ class UnfoldTheme(BaseModel):
|
|
106
108
|
"command_search": True,
|
107
109
|
"show_all_applications": self.sidebar.show_all_applications,
|
108
110
|
}
|
109
|
-
|
111
|
+
|
110
112
|
# Start with custom navigation from project (if defined)
|
111
113
|
nav_items = []
|
112
114
|
if self.navigation:
|
113
115
|
# Project has custom navigation - add it first
|
114
116
|
nav_items.extend([group.to_dict() for group in self.navigation])
|
115
|
-
|
117
|
+
|
116
118
|
# Add default navigation from dashboard manager
|
117
119
|
try:
|
118
120
|
from ..dashboard import DashboardManager
|
@@ -121,7 +123,7 @@ class UnfoldTheme(BaseModel):
|
|
121
123
|
nav_items.extend(default_nav_items)
|
122
124
|
except ImportError:
|
123
125
|
pass
|
124
|
-
|
126
|
+
|
125
127
|
sidebar_config["navigation"] = nav_items
|
126
128
|
settings["SIDEBAR"] = sidebar_config
|
127
129
|
|
@@ -162,138 +164,138 @@ class UnfoldConfig(BaseModel):
|
|
162
164
|
navigation, theming, and callback support.
|
163
165
|
"""
|
164
166
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
165
|
-
|
167
|
+
|
166
168
|
# Site branding
|
167
169
|
site_title: str = Field(
|
168
170
|
default="Django-CFG Admin",
|
169
171
|
description="Site title shown in admin"
|
170
172
|
)
|
171
|
-
|
173
|
+
|
172
174
|
site_header: str = Field(
|
173
175
|
default="Django Config Toolkit",
|
174
176
|
description="Site header text"
|
175
177
|
)
|
176
|
-
|
178
|
+
|
177
179
|
site_subheader: str = Field(
|
178
180
|
default="🚀 Type-safe Django Configuration",
|
179
181
|
description="Site subheader text"
|
180
182
|
)
|
181
|
-
|
183
|
+
|
182
184
|
site_symbol: str = Field(
|
183
185
|
default="settings",
|
184
186
|
description="Material icon symbol for site"
|
185
187
|
)
|
186
|
-
|
188
|
+
|
187
189
|
site_url: str = Field(
|
188
190
|
default="/",
|
189
191
|
description="Site URL"
|
190
192
|
)
|
191
|
-
|
193
|
+
|
192
194
|
# UI settings
|
193
195
|
show_history: bool = Field(
|
194
196
|
default=True,
|
195
197
|
description="Show history in admin"
|
196
198
|
)
|
197
|
-
|
199
|
+
|
198
200
|
show_view_on_site: bool = Field(
|
199
201
|
default=True,
|
200
202
|
description="Show 'View on site' links"
|
201
203
|
)
|
202
|
-
|
204
|
+
|
203
205
|
show_back_button: bool = Field(
|
204
206
|
default=False,
|
205
207
|
description="Show back button in admin"
|
206
208
|
)
|
207
|
-
|
209
|
+
|
208
210
|
# Theme settings
|
209
211
|
theme: Optional[str] = Field(
|
210
212
|
default=None,
|
211
213
|
description="Theme setting (light/dark/auto)"
|
212
214
|
)
|
213
|
-
|
215
|
+
|
214
216
|
border_radius: str = Field(
|
215
217
|
default="8px",
|
216
218
|
description="Border radius for UI elements"
|
217
219
|
)
|
218
|
-
|
220
|
+
|
219
221
|
# Dashboard settings
|
220
222
|
dashboard_enabled: bool = Field(
|
221
223
|
default=True,
|
222
224
|
description="Enable custom dashboard"
|
223
225
|
)
|
224
|
-
|
226
|
+
|
225
227
|
dashboard_callback: Optional[str] = Field(
|
226
228
|
default="django_cfg.routing.callbacks.dashboard_callback",
|
227
229
|
description="Dashboard callback function path"
|
228
230
|
)
|
229
|
-
|
231
|
+
|
230
232
|
environment_callback: Optional[str] = Field(
|
231
233
|
default="django_cfg.routing.callbacks.environment_callback",
|
232
234
|
description="Environment callback function path"
|
233
235
|
)
|
234
|
-
|
236
|
+
|
235
237
|
# Navigation settings
|
236
238
|
show_search: bool = Field(
|
237
239
|
default=True,
|
238
240
|
description="Show search in sidebar"
|
239
241
|
)
|
240
|
-
|
242
|
+
|
241
243
|
command_search: bool = Field(
|
242
244
|
default=True,
|
243
245
|
description="Enable command search"
|
244
246
|
)
|
245
|
-
|
247
|
+
|
246
248
|
show_all_applications: bool = Field(
|
247
249
|
default=True,
|
248
250
|
description="Show all applications in sidebar"
|
249
251
|
)
|
250
|
-
|
252
|
+
|
251
253
|
# Multi-language settings
|
252
254
|
show_languages: bool = Field(
|
253
255
|
default=False,
|
254
256
|
description="Show language switcher"
|
255
257
|
)
|
256
|
-
|
258
|
+
|
257
259
|
# Colors configuration
|
258
260
|
colors: Optional[UnfoldColors] = Field(
|
259
261
|
default=None,
|
260
262
|
description="Color theme configuration"
|
261
263
|
)
|
262
|
-
|
264
|
+
|
263
265
|
# Sidebar configuration
|
264
266
|
sidebar: Optional[UnfoldSidebar] = Field(
|
265
267
|
default=None,
|
266
268
|
description="Sidebar configuration"
|
267
269
|
)
|
268
|
-
|
270
|
+
|
269
271
|
# Navigation items
|
270
272
|
navigation: List[NavigationSection] = Field(
|
271
273
|
default_factory=list,
|
272
274
|
description="Custom navigation sections"
|
273
275
|
)
|
274
|
-
|
276
|
+
|
275
277
|
navigation_items: List[Dict[str, Any]] = Field(
|
276
278
|
default_factory=list,
|
277
279
|
description="Custom navigation items (legacy)"
|
278
280
|
)
|
279
|
-
|
281
|
+
|
280
282
|
# Site dropdown items
|
281
283
|
site_dropdown: List[SiteDropdownItem] = Field(
|
282
284
|
default_factory=list,
|
283
285
|
description="Site dropdown menu items"
|
284
286
|
)
|
285
|
-
|
287
|
+
|
286
288
|
site_dropdown_items: List[Dict[str, Any]] = Field(
|
287
289
|
default_factory=list,
|
288
290
|
description="Site dropdown menu items (legacy)"
|
289
291
|
)
|
290
|
-
|
292
|
+
|
291
293
|
# Tab configurations
|
292
294
|
tab_configurations: List[Dict[str, Any]] = Field(
|
293
295
|
default_factory=list,
|
294
296
|
description="Tab configurations for admin"
|
295
297
|
)
|
296
|
-
|
298
|
+
|
297
299
|
@field_validator('theme')
|
298
300
|
@classmethod
|
299
301
|
def validate_theme(cls, v: Optional[str]) -> Optional[str]:
|
@@ -301,19 +303,19 @@ class UnfoldConfig(BaseModel):
|
|
301
303
|
if v and v not in ['light', 'dark', 'auto']:
|
302
304
|
raise ValueError("Theme must be 'light', 'dark', 'auto', or None")
|
303
305
|
return v
|
304
|
-
|
306
|
+
|
305
307
|
def get_color_scheme(self) -> Dict[str, Any]:
|
306
308
|
"""Get Unfold semantic color scheme configuration with theme support."""
|
307
309
|
return {
|
308
310
|
# Base semantic colors that auto-adapt to theme
|
309
311
|
"base": {
|
310
312
|
"50": "248, 250, 252", # Light theme: very light background
|
311
|
-
"100": "241, 245, 249", # Light theme: light background
|
313
|
+
"100": "241, 245, 249", # Light theme: light background
|
312
314
|
"200": "226, 232, 240", # Light theme: subtle border
|
313
315
|
"300": "203, 213, 225", # Light theme: border
|
314
316
|
"400": "148, 163, 184", # Light theme: muted text / Dark theme: text
|
315
317
|
"500": "100, 116, 139", # Neutral - works in both themes
|
316
|
-
"600": "71, 85, 105", # Dark theme: muted text / Light theme: text
|
318
|
+
"600": "71, 85, 105", # Dark theme: muted text / Light theme: text
|
317
319
|
"700": "51, 65, 85", # Dark theme: border
|
318
320
|
"800": "30, 41, 59", # Dark theme: subtle border
|
319
321
|
"900": "15, 23, 42", # Dark theme: light background
|
@@ -322,7 +324,7 @@ class UnfoldConfig(BaseModel):
|
|
322
324
|
# Primary brand - auto-adapts via CSS variables
|
323
325
|
"primary": {
|
324
326
|
"50": "239, 246, 255",
|
325
|
-
"100": "219, 234, 254",
|
327
|
+
"100": "219, 234, 254",
|
326
328
|
"200": "191, 219, 254",
|
327
329
|
"300": "147, 197, 253",
|
328
330
|
"400": "96, 165, 250",
|
@@ -337,7 +339,7 @@ class UnfoldConfig(BaseModel):
|
|
337
339
|
"success": {
|
338
340
|
"50": "236, 253, 245",
|
339
341
|
"100": "209, 250, 229",
|
340
|
-
"200": "167, 243, 208",
|
342
|
+
"200": "167, 243, 208",
|
341
343
|
"300": "110, 231, 183",
|
342
344
|
"400": "52, 211, 153",
|
343
345
|
"500": "16, 185, 129", # Main success color
|
@@ -347,12 +349,12 @@ class UnfoldConfig(BaseModel):
|
|
347
349
|
"900": "6, 78, 59",
|
348
350
|
"950": "2, 44, 34",
|
349
351
|
},
|
350
|
-
# Warning semantic color
|
352
|
+
# Warning semantic color
|
351
353
|
"warning": {
|
352
354
|
"50": "255, 251, 235",
|
353
355
|
"100": "254, 243, 199",
|
354
356
|
"200": "253, 230, 138",
|
355
|
-
"300": "252, 211, 77",
|
357
|
+
"300": "252, 211, 77",
|
356
358
|
"400": "251, 191, 36",
|
357
359
|
"500": "245, 158, 11", # Main warning color
|
358
360
|
"600": "217, 119, 6",
|
@@ -367,7 +369,7 @@ class UnfoldConfig(BaseModel):
|
|
367
369
|
"100": "254, 226, 226",
|
368
370
|
"200": "254, 202, 202",
|
369
371
|
"300": "252, 165, 165",
|
370
|
-
"400": "248, 113, 113",
|
372
|
+
"400": "248, 113, 113",
|
371
373
|
"500": "239, 68, 68", # Main danger color
|
372
374
|
"600": "220, 38, 38",
|
373
375
|
"700": "185, 28, 28",
|
@@ -383,14 +385,14 @@ class UnfoldConfig(BaseModel):
|
|
383
385
|
"300": "103, 232, 249",
|
384
386
|
"400": "34, 211, 238",
|
385
387
|
"500": "6, 182, 212", # Main info color
|
386
|
-
"600": "8, 145, 178",
|
388
|
+
"600": "8, 145, 178",
|
387
389
|
"700": "14, 116, 144",
|
388
390
|
"800": "21, 94, 117",
|
389
391
|
"900": "22, 78, 99",
|
390
392
|
"950": "8, 51, 68",
|
391
393
|
},
|
392
394
|
}
|
393
|
-
|
395
|
+
|
394
396
|
def to_django_settings(self) -> Dict[str, Any]:
|
395
397
|
"""Generate Django settings for Unfold."""
|
396
398
|
# Base Unfold configuration
|
@@ -408,28 +410,28 @@ class UnfoldConfig(BaseModel):
|
|
408
410
|
"SHOW_LANGUAGES": self.show_languages,
|
409
411
|
"COLORS": self.get_color_scheme(),
|
410
412
|
}
|
411
|
-
|
413
|
+
|
412
414
|
# Add callbacks if configured
|
413
415
|
if self.dashboard_callback:
|
414
416
|
unfold_settings["DASHBOARD_CALLBACK"] = self.dashboard_callback
|
415
|
-
|
417
|
+
|
416
418
|
if self.environment_callback:
|
417
419
|
unfold_settings["ENVIRONMENT"] = self.environment_callback
|
418
|
-
|
420
|
+
|
419
421
|
# Sidebar configuration
|
420
422
|
sidebar_config = {
|
421
423
|
"show_search": self.show_search,
|
422
424
|
"command_search": self.command_search,
|
423
425
|
"show_all_applications": self.show_all_applications,
|
424
426
|
}
|
425
|
-
|
427
|
+
|
426
428
|
# Get default navigation from dashboard manager first
|
427
429
|
nav_items = []
|
428
430
|
try:
|
429
431
|
from ..dashboard import DashboardManager
|
430
432
|
dashboard = DashboardManager()
|
431
433
|
nav_items = dashboard.get_navigation_config()
|
432
|
-
except Exception
|
434
|
+
except Exception:
|
433
435
|
# Catch all exceptions including circular imports during settings generation
|
434
436
|
# During settings generation, config discovery may fail - use empty nav
|
435
437
|
pass
|
@@ -441,10 +443,10 @@ class UnfoldConfig(BaseModel):
|
|
441
443
|
# Add legacy navigation_items if configured
|
442
444
|
if self.navigation_items:
|
443
445
|
nav_items.extend(self.navigation_items)
|
444
|
-
|
446
|
+
|
445
447
|
sidebar_config["navigation"] = nav_items
|
446
448
|
unfold_settings["SIDEBAR"] = sidebar_config
|
447
|
-
|
449
|
+
|
448
450
|
# Add site dropdown - combine default from dashboard + project dropdown
|
449
451
|
dropdown_items = []
|
450
452
|
|
@@ -454,20 +456,20 @@ class UnfoldConfig(BaseModel):
|
|
454
456
|
dropdown_items.extend(DashboardManager._get_default_dropdown_items())
|
455
457
|
except (ImportError, Exception):
|
456
458
|
pass
|
457
|
-
|
459
|
+
|
458
460
|
# Then add project-specific dropdown items
|
459
461
|
if self.site_dropdown:
|
460
462
|
dropdown_items.extend([item.to_dict() for item in self.site_dropdown])
|
461
463
|
elif self.site_dropdown_items:
|
462
464
|
dropdown_items.extend(self.site_dropdown_items)
|
463
|
-
|
465
|
+
|
464
466
|
if dropdown_items:
|
465
467
|
unfold_settings["SITE_DROPDOWN"] = dropdown_items
|
466
|
-
|
468
|
+
|
467
469
|
# Add tabs if configured
|
468
470
|
if self.tab_configurations:
|
469
471
|
unfold_settings["TABS"] = self.tab_configurations
|
470
|
-
|
472
|
+
|
471
473
|
# Command interface - Enhanced for better UX
|
472
474
|
unfold_settings["COMMAND"] = {
|
473
475
|
"search_models": True,
|
@@ -478,38 +480,39 @@ class UnfoldConfig(BaseModel):
|
|
478
480
|
# Inject universal CSS variables and custom styles
|
479
481
|
if "STYLES" not in unfold_settings:
|
480
482
|
unfold_settings["STYLES"] = []
|
481
|
-
|
483
|
+
|
482
484
|
# Add our CSS as inline data URI
|
483
485
|
try:
|
484
|
-
from ..tailwind import get_css_variables, get_modal_fix_css
|
485
486
|
import base64
|
486
|
-
|
487
|
+
|
488
|
+
from ..tailwind import get_css_variables, get_modal_fix_css
|
489
|
+
|
487
490
|
# Base CSS variables
|
488
491
|
css_content = get_css_variables()
|
489
|
-
|
492
|
+
|
490
493
|
# Add modal scroll fix CSS
|
491
494
|
css_content += get_modal_fix_css()
|
492
|
-
|
495
|
+
|
493
496
|
css_b64 = base64.b64encode(css_content.encode('utf-8')).decode('utf-8')
|
494
497
|
data_uri = f"data:text/css;base64,{css_b64}"
|
495
498
|
unfold_settings["STYLES"].append(lambda request: data_uri)
|
496
499
|
except ImportError:
|
497
500
|
pass
|
498
|
-
|
501
|
+
|
499
502
|
return {"UNFOLD": unfold_settings}
|
500
503
|
|
501
504
|
|
502
505
|
class UnfoldDashboardConfig(BaseModel):
|
503
506
|
"""Complete Unfold dashboard configuration."""
|
504
507
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
505
|
-
|
508
|
+
|
506
509
|
# Site branding
|
507
510
|
site_title: str = Field(default="Admin Dashboard", description="Site title")
|
508
|
-
site_header: str = Field(default="Admin", description="Site header")
|
511
|
+
site_header: str = Field(default="Admin", description="Site header")
|
509
512
|
site_subheader: str = Field(default="Management Interface", description="Site subheader")
|
510
513
|
site_url: str = Field(default="/", description="Site URL")
|
511
514
|
site_symbol: str = Field(default=Icons.ADMIN_PANEL_SETTINGS, description="Site icon")
|
512
|
-
|
515
|
+
|
513
516
|
# UI settings
|
514
517
|
show_history: bool = Field(default=True, description="Show history")
|
515
518
|
show_view_on_site: bool = Field(default=True, description="Show view on site")
|
@@ -517,29 +520,29 @@ class UnfoldDashboardConfig(BaseModel):
|
|
517
520
|
theme: Optional[str] = Field(default=None, description="Theme (light/dark) or None for theme switcher")
|
518
521
|
show_languages: bool = Field(default=False, description="Show language switcher")
|
519
522
|
show_theme_switcher: bool = Field(default=True, description="Show theme switcher (requires theme=None)")
|
520
|
-
|
523
|
+
|
521
524
|
# Callbacks
|
522
525
|
dashboard_callback: Optional[str] = Field(None, description="Dashboard callback path")
|
523
526
|
environment_callback: Optional[str] = Field(None, description="Environment callback path")
|
524
|
-
|
527
|
+
|
525
528
|
# Navigation configuration
|
526
529
|
navigation_sections: List[NavigationSection] = Field(
|
527
|
-
default_factory=list,
|
530
|
+
default_factory=list,
|
528
531
|
description="Navigation sections"
|
529
532
|
)
|
530
|
-
|
531
|
-
# Site dropdown configuration
|
533
|
+
|
534
|
+
# Site dropdown configuration
|
532
535
|
site_dropdown_items: List[SiteDropdownItem] = Field(
|
533
536
|
default_factory=list,
|
534
537
|
description="Site dropdown items"
|
535
538
|
)
|
536
|
-
|
539
|
+
|
537
540
|
# Tab configurations
|
538
541
|
tab_configurations: List[TabConfiguration] = Field(
|
539
542
|
default_factory=list,
|
540
543
|
description="Tab configurations"
|
541
544
|
)
|
542
|
-
|
545
|
+
|
543
546
|
def to_unfold_dict(self) -> Dict[str, Any]:
|
544
547
|
"""Convert to Unfold configuration dictionary."""
|
545
548
|
base_config = {
|
@@ -553,7 +556,7 @@ class UnfoldDashboardConfig(BaseModel):
|
|
553
556
|
"SHOW_BACK_BUTTON": self.show_back_button,
|
554
557
|
"SHOW_LANGUAGES": self.show_languages,
|
555
558
|
}
|
556
|
-
|
559
|
+
|
557
560
|
# Theme configuration: None enables theme switcher, string value forces theme
|
558
561
|
if self.show_theme_switcher and self.theme is None:
|
559
562
|
# Don't set THEME key - this enables theme switcher
|
@@ -561,31 +564,31 @@ class UnfoldDashboardConfig(BaseModel):
|
|
561
564
|
else:
|
562
565
|
# Set specific theme - this disables theme switcher
|
563
566
|
base_config["THEME"] = self.theme
|
564
|
-
|
567
|
+
|
565
568
|
# Add callbacks if configured
|
566
569
|
if self.dashboard_callback:
|
567
570
|
base_config["DASHBOARD_CALLBACK"] = self.dashboard_callback
|
568
|
-
|
571
|
+
|
569
572
|
if self.environment_callback:
|
570
573
|
base_config["ENVIRONMENT"] = self.environment_callback
|
571
|
-
|
574
|
+
|
572
575
|
# Sidebar configuration
|
573
576
|
sidebar_config = {
|
574
577
|
"show_search": True,
|
575
578
|
"command_search": True,
|
576
579
|
"show_all_applications": True,
|
577
580
|
}
|
578
|
-
|
581
|
+
|
579
582
|
# Convert navigation sections
|
580
583
|
if self.navigation_sections:
|
581
584
|
sidebar_config["navigation"] = [section.to_dict() for section in self.navigation_sections]
|
582
|
-
|
585
|
+
|
583
586
|
base_config["SIDEBAR"] = sidebar_config
|
584
|
-
|
587
|
+
|
585
588
|
# Convert site dropdown
|
586
589
|
if self.site_dropdown_items:
|
587
590
|
base_config["SITE_DROPDOWN"] = [item.to_dict() for item in self.site_dropdown_items]
|
588
|
-
|
591
|
+
|
589
592
|
# Convert tabs
|
590
593
|
if self.tab_configurations:
|
591
594
|
tabs = []
|
@@ -599,11 +602,11 @@ class UnfoldDashboardConfig(BaseModel):
|
|
599
602
|
if item.permission:
|
600
603
|
tab_item["permission"] = item.permission
|
601
604
|
tab_items.append(tab_item)
|
602
|
-
|
605
|
+
|
603
606
|
tabs.append({
|
604
607
|
"models": tab.models,
|
605
608
|
"items": tab_items,
|
606
609
|
})
|
607
610
|
base_config["TABS"] = tabs
|
608
|
-
|
611
|
+
|
609
612
|
return base_config
|
@@ -4,14 +4,15 @@ Dashboard Components Models for Unfold
|
|
4
4
|
Pydantic models for dashboard components like stat cards, health items, etc.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
8
|
-
|
7
|
+
from typing import Any, Dict, List, Literal, Optional
|
8
|
+
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, computed_field
|
9
10
|
|
10
11
|
|
11
12
|
class StatCard(BaseModel):
|
12
13
|
"""Dashboard statistics card model."""
|
13
14
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
14
|
-
|
15
|
+
|
15
16
|
title: str = Field(..., description="Card title")
|
16
17
|
value: str = Field(..., description="Main value to display")
|
17
18
|
icon: str = Field(..., description="Material icon name")
|
@@ -19,7 +20,7 @@ class StatCard(BaseModel):
|
|
19
20
|
change_type: Literal["positive", "negative", "neutral"] = Field(default="neutral", description="Change type")
|
20
21
|
description: Optional[str] = Field(None, description="Additional description")
|
21
22
|
color: str = Field("primary", description="Card color theme")
|
22
|
-
|
23
|
+
|
23
24
|
@computed_field
|
24
25
|
@property
|
25
26
|
def css_classes(self) -> Dict[str, str]:
|
@@ -29,7 +30,7 @@ class StatCard(BaseModel):
|
|
29
30
|
"negative": "text-red-600 bg-red-100 dark:bg-red-900/20 dark:text-red-400",
|
30
31
|
"neutral": "text-slate-600 bg-slate-100 dark:bg-slate-700 dark:text-slate-400"
|
31
32
|
}
|
32
|
-
|
33
|
+
|
33
34
|
def to_dict(self) -> Dict[str, Any]:
|
34
35
|
"""Convert to dictionary for Unfold dashboard widgets."""
|
35
36
|
return {
|
@@ -46,33 +47,33 @@ class StatCard(BaseModel):
|
|
46
47
|
class SystemHealthItem(BaseModel):
|
47
48
|
"""System health status item."""
|
48
49
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
49
|
-
|
50
|
+
|
50
51
|
component: str = Field(..., description="Component name")
|
51
52
|
status: Literal["healthy", "warning", "error", "unknown"] = Field(..., description="Health status")
|
52
53
|
description: str = Field(..., description="Status description")
|
53
54
|
last_check: str = Field(..., description="Last check time")
|
54
55
|
health_percentage: Optional[int] = Field(None, description="Health percentage (0-100)")
|
55
|
-
|
56
|
+
|
56
57
|
@computed_field
|
57
58
|
@property
|
58
59
|
def icon(self) -> str:
|
59
60
|
"""Get icon based on component type."""
|
60
61
|
icons = {
|
61
62
|
"database": "storage",
|
62
|
-
"cache": "memory",
|
63
|
+
"cache": "memory",
|
63
64
|
"queue": "queue",
|
64
65
|
"storage": "folder",
|
65
66
|
"api": "api",
|
66
67
|
}
|
67
68
|
return icons.get(self.component.lower(), "info")
|
68
|
-
|
69
|
+
|
69
70
|
@computed_field
|
70
71
|
@property
|
71
72
|
def status_icon(self) -> str:
|
72
73
|
"""Get status icon."""
|
73
74
|
icons = {
|
74
75
|
"healthy": "check_circle",
|
75
|
-
"warning": "warning",
|
76
|
+
"warning": "warning",
|
76
77
|
"error": "error",
|
77
78
|
"unknown": "help"
|
78
79
|
}
|
@@ -82,7 +83,7 @@ class SystemHealthItem(BaseModel):
|
|
82
83
|
class QuickAction(BaseModel):
|
83
84
|
"""Quick action button model."""
|
84
85
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
85
|
-
|
86
|
+
|
86
87
|
title: str = Field(..., description="Action title")
|
87
88
|
description: str = Field(..., description="Action description")
|
88
89
|
icon: str = Field(..., description="Material icon name")
|
@@ -128,7 +129,7 @@ class DashboardWidget(BaseModel):
|
|
128
129
|
callback: Optional[str] = Field(None, description="Callback function path")
|
129
130
|
width: int = Field(12, description="Widget width (1-12)")
|
130
131
|
order: int = Field(0, description="Widget order")
|
131
|
-
|
132
|
+
|
132
133
|
def to_dict(self) -> Dict[str, Any]:
|
133
134
|
"""Convert to dictionary for Unfold dashboard widgets."""
|
134
135
|
return {
|
@@ -143,11 +144,11 @@ class DashboardWidget(BaseModel):
|
|
143
144
|
class StatsCardsWidget(BaseModel):
|
144
145
|
"""Stats cards widget for dashboard."""
|
145
146
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
146
|
-
|
147
|
+
|
147
148
|
type: Literal["stats_cards"] = Field(default="stats_cards", description="Widget type")
|
148
149
|
title: str = Field(..., description="Widget title")
|
149
150
|
cards: List[StatCard] = Field(default_factory=list, description="Statistics cards")
|
150
|
-
|
151
|
+
|
151
152
|
def to_dict(self) -> Dict[str, Any]:
|
152
153
|
"""Convert to dictionary for Unfold dashboard widgets."""
|
153
154
|
return {
|
@@ -179,20 +180,20 @@ class ChartData(BaseModel):
|
|
179
180
|
class DashboardData(BaseModel):
|
180
181
|
"""Main dashboard data container."""
|
181
182
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
182
|
-
|
183
|
+
|
183
184
|
# Statistics cards
|
184
185
|
stat_cards: List[StatCard] = Field(default_factory=list, description="Dashboard statistics cards")
|
185
|
-
|
186
|
+
|
186
187
|
# System health
|
187
188
|
system_health: List[SystemHealthItem] = Field(default_factory=list, description="System health items")
|
188
|
-
|
189
|
+
|
189
190
|
# Quick actions
|
190
191
|
quick_actions: List[QuickAction] = Field(default_factory=list, description="Quick action buttons")
|
191
|
-
|
192
|
+
|
192
193
|
# Additional data
|
193
194
|
last_updated: str = Field(..., description="Last update timestamp")
|
194
195
|
environment: str = Field("development", description="Current environment")
|
195
|
-
|
196
|
+
|
196
197
|
@computed_field
|
197
198
|
@property
|
198
199
|
def total_users(self) -> int:
|
@@ -4,15 +4,17 @@ Site Dropdown Models for Unfold Dashboard
|
|
4
4
|
Pydantic models for site dropdown menu items.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
8
|
-
|
7
|
+
from typing import Callable, Union
|
8
|
+
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, computed_field
|
10
|
+
|
9
11
|
from ..utils import auto_resolve_url
|
10
12
|
|
11
13
|
|
12
14
|
class SiteDropdownItem(BaseModel):
|
13
15
|
"""Site dropdown menu item configuration with automatic URL resolution."""
|
14
16
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
15
|
-
|
17
|
+
|
16
18
|
title: str = Field(..., min_length=1, description="Menu item title")
|
17
19
|
icon: str = Field(..., min_length=1, description="Material icon name")
|
18
20
|
link: str = Field(..., min_length=1, description="Link URL or URL name")
|
@@ -28,7 +30,7 @@ class SiteDropdownItem(BaseModel):
|
|
28
30
|
def get_link_for_unfold(self):
|
29
31
|
"""Get the link in the format expected by Unfold."""
|
30
32
|
return self.resolved_link
|
31
|
-
|
33
|
+
|
32
34
|
def to_dict(self) -> dict:
|
33
35
|
"""Convert to dictionary for Unfold admin."""
|
34
36
|
return {
|